Following on from #56 : Detection works now, the ring pairs and syncs fine.
This is a separate problem.
On my Ale-Hop2211 E1C7 (YCBT, ColmiSmartHealthCoordinator), a spot heart rate measurement always ends with :
"Couldn't get a steady reading. Keep the ring snug and your hand still, then try again.",
and the card then shows 46 bpm, Resting 46 · Peak 46, which was never my heart rate.
SpO2 on the same ring works fine (96%).
What the ring actually does :
I instrumented the BLE stream with a Python client.
Started the measurement with 03 2f {01 00}, sent no stop command, and logged every frame with timestamps:
t+ 0.1s 03 2f reply: 00 (accepted)
t+14.1s 47 bpm
t+15.1s 47 bpm
t+16.1s 47 bpm
t+22.1s 46 bpm
t+23.1s 46 bpm
t+24.1s 46 bpm
t+26.1s 84 bpm
t+27.1s 84 bpm
t+28.1s 84 bpm
t+32.1s 82 bpm
t+33.1s 81 bpm
t+34.1s 81 bpm
t+35.1s 81 bpm
t+35.1s 04 0e {00 01} <- ring ends the measurement itself
So the measurement succeeds, in about 35 seconds, well inside the 173 s window the app allows.
The ring emits 04 0e with {sensor 0x00, status 0x01} when it's done, and stops streaming.
Samples arrive in bursts of three, a few seconds apart.
The PPG takes roughly 26 seconds to converge. Everything before that is warm-up, and on this ring the warm-up sits around 46–47.
What I think the app is doing :
Two things, either of which alone would produce what I see :
- It keeps an early sample rather than the last one. The displayed 46 is a warm-up value from t+22–24 s. The final reading was 81.
- It doesn't appear to act on
04 0e. The ring goes quiet at 35 s, the app keeps waiting, and at the end of its window reports that the reading was never steady.
The error message is a bit unlucky here: the warm-up values are extremely stable (47 47 47, then 46 46 46), so a stability heuristic will happily accept them unless warm-up is discarded explicitly.
Suggestion :
Treat 04 0e with status 01 as the completion signal, and take the last value received before it rather than the first stable one.
If a floor is wanted, discarding samples before the first significant jump would work. The warm-up-to-real transition on this ring is a clean step from 46 to 84.
I don't know whether the 26 s convergence and the 35 s self-termination are consistent across YCBT rings or specific to this one, so a fixed threshold is probably worse than reacting to 04 0e.
Happy to run more captures or test a build.
I still have the ring and the client.
Following on from #56 : Detection works now, the ring pairs and syncs fine.
This is a separate problem.
On my
Ale-Hop2211 E1C7(YCBT,ColmiSmartHealthCoordinator), a spot heart rate measurement always ends with :"Couldn't get a steady reading. Keep the ring snug and your hand still, then try again.",
and the card then shows
46 bpm,Resting 46 · Peak 46, which was never my heart rate.SpO2 on the same ring works fine (96%).
What the ring actually does :
I instrumented the BLE stream with a Python client.
Started the measurement with
03 2f {01 00}, sent no stop command, and logged every frame with timestamps:So the measurement succeeds, in about 35 seconds, well inside the 173 s window the app allows.
The ring emits
04 0ewith{sensor 0x00, status 0x01}when it's done, and stops streaming.Samples arrive in bursts of three, a few seconds apart.
The PPG takes roughly 26 seconds to converge. Everything before that is warm-up, and on this ring the warm-up sits around 46–47.
What I think the app is doing :
Two things, either of which alone would produce what I see :
04 0e. The ring goes quiet at 35 s, the app keeps waiting, and at the end of its window reports that the reading was never steady.The error message is a bit unlucky here: the warm-up values are extremely stable (47 47 47, then 46 46 46), so a stability heuristic will happily accept them unless warm-up is discarded explicitly.
Suggestion :
Treat
04 0ewith status01as the completion signal, and take the last value received before it rather than the first stable one.If a floor is wanted, discarding samples before the first significant jump would work. The warm-up-to-real transition on this ring is a clean step from 46 to 84.
I don't know whether the 26 s convergence and the 35 s self-termination are consistent across YCBT rings or specific to this one, so a fixed threshold is probably worse than reacting to
04 0e.Happy to run more captures or test a build.
I still have the ring and the client.