docs: two verified ways to factory-reset a ring, plus an oura factory-reset subcommand - #14
Open
nsandoval wants to merge 1 commit into
Open
docs: two verified ways to factory-reset a ring, plus an oura factory-reset subcommand#14nsandoval wants to merge 1 commit into
oura factory-reset subcommand#14nsandoval wants to merge 1 commit into
Conversation
The `0x1a` command was listed in the Horizon cheatsheet as "packet shape added as danger; not run", and no hardware path was recorded at all. Both are now verified on a Ring 4 (ORE_06, firmware 2.12.3). Path A is the protocol command, exposed as `oura factory-reset --yes`. The request bytes are built in the CLI rather than in `oura-protocol`, so embedded firmware linking that crate has no way to emit a destructive command. Worth noting: `tools/oura_protocol.py` parses a tag 0x1B status reply, but none arrives in practice — the ring resets and drops the link first. Path B needs no BLE at all: flipping the Gen3/Ring 4 dock 180 degrees four times, guided by the LED colour, resets a ring that will not connect to anything. This matters because every BLE reset path needs a device that is already bonded and authenticated, so without it a ring whose last bonded host is gone would be unrecoverable. The documented button-hold procedure only exists on the separate Charging Case. Also documents what a reset erases, the dock LED colours (blinking blue means "not paired with the Oura app", which is the steady state for this project), and a trap: the two paths differ in what happens to the boot-relative event counter. After the hardware reset it restarts near zero, so a persisted sync cursor from before sits millions of ticks ahead of anything the ring can now produce and no event is ever returned again — silently. Reset the cursor to 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Both reset paths were blank spots in the repo:
0x1awas listed in the Horizon cheatsheet as "packet shape added as danger; not run", and no hardware path was recorded at all. Both are now verified on a Ring 4 (ORE_06, firmware 2.12.3).Path A — the
0x1acommandExposed as
oura factory-reset --yes, which refuses to run without the flag.The request bytes are built in the CLI rather than in
oura-protocol, so firmware linking that crate has no way to emit a destructive command.One correction to the existing notes:
tools/oura_protocol.py:358parses a tag0x1Breply carrying au16status, but no reply arrives in practice — the ring resets and drops the link before answering. The reset still takes effect.Path B — hardware, no BLE, no button
Flipping the Gen3/Ring 4 dock 180° four times with the ring seated on it, guided by the LED colour (blue → red → magenta → yellow), resets a ring that will not connect to anything.
This one matters beyond convenience. Every BLE reset path needs a device that is already bonded and authenticated, so a ring whose last bonded host is gone would otherwise be unrecoverable. The button-hold procedure in Oura's docs only exists on the separate Charging Case; this works on the plain dock.
Verified on a ring that would no longer connect through the Oura app, and on which the widely-repeated "tap the dock" trick did nothing — as expected, since that reboots the ring rather than erasing it.
The trap worth reading
The two paths differ in what happens to the boot-relative event counter. After the hardware reset it restarts near zero, so a sync cursor persisted from before sits millions of ticks ahead of any timestamp the ring can now produce — and
drain_eventsreturns nothing, forever, with no error. Resetsync_state.next_cursorto0after either path.Also documented
28 4B 02 B0)0x15. Pair every host that will need access while the ring is still freshly reset.