Skip to main content

Bluetooth SIG Standards Library

Coverage Status Python 3.10+ PyPI version License: MIT Documentation

A pure Python library for Bluetooth SIG standards interpretation, providing comprehensive GATT characteristic, service, and advertisement parsing with automatic UUID resolution.

📚 Full Documentation | 🚀 Quick Start | 📖 API Reference

Features

  • ✅ Standards-Based: Official Bluetooth SIG YAML registry with automatic UUID resolution
  • ✅ Type-Safe: Characteristic classes provide compile-time type checking; UUID strings return dynamic types
  • ✅ Modern Python: msgspec-based design with Python 3.10+ compatibility
  • ✅ Comprehensive: 500+ assigned SIG characteristic UUIDs with ~96% Python parser coverage (see scripts/gatt_coverage_report.py)
  • ✅ Flexible Validation: Enable/disable validation per-characteristic for testing or debugging
  • ✅ Framework Agnostic: Works with any BLE library (bleak, simplepyble, etc.)

Installation

pip install bluetooth-sig

Quick Start

Type-Safe Parsing (recommended for known devices):

from bluetooth_sig.gatt.characteristics import (
    BatteryLevelCharacteristic,
    HeartRateMeasurementCharacteristic,
)

# Simple: IDE infers return type as int
battery = BatteryLevelCharacteristic()
level = battery.parse_value(bytearray([85]))
print(f"Battery: {level}%")  # Battery: 85%

# Encode value back to bytes
encoded = battery.build_value(85)

# Complex: IDE infers HeartRateData with full autocomplete
heart_rate = HeartRateMeasurementCharacteristic()
hr_data = heart_rate.parse_value(bytearray([0x00, 72]))
print(f"{hr_data.heart_rate} bpm")  # 72 bpm
print(f"Sensor contact: {hr_data.sensor_contact}")

Dynamic Parsing (for scanning unknown devices):

from bluetooth_sig import BluetoothSIGTranslator

translator = BluetoothSIGTranslator()

# Parse by UUID - returns the parsed value directly
result = translator.parse_characteristic("2A19", bytearray([85]))
print(f"Battery Level: {result}%")  # Battery Level: 85%

# Identify unknown UUIDs from device discovery
discovered_uuids = ["2A19", "2A6E", "2A37"]  # Example UUIDs
for uuid in discovered_uuids:
    if translator.supports(uuid):
        info = translator.get_characteristic_info_by_uuid(uuid)
        print(f"Found: {info.name}")

Library Capabilities

Feature Description
Characteristic Parsing Decode/encode 500+ assigned SIG characteristics (~96% parser coverage) with type safety
Service Validation Check device compliance against SIG service specifications
Advertising Parsing Extract device name, service UUIDs, manufacturer data from PDUs
Device Abstraction High-level API combining connection management, parsing, and caching

See API Overview for detailed guidance.

Usage Examples

For applications, use the Device class for connection management and type-safe reads:

# SKIP: Requires actual BLE device connection
from bluetooth_sig import BluetoothSIGTranslator, Device
from bluetooth_sig.gatt.characteristics import BatteryLevelCharacteristic

# Connection manager from examples - use for your BLE backend
from examples.connection_managers.bleak_retry import BleakRetryClientManager


async def main():
    translator = BluetoothSIGTranslator()
    device = Device(BleakRetryClientManager("AA:BB:CC:DD:EE:FF"), translator)

    await device.connect()

    # Type-safe: IDE knows battery is int
    battery = await device.read(BatteryLevelCharacteristic)
    print(f"Battery: {battery}%")

    await device.disconnect()

Direct Characteristic Classes

When you know the characteristic type, use the class directly for full type inference:

from bluetooth_sig.gatt.characteristics import HeartRateMeasurementCharacteristic

# Complex: structured dataclass with autocompletion
heart_rate = HeartRateMeasurementCharacteristic()
hr_data = heart_rate.parse_value(bytearray([0x00, 72]))  # IDE infers HeartRateData
print(f"{hr_data.heart_rate} bpm")
encoded = heart_rate.build_value(hr_data)

Translator API (Device Scanning)

For scanning unknown devices or working with UUID strings:

from bluetooth_sig import BluetoothSIGTranslator

translator = BluetoothSIGTranslator()

# Discover and parse any characteristic by UUID
for char in client.services.characteristics:
    uuid_str = str(char.uuid)
    if translator.supports(uuid_str):
        raw_data = await client.read_gatt_char(uuid_str)  # SKIP: async
        parsed = translator.parse_characteristic(uuid_str, raw_data)
        info = translator.get_characteristic_info_by_uuid(uuid_str)
        print(f"{info.name}: {parsed}")  # parsed is the value directly (Any)
    else:
        print(f"Unknown characteristic UUID: {uuid_str}")

You can also pass a characteristic class to the translator for type-safe parsing:

from bluetooth_sig import BluetoothSIGTranslator
from bluetooth_sig.gatt.characteristics import TemperatureMeasurementCharacteristic

