Skip to content

Add SteelSeries Arctis Nova Pro Omni (battery + sidetone) - #584

Open
marctew wants to merge 1 commit into
Sapd:masterfrom
marctew:add-nova-pro-omni
Open

marctew wants to merge 1 commit into
Sapd:masterfrom
marctew:add-nova-pro-omni

Conversation

@marctew

@marctew marctew commented Sep 19, 2026

Copy link
Copy Markdown

Adds support for the SteelSeries Arctis Nova Pro Omni GameHub (VID 0x1038, PID 0x2290).

Capabilities

  • Battery status01 B0 status poll; reply[6] = headset battery %, reply[15] = status (0x01 offline, 0x02 cable charging, 0x08 online).
  • Sidetone01 38 <enable> <level>, level 0–10. Write-only: the hub exposes no readable sidetone state (verified against the status poll, the config feature report, and the Nova 7's 0x20 query), so no getSidetone.

Notes for reviewers

The Omni's GameHub is a close cousin of the Nova Pro Wireless base station, but its vendor HID interface differs in two ways, which is why it's a new device rather than an added PID:

  • Commands use report ID 0x01 (not 0x06) and 64-byte reports (not 31).
  • Interface 3 exposes two top-level collections; the command/response channel is the one on usage page 0xFFC0, report ID 1, selected via getCapabilityDetail (same pattern as the Nova 7 Gen 2).

It extends SteelSeriesNovaDevice (64-byte packets + usage-page selection) with battery/sidetone overrides for the Omni's report-ID and status-byte layout.

Testing

Built on Windows (MSYS2/MinGW, GCC 16) and tested against real hardware (firmware rev 0x0132):

  • headsetcontrol --list detects the device.
  • headsetcontrol -b returns a correct battery level (verified 93%, matching the OLED).
  • headsetcontrol -s 0/128 toggles sidetone audibly.

Reverse-engineered by USB capture (USBPcap) of SteelSeries GG traffic plus replay verification. The 1035-byte HID feature report (hardware EQ/preset store) is never written.

Adds the Nova Pro Omni GameHub (VID 0x1038, PID 0x2290).

The Omni's GameHub is a close cousin of the Nova Pro Wireless but its vendor
HID interface differs: commands use report ID 0x01 and 64-byte reports, and
interface 3 exposes two top-level collections, so the command/response channel
(usage page 0xFFC0, report ID 1) must be selected explicitly.

Verified empirically on firmware rev 0x0132:
- Battery: 01 B0 -> reply[6] battery %, reply[15] status (01 offline / 02
  charging / 08 online).
- Sidetone: 01 38 <enable> <level>, level 0-10. Write-only (no readable
  sidetone state exists on this hub), so no getSidetone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant