Skip to content

Spot heart rate never completes on a YCBT ring: warm-up value kept, completion event ignored #59

Description

@Albabit

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 :

  1. 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.
  2. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions