Featured image of post Analyzing data from Colmi smart rings

Analyzing data from Colmi smart rings

I got my hands (and fingers) on a Colmi R10/R02 smart ring. It is possible to combine collection of health data with data privacy.

Colmi smart rings

A while ago, I looked around for smart rings and their data privacy levels, and in terms of “data sovereignty”. Quickly, I found discussions about the Colmi R02 smart ring and compatible models. They cost between 20-80 EUR shipped, depending on model, shop, and shipping and custom fees. During an internal discussion I mentioned what I was doing and, to my surprise, was offered a Colmi R10 by a person close to me. That person had ordered one some weeks ago, but it did not fit. Few days later I had “my ring” ๐Ÿ’, free of charge…

The Colmi R02 family of smart rings all have similar capabilities. They measure heart rate, SpO2 (blood oxygen), stress level, steps taken, sleep lengths and phases, heart rate variability (HRV). Some models can also take body temperature, or have a small display on the ring. And of course you can get device information like model number, firmware release, and battery status.

Personally, I was not too interested in tracking myself and my “health & activity status”, but in operating a smart device without being tracked, and what kind of data and in which quality is available. Moreover, could a device be operated without the vendor app, making it an “independent” and more “sustainable” device?

Gadgetbridge

The smart rings are supported by an official iOS and Android app named QRing App. An advantage of the Colmi smart rings is that you don’t need to use the official ring to get to your data, not even for registration. Other devices require the official app to register the device, extract some authentication data / tokens. The open source Android app Gadgetbridge supports the Colmi smart rings with most features, firmware updates cannot be performed yet.

As you can see below, I could connect my R10 ring with my phone and synchronize the data.

Gadgetbridge connect to Colmi ring

After the data is downloaded to the phone, Gadgetbridge offers a dashboard with several diagrams, data points, etc. Here is a screenshot with information about steps taken.

Step data in Gadgetbridge

Everything works as it should. Could I have stopped here? Yes, but I wanted to get close to “my data”.

Python-based CLI tool

Having a smartphone app to sync my data out of the ring is ok, it works. However, I wanted to have even more control. When looking for smart rings, I noticed that there are quite many Colmi R02-related GitHub repositories available, including the following with (partial) documentation on the synchronisation protocol, firmware, and more:

Moreover, there is the Gadgetbridge source code on Codeberg with Yawell/Colmi ring support deep down.

I used that as foundation for my own Python-based CLI tool to manage the smart ring, export data from the device into a relational database with SQL capabilities (IBM Db2, SQLite). I can scan for the ring, retrieve and set settings, sychronize data, and some more. The following sections briefly show what is possible.

Colmi tool overview

>>> colmi --help
Usage: colmi [OPTIONS] COMMAND [ARGS]...

  Colmi smart ring CLI โ€” sync, configure, and analyse your ring data.

Options:
  --address MAC_OR_UUID  BLE MAC address (Linux) or UUID (macOS) of the Colmi
                         ring.
  --db-url TEXT          SQLAlchemy database URL for storing synced data.
  --help                 Show this message and exit.

Commands:
  db        Database management commands.
  device    Read device information and battery status.
  export    Export health data from the local database to CSV or JSON.
  scan      Scan for nearby Colmi rings and list them.
  settings  Read and write ring settings.
  sync      Sync health data from the ring to the local database.

Scan for smart ring and retrieve device information

Using the tool, I can scan for available rings via Bluetooth on my Linux machine. The found MAC address is persisted to easily communicate further.

>>> colmi scan --timeout 30

              Colmi Rings Found              
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Name           โ”ƒ Address           โ”ƒ RSSI โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ COLMI R10_BC04 โ”‚ AA:BB:41:34:BC:AA โ”‚ -87  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Saved address: AA:BB:41:34:BC:AA

Based on the stored MAC address or by providing it as parameter, I can retrieve information about the smart ring, its firmware and hardware release.

>>> colmi device info
 
           Device Information           
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Field        โ”ƒ Value                 โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ Address      โ”‚ AA:BB:41:34:BC:AA     โ”‚
โ”‚ Firmware     โ”‚ RY03CR_1.00.06_241212 โ”‚
โ”‚ Hardware     โ”‚ RY03CR_V1.0           โ”‚
โ”‚ Manufacturer โ”‚ COLMI R10_BC04        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Synchronize smart ring data

To export data from the Colmi smart ring and store it in the configured database, I can simply run sync or specify one or more domains.

>>> colmi sync
             Sync Summary              
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Domain   โ”ƒ Records Written โ”ƒ Status โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ activity โ”‚              27 โ”‚ ok     โ”‚
โ”‚ hr       โ”‚             215 โ”‚ ok     โ”‚
โ”‚ stress   โ”‚              28 โ”‚ ok     โ”‚
โ”‚ spo2     โ”‚              23 โ”‚ ok     โ”‚
โ”‚ sleep    โ”‚               2 โ”‚ ok     โ”‚
โ”‚ hrv      โ”‚              36 โ”‚ ok     โ”‚
โ”‚ temp     โ”‚               0 โ”‚ ok     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Some SQL-based analytics

With the data exported to a database, I can easily run SQL-based analytics, simple or more advanced. The following is the SQL statement to sum up the step / activity records for a specific day - here matching the above screenshot of Gadgetbridge.

>>> select sum(steps), strftime('%F', recorded_at) d from activity_samples where d='2026-08-16' group by d;

10956|2026-08-16

To get deeper into activity details, I can run the following SQL statement for the same day. It seems that I walked in the morning (5275 steps) and in the evening (2914 steps).

>>> select recorded_at, steps, calories_kcal, distance_m, strftime('%F', recorded_at) d from activity_samples where d='2026-08-16' order by recorded_at asc;

2026-08-16 06:00:00+00:00|139|842|93|2026-08-16
2026-08-16 07:00:00+00:00|36|242|26|2026-08-16
2026-08-16 08:00:00+00:00|176|1084|120|2026-08-16
2026-08-16 09:00:00+00:00|173|1175|130|2026-08-16
2026-08-16 10:00:00+00:00|5275|34647|3838|2026-08-16
2026-08-16 11:00:00+00:00|184|1133|126|2026-08-16
2026-08-16 12:00:00+00:00|40|273|30|2026-08-16
2026-08-16 13:00:00+00:00|95|630|70|2026-08-16
2026-08-16 15:00:00+00:00|507|3145|348|2026-08-16
2026-08-16 16:00:00+00:00|277|1868|207|2026-08-16
2026-08-16 17:00:00+00:00|607|4067|450|2026-08-16
2026-08-16 18:00:00+00:00|2914|20825|2308|2026-08-16
2026-08-16 19:00:00+00:00|299|1982|219|2026-08-16
2026-08-16 21:00:00+00:00|73|416|46|2026-08-16
2026-08-16 22:00:00+00:00|161|996|110|2026-08-16

Conclusions

Health and fitness data is very personal and should not be stored in some vendor clouds. Therefore, I looked for smart rings that could be “operated” locally, ideally synchronizing to a relational database. I found a family of rings with the “Colmi R02”. Because it is quite-well researched, it was possible to code up a tool to export the data into a database and perform SQL-based analysis. And I had some fun… ๐Ÿ˜Ž

If you have feedback, suggestions, or questions about this post, please reach out to me on Mastodon (@data_henrik@mastodon.social) or LinkedIn.