Protocol
Health data·
Heart rate, SpO₂, temperature, steps, sleep and health records — item layouts, the day-history dance, and the cradle artefacts to ignore.
In 10 seconds
Vitals arrive two ways: live ticks while a session is open (HR cmd 11 every ~5 s, SpO₂ cmd 24) and history items pulled per day (steps 33, sleep 34, records 36 — each closed by a terminator 42/43/45). No ticks in 30 s = not worn; readings on the charger (HR 80–103, 31 °C) are the cradle.
Live heart rate·
sequenceDiagram
participant H as host
participant R as ring
H->>R: 7 open
loop every ~5 s while a finger is in
R-->>H: 11 ts6 · hr u8
end
R-->>H: 17 session ended
H->>R: 8 close
R-->>H: 8 echo
→ cmd 7 open
← cmd 11 ts6, hr u8 one tick every ~5 s while the finger is in
← cmd 17 (empty) the ring ended the session (LoraFit never saw this; found live)
→ cmd 8 close (echoed)
No ticks = not on a finger — the only wear signal the ring offers. Each live measurement also writes a health record (cmd 36 item) on the ring.
Everything else, per metric·
| metric | live | history item (per day, day 0 = today) |
notes |
|---|---|---|---|
| SpO₂ | 23 01 starts → 24 ticks ts6, spo2 u8; 25 = ended without value [CAPTURE] |
in records | cradle / off finger → 25 and nothing else |
| skin temperature | 20/21 exist in the APK, unused on this ring | in records, tenths of °C | ~31 °C on the charger is the cradle |
| steps · kcal · distance | 29 snapshot ts6, steps u32, kcal u16, distance_m u16 |
33 → 16 B ts6, duration_s u16, steps u32, kcal u16, distance u16, FF-filled = end, terminator 42 |
pushed on connect |
| sleep | — | 34 → 8 B ts6 bucket-end, quality u8, motion u8, 300 s buckets, terminator 43 |
quality/motion → stage mapping is provisional; sessions < 10 min ignored |
| health records | — | 36 → 14 B ts6, hr u8, spo2 u8, temp i16 tenths, u32 unused, terminator 45 |
written after each live HR and on the auto-HR schedule (cmd 30, 5 min) |
Cradle artefact
With charging = 1 the ring keeps filling sleep buckets and records (HR 80–103, 31 °C). Skip day-0 sleep while
charging and tag vitals charging — the bridge and the gateways do; the platform excludes them from summaries.
The day-history dance — the request order that never loses a terminator
→ 33 day ← 33 items… ← 42 ts6(day 00:00)
→ 34 day ← 34 items… ← 43 ts6 (today: items may come with NO 43 → idle-close 3 s)
→ 36 day ← 36 items… ← 45 ts6
Wait for each terminator before the next request; pacing alone once lost a 43. An empty day is just the terminator.
What leaves the driver — one row per value for /api/health/ingest — is defined in tiny → Health platform.