Skip to content

Protocol

Time·

How the ring keeps time: 6-byte local-epoch seconds, the set-time echo, and what that means for UTC.

  • hackers and protocol readers
  • 1 min read
  • 173 words

In 10 seconds

The ring knows no time zones: every stamp is local wall-clock seconds in a 6-byte LE field (ts6). utc = ts6 − tz_offset of whoever set the clock. Audio packets carry a counter seeded with the start time, not per-packet stamps. ring-cli settime

0x6aae7eb7 → 1789818551 → 2026-09-19 11:27:51  *local*

(BleCommonUtils.deviceTimestampToUtcTimestamp in the APK does exactly this.)

Setting the clock·

→ cmd 1   ts6 + 00
← cmd 1   year u16, month u8, day u8, hour u8, min u8, sec u8     (decoded echo)

LoraFit, ring-cli handshake and the gateways set the time on every connect; history pulled before that carries whatever drift the ring accumulated.

Where time shows up·

where field notes
live ticks (11, 24, 21) ts6 ring clock at the tick
history items (33/34/36) ts6 34 = bucket end, minute :59 style; 33 = bucket start
terminators (42/43/45) ts6 00:00 of the requested day
audio packets (0x32–0x34) u32 ring clock at recording start, then +1 per packet — a counter, not a per-packet stamp
health platform ISO-8601 UTC the gateway converts once, with its own zone

A memo's real start is packet 1's value; its length is packets × 240 ms, not the counter span.