#!/usr/bin/env python3 """Discover BLE services and characteristics of WP sensor""" import asyncio from bleak import BleakClient, BleakScanner async def main(): print("Scanning for WP sensors...") devices = await BleakScanner.discover(timeout=5.0) wp_device = None for d in devices: if d.name and d.name.startswith("WP_"): print(f"Found: {d.name} ({d.address})") wp_device = d break if not wp_device: print("No WP sensor found!") return print(f"\nConnecting to {wp_device.name}...") async with BleakClient(wp_device.address) as client: print("Connected!") print(f"MTU: {client.mtu_size}") print("\n=== Services and Characteristics ===\n") for service in client.services: print(f"Service: {service.uuid}") print(f" Description: {service.description}") for char in service.characteristics: props = ", ".join(char.properties) print(f" Characteristic: {char.uuid}") print(f" Properties: {props}") print(f" Handle: {char.handle}") # Try to read if readable if "read" in char.properties: try: value = await client.read_gatt_char(char.uuid) try: decoded = value.decode('utf-8', errors='replace') print(f" Value: {decoded}") except: print(f" Value (hex): {value.hex()}") except Exception as e: print(f" (Could not read: {e})") print() if __name__ == "__main__": asyncio.run(main())