Hi everyone! I’m excited to share my new custom integration for the Oura Ring Gen 4 that I’ve been working on.
What is it?
A modern Home Assistant integration for Oura Ring using the official v2 API with OAuth2 authentication. It brings all your Oura health data directly into Home Assistant with 30 sensors covering sleep, readiness, activity, heart rate, and HRV.
I literally quit installing a fork of the original repo earlier today after seeing Oura’s API v1 deprecation note… your timing could not have been better.
After changing my redirect URI from the one given in the original installation doc, to option B in the Fixing-Redirect-URI doc, the HA redirect upon adding the integration worked properly with my local instance. I’ve got sensors loaded in and displaying correctly! Thank you for your work!
Glad it worked for you, and you were able to resolve the issue with documentation.
It will take a couple of days for your Data to start looking better on the Dashboards, but if you have any issues or requests, don’t hesitate to let me know
Any idea why the entities wouldn’t be updating automatically? I manually reloaded the integration this morning by changing the query time from 5min to 6min, just to grab proper readings. As I’ve left it alone, though, the entities aren’t updating themselves. I’ve been monitoring the current heart rate entity as it has the most variable data, and it’s gone for 2 hours now without updating according to the entity page. Still displaying the reading from 2 hours ago. Is this user error?
Edit: I’ve since updated to repo v1.1 and I was unable to pre-load the old data, while the entities are still not updating automatically. I uninstalled and reinstalled the repository from HACS to allow for your first-time installation configuration. Let me know if you need logs or further description, happy to help!
So the heart rate specifically isn’t a sticking point for me, it just best visualizes my problem. The behavior is true of all entities. Even with the integration set to pull from the API every minute, it only seems to update if I manually reload the integration. The changes in my history graph here occur when I reload the integration or restart home assistant. None of the entities update themselves like yours seem to display in the pictures.
I can upload the full log if needed, but I don’t see any notable errors. I actually see data in the logs. It seems to be behaving as it should. They even show successful grabbing of historical data, and successful recurring pings of the API. But as you saw in my previous screenshot, the sensors will go up to “4 hours ago” or “8 hours ago.”
I did notice that for whatever reason my API in general does not update as quickly as yours and I can’t quite explain that. I say this because even after forcing a heart rate reading in the Oura app, waiting 5min, and manually reloading the integration, my heart rate doesn’t change which would suggest the data in my cloud account hadn’t updated yet.
Edit: I checked again when I got home. It appears the sensors reloaded once on their own while I was out. I wonder if my API experience is just egregiously slow, as they seem to update when there is new information to grab.
My ring is a Gen3, I’ve attempted to research any differences in how it might affect API updates compared to your Gen4 and haven’t come across anything notable.
I have made a point in the past few days to open the Oura app on my phone a few times a day, especially in the morning. What I’ve found is that the entities are in fact updating themselves when there is something to update, it just seems some statistics are slower to update in the cloud for me… current heart rate for instance. When I wake up and open the app, typically my sleep data will appear in Home Assistant within 10min, which is the expected behavior. Other entities will simply not update within the cloud for upwards of 4-8 hours, leading to extended periods of time where the Home Assistant sensors would time out like I saw.
In short, it seems your integration is behaving as expected and whatever issue I may have has more to do with API updates within the Oura app.
Buying a ring and building an integration with oauth2 in 2 weeks is impressive work, again, thank you for sharing this project!
Unfortunately that’s not the answer in my case. I’m a regular subscriber, currently on the monthly payment plan. I have collected some extra information though. I’ve found that my Oura cloud account seems to reflect a day-time sync about 40-50min after it’s completed on the app. However, even with forcing a heart rate reading, that sync did not include any heart rate information for the time period between the last sync and this one. I’ve attached screenshots from my cloud account, rather than the app.
The only way I can make sense of that would be a data packaging difference between the Gen3 and Gen4, where the Gen3 simply does not consider the heart rate entity “high priority” enough to update the cloud. Maybe the smart sensing feature in the Gen4 includes tags in the payloads that allow for a more consistent uploads to the cloud, while the Gen3 relies on longer, less-complete batch uploads? I only say this because my sleep readings are instantaneously uploaded to the cloud in the morning, suggesting some data payloads or batches can be pushed through faster, maybe through “complete batch” tags or tagged as major session events?
That or there is some sort of back-end ingestion difference based on what generation your account is associated with? I’m truly just brainstorming; none of this documented or recorded anywhere besides what I’m experiencing.
Edit: this behavior continued for hours, leaving 4-5 hours without live HR data in my cloud account. This might suggest that not all sync instances carry information for all sensors, and they most likely back-fill the rest of the shown data in larger batch dumps like mornings. In that case, I would be led to believe that the Gen4 smart sensing enables more continuous payloads than my Gen3 does for daytime readings.
Final Edit: I had a random update to the current HR sensor earlier today and I couldn’t place why at first, but the update came when my heart rate hit 130, so I wonder if the ring triggered an “activity” payload? Maybe the Gen3 only updates heart rate at certain thresholds in daytime payloads.
Thank you for the inputs, this definitely seems like the Gen 3 to Gen 4 differences.
I did read somewhere on a Forum over the weekend, someone mentioned that the granularity of the Gen 4 is better.
But there is definitely a difference between the 2 generations in terms of data and syncing.
However, could you perhaps provide some screenshots from what your Dashboards are looking like now? Since it has been over a week since you installed the plugin?
Absolutely, I haven’t set up a full dashboard for all sensors yet, but I’ve implemented a graph that uses a few of them on my main dash that I love.
Don’t mind the misalignment in the bottom, it renders correctly on my wall tablet, but I built this graph using Apex Charts card. It shows a weeks worth of trends for my sleep and readiness score. I do like your idea of displaying light, deep, and REM sleep durations as bar graphs too, so I may find a way to utilize that if space allows.
Oura Ring v2.0.0 Released - Production Ready with Critical Bug Fixes!
I’m excited to announce v2.0.0 of the Oura Ring Custom Integration is now available! This release brings critical bug fixes that make the integration fully functional and production-ready.
Critical Fixes
This release resolves several issues that were preventing the integration from working properly:
Enhanced Error Handling
Better exception handling for token validation failures
More informative error messages for troubleshooting
Improved logging for OAuth session states
New Features
Added 13 New Sensors
Comprehensive Testing
All 39 automated tests passing
Docker-based test environment
Validated against Home Assistant 2025.11
Breaking Changes & Migration
Entity IDs have changed from sensor.oura_* to sensor.oura_ring_*
How to Preserve Your Historical Data
Don’t worry - you won’t lose your data! Follow this simple process:
Option 1: Rename Device to Match Old Naming (Recommended)
Upgrade the integration via HACS
Go to Settings → Devices & Services → Oura Ring
Click on your Oura device
Click the (settings) icon in the top right
Rename device to: Oura (exactly, no “Ring”)
Click the ︙ (3-dot menu) in the top right
Select “Rename entities”
All 43 entities will be renamed to match the old format (sensor.oura_*)
All historical data is preserved!
Option 2: Custom Device Name + Preserve History
Follow Option 1 first to get sensor.oura_* entity IDs
Then rename your device to anything you want (e.g., “Louis’ Oura”)
Use “Rename entities” again
Home Assistant automatically preserves history through renames
Important: Do NOT delete and re-add the integration - this will lose your history!
What’s Included
43 Sensors across all Oura metrics
Sleep, Readiness, Activity, Heart Rate, HRV, Stress, Resilience, SpO2, and more
OAuth2 Authentication with proper token handling
Historical Data Loading (14 days on first setup, configurable 1-90 days)