translator = BluetoothSIGTranslator()
raw_data = bytearray([0x00, 0xE4, 0x00, 0x00, 0x00])

# Type-safe via translator: IDE infers TemperatureMeasurementData
temp = translator.parse_characteristic(TemperatureMeasurementCharacteristic, raw_data)
print(f"{temp.temperature}°C")

Device Abstraction

Combines connection management with type-safe operations:

# SKIP: Requires connection manager implementation
from bluetooth_sig.device import Device
from bluetooth_sig.gatt.characteristics import HumidityCharacteristic

device = Device(connection_manager, translator)
await device.connect()

# Type-safe: IDE infers float from characteristic class
humidity = await device.read(HumidityCharacteristic)
print(f"Humidity: {humidity}%")

# Dynamic: returns Any when using enum/string
from bluetooth_sig.types.gatt_enums import CharacteristicName
result = await device.read(CharacteristicName.TEMPERATURE)

→ See comprehensive usage guide for real-world patterns, batch parsing, and validation control.

What This Library Does

Enables high-level Bluetooth applications without low-level expertise:

  • ✅ UUID abstraction - Resolves unknown UUIDs to characteristic types; provides enum/class access for known characteristics
  • ✅ Automatic encoding/decoding - Converts between raw bytes and typed Python objects using standards-compliant parsing
  • ✅ Type-safe data structures - Returns structured data objects instead of raw byte arrays (e.g., VectorData, TemperatureMeasurement)
  • ✅ Framework-agnostic design - Works with any BLE library (bleak, simplepyble, etc.) using a common connection manager interface
  • ✅ Standards-based parsing - 500+ assigned SIG characteristics with parsers for ~96% of UUIDs per coverage report
  • ✅ Extensible - Supports custom characteristics and services with the same type-safe patterns

What This Library Does NOT Do

  • ❌ BLE transport layer - Requires a BLE library (bleak, simplepyble, etc.); but this lib provides Device class abstraction over these libraries
  • ❌ Firmware implementation - Client-side parsing and encoding only

Learn more about what problems this solves →

Integration with BLE Libraries

Quick integration with any BLE library using the translator directly:

# SKIP: Requires BLE hardware and connection setup
from bleak import BleakClient
from bluetooth_sig import BluetoothSIGTranslator
from bluetooth_sig.types.gatt_enums import CharacteristicName

translator = BluetoothSIGTranslator()

# Get UUID from characteristic name (do once, reuse)
battery_uuid = translator.get_characteristic_uuid_by_name(CharacteristicName.BATTERY_LEVEL)

async with BleakClient(address) as client:
    # Read: bleak handles connection, bluetooth-sig handles parsing
    raw_data = await client.read_gatt_char(str(battery_uuid))
    level = translator.parse_characteristic(str(battery_uuid), raw_data)
    print(f"Battery: {level}%")

    # Write: bluetooth-sig handles encoding, bleak handles transmission
    data = translator.encode_characteristic(str(battery_uuid), 85)
    await client.write_gatt_char(str(battery_uuid), data)

Recommended: Implement the connection manager interface to use the Device class for BLE-library-agnostic design.

→ See BLE integration guide for connection manager implementation examples with bleak, bleak-retry-connector, and simplepyble.

Supported Characteristics

500+ assigned SIG characteristic UUIDs (~96% with Python parsers) across multiple categories:

  • Battery Service: Level, Power State
  • Environmental Sensing: Temperature, Humidity, Pressure, Air Quality
  • Health Monitoring: Heart Rate, Blood Pressure, Glucose
  • Fitness Tracking: Running/Cycling Speed, Cadence, Power
  • Device Information: Manufacturer, Model, Firmware Version
  • And many more...

View full list of supported services →

Documentation

Contributing

Contributions are welcome! Please see the Contributing Guide for details.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Metadata

Release files for bluetooth-sig 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bluetooth-sig 0.6.0
File Size Uploaded
bluetooth_sig-0.6.0.tar.gz 885.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bluetooth-sig 0.6.0
File Interpreter ABI Platform
bluetooth_sig-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 2.9 MB

Release files / bluetooth_sig-0.6.0.tar.gz

Download URL bluetooth_sig-0.6.0.tar.gz
Size 885.2 kB
Tags Source
SHA-256 checksum
How to use checksums
3415188a65bce7abe8c141a1633d83391091b8217a06ec399f4cd125c3efed5c
BLAKE2b-256 checksum
How to use checksums
cc637f676a0dfda498864469bd272dfd088abb748a8e2aedfd9f4db32cd5edd5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 28, 2026.

Transparency log

Release files / bluetooth_sig-0.6.0-py3-none-any.whl

Download URL bluetooth_sig-0.6.0-py3-none-any.whl
Size 2.0 MB
Tags Python 3
SHA-256 checksum
How to use checksums
7e803dc74fa1302fd0b04a9e61d7762a8663f381639d2af454f5fc5bb6b76a5b
BLAKE2b-256 checksum
How to use checksums
037cfd7cfd404d1745572a17afc4d31be45513a2271a9d03004cc9a4d5e5e801
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 28, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page