How to Export O2Ring CSV From ViHealth
How to export a night from ViHealth as a CSV file, what each column means, how often it samples and what the 255 placeholder is.
ViHealth keeps every night you've synced on your phone. You can export any of them as a CSV file. The CSV is the full recording: every sample your O2Ring, SleepU or Checkme O2 Max took that night.
How do you export a night?
The button names change between app versions, but the steps don't.
- Open ViHealth and let it finish syncing, so the night you want is in the list.
- Open that night.
- Find the share or export button on the report. It's usually a share icon in the top corner or an "Export" entry in a menu.
- Pick CSV, not PDF. The PDF is a picture of the summary. The CSV is the samples.
- Send the file somewhere you can reach from a computer, like email or cloud storage.
ViHealth exports one night at a time. If you've got months to get through, moving from ViHealth has tips for doing it in batches.
What's in the file name?
The name ends in a timestamp, like O2Ring_20260912223014.csv.
The digits are YYYYMMDDHHmmss for when the recording started.
Other tools use them to tell nights apart, so don't rename the file.
What's in each column?
There's a header row, then one row per sample.
Time,Oxygen Level,Pulse Rate,Motion
"10:30:14PM Sep 12, 2026",97,58,0
"10:30:16PM Sep 12, 2026",97,57,0
"10:30:18PM Sep 12, 2026",96,57,3
- Time. In quotes, like
10:30:14PM Sep 12, 2026. Twelve hour clock, three letter month, no timezone. - Oxygen Level. Your SpO2 as a whole percentage.
- Pulse Rate. Beats per minute, from the same sensor at the same moment.
- Motion. A whole number from the movement sensor. Zero means you were still.
How often does it sample?
Every 2 or 4 seconds, depending on your model. The file doesn't state the interval. Tools work it out from the gap between the first few timestamps.
At 2 seconds, an 8 hour night is about 14,400 rows. At 4 seconds it's about 7,200. A 20 second dip is 10 rows wide at 2 seconds and 5 rows wide at 4. That's one reason two tools can count dips differently, as what counts as an oxygen dip explains.
What does 255 mean?
When the sensor can't get a reading, the device doesn't leave the field blank. It writes 255.
You'll see runs of 255:
- At the start and end of a recording, while the ring is going on or coming off.
- In short bursts during the night, when the fit loosened or you moved.
255 is a placeholder, not a reading. If you chart the file yourself, drop every row where SpO2 is outside 50 to 100 or pulse is outside 20 to 250 before you calculate anything. One 255 left in will pull up the whole night's average.
A long run of 255 in the middle of the night usually means the ring shifted. Why your O2Ring data has gaps covers the causes.
What can you do with the file?
- Look at one night. The free session viewer charts a CSV in your browser, and the file stays on your computer.
- Skip ViHealth. The free oximeter data export reads nights off the ring over Bluetooth and saves a CSV, or the raw file for OSCAR.
- Open it in a spreadsheet. It works, but charting thousands of rows is slow.
- Build a history. Import several files at once into PulseOxTracker, then tag nights and compare them. How many nights to record says how many you need first.
- Take it to an appointment. See sharing oximeter data with your doctor.
Not a medical device. Does not diagnose, treat or prevent any condition. Discuss results and changes with a clinician.