python/polar.html 2022-11-14
Polar
Here is an example reading the Polar OH1 heart rate sensor from python
Python, with the pygatt library
#!/usr/bin/env python3
import pygatt
#import logging
#logging.basicConfig()
#logging.getLogger('pygatt').setLevel(logging.DEBUG)
address = "A0:9E:1A:71:96:37"
model_uid = "00002a24-0000-1000-8000-00805f9b34fb"
battery_uid = "00002a19-0000-1000-8000-00805f9b34fb"
heartbeat_uid = "00002a37-0000-1000-8000-00805f9b34fb"
#adapter = pygatt.BGAPIBackend() # for bluegiga dongle on all os'ses
adapter = pygatt.GATTToolBackend() # for posix compliant os'ses
try:
adapter.start()
device = adapter.connect(address, timeout=15)
model = device.char_read(model_uid).decode("utf-8")
battery = device.char_read(battery_uid)[0]
print("device: {:s}, battery {:d}%, press enter to stop recording heart rate".format(model, battery))
device.subscribe(heartbeat_uid, callback=lambda handle, value: print("\r{:d} bpm ".format(value[1]), end=""))
input()
finally:
adapter.stop()
Python, with the bleak library (os agnostic)
#!/usr/bin/env python3
import asyncio
from bleak import BleakClient
address = "A0:9E:1A:71:96:37"
model_uid = "00002a24-0000-1000-8000-00805f9b34fb"
battery_uid = "00002a19-0000-1000-8000-00805f9b34fb"
heartbeat_uid = "00002a37-0000-1000-8000-00805f9b34fb"
running = True
async def run(address):
async with BleakClient(address) as client:
model = await client.read_gatt_char(model_uid)
model = model.decode("utf-8")
battery = await client.read_gatt_char(battery_uid)
battery = battery[0]
print("device: {:s}, battery: {:d}%, press enter to stop".format(model, battery))
await client.start_notify(heartbeat_uid, lambda sender, data: print("\r{:d} bpm ".format(data[1]), end=""))
while await client.is_connected()i and running:
await asyncio.sleep(1)
#asyncio.run(run(address)) # event based
threading.Thread(target=asyncio.run, args=(run(address),)).start() # mix of paradigms: event loop in background
input()
running=False
From the command line
sudo hcitool lescan # get the device address sudo gatttool -b A0:9E:1A:71:96:37 -I connect primary #attr handle: 0x0026, end grp handle: 0x0029 uuid: 0000180d-0000-1000-8000-00805f9b34fb #attr handle: 0x002a, end grp handle: 0x002d uuid: 0000180f-0000-1000-8000-00805f9b34fb char-desc 0x0026 0x0029 #handle: 0x0028, uuid: 00002a37-0000-1000-8000-00805f9b34fb #handle: 0x0029, uuid: 00002902-0000-1000-8000-00805f9b34fb char-write-req 0x0029 0100 #Notification handle = 0x0028 value: 00 53 char-write-req 0x0029 0000
As a class
gitlabH10
H1: [NEW] Device C1:B6:3B:5B:BB:19 Polar H10 83917628