Skip to content

Protocol

Health data·

Heart rate, SpO₂, temperature, steps, sleep and health records — item layouts, the day-history dance, and the cradle artefacts to ignore.

  • hackers and protocol readers
  • 2 min read
  • 296 words

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.