rivalcfg icon indicating copy to clipboard operation
rivalcfg copied to clipboard

Support for Rival 3 Gen 2 Wired 1038:1870

Open jcappola opened this issue 7 months ago • 9 comments

Device identification:

Bus 003 Device 003: ID 1038:1870 SteelSeries ApS SteelSeries Rival 3 Gen 2

Product URL:

https://steelseries.com/gaming-mice/rival-3-gen-2

SSE3 Screenshots:

Running on Ubuntu at the moment. I will try to get these from another machine and update this post.

I'm willing to help out doing the reverse engineering for this model as needed!

jcappola avatar Jun 12 '25 22:06 jcappola

Hello,

I collected some info about this mouse and wrote the specs but I didn't have time to create the issue for this new device at that time and then I forgot... ^^'

So here are the specs. I don't know when I will have time to work on it but I will need someone to test :)


Rival 3 Gen 2 (Wired) (1038:1870)

SteelSeries released a new mouse:

  • Name: Rival 3 Gen 2
  • Vendor ID: 0x1038
  • Product ID: 0x1870
  • Endpoint: ? (probably 0 or 3?)

Protocol

Here are some info I was able to find and that should be checked/tested.

sensitivity

Similar protocol than our multidpi_range handler but with separated X/Y DPI.

Packets format:

0x34 <CPI_count [1-5]> <CPI_selected [0-4]> <CPI_1_X> <CPI_1_Y> [... <CPI_5_X> <CPI_5_Y>]
  • 0x00: 0
  • 0x04: 200
  • 0x06: 300
  • 0x08: 400
  • 0x0B: 500
  • 0x0D: 600
  • 0x0F: 700
  • 0x12: 800
  • 0x14: 900
  • 0x16: 1000
  • 0x19: 1100
  • 0x1B: 1200
  • 0x1D: 1300
  • 0x20: 1400
  • 0x22: 1500
  • 0x24: 1600
  • 0x27: 1700
  • 0x29: 1800
  • 0x2B: 1900
  • 0x2E: 2000
  • 0x30: 2100
  • 0x32: 2200
  • 0x34: 2300
  • 0x37: 2400
  • 0x39: 2500
  • 0x3B: 2600
  • 0x3E: 2700
  • 0x40: 2800
  • 0x42: 2900
  • 0x45: 3000
  • 0x47: 3100
  • 0x49: 3200
  • 0x4C: 3300
  • 0x4E: 3400
  • 0x50: 3500
  • 0x53: 3600
  • 0x55: 3700
  • 0x57: 3800
  • 0x5A: 3900
  • 0x5C: 4000
  • 0x5E: 4100
  • 0x61: 4200
  • 0x63: 4300
  • 0x65: 4400
  • 0x68: 4500
  • 0x6A: 4600
  • 0x6C: 4700
  • 0x6F: 4800
  • 0x71: 4900
  • 0x73: 5000
  • 0x76: 5100
  • 0x78: 5200
  • 0x7A: 5300
  • 0x7D: 5400
  • 0x7F: 5500
  • 0x81: 5600
  • 0x84: 5700
  • 0x86: 5800
  • 0x88: 5900
  • 0x8B: 6000
  • 0x8D: 6100
  • 0x8F: 6200
  • 0x92: 6300
  • 0x94: 6400
  • 0x96: 6500
  • 0x99: 6600
  • 0x9B: 6700
  • 0x9D: 6800
  • 0xA0: 6900
  • 0xA2: 7000
  • 0xA4: 7100
  • 0xA7: 7200
  • 0xA9: 7300
  • 0xAB: 7400
  • 0xAD: 7500
  • 0xB0: 7600
  • 0xB2: 7700
  • 0xB4: 7800
  • 0xB7: 7900
  • 0xB9: 8000
  • 0xBC: 8100
  • 0xBE: 8200
  • 0xC0: 8300
  • 0xC3: 8400
  • 0xC5: 8500

polling_rate

handler: choice

Packet format:

0x2B <rate>

<rate>:

  • 0x04 = 125 Hz
  • 0x03 = 250 Hz
  • 0x02 = 500 Hz
  • 0x01 = 1000 Hz

color

handler: rgbcolor

Zone 1:

0x21 0x01 <R1> <G1> <B1>

Zone 2:

0x21 0x02 0x00 0x00 0x00 <R2> <G2> <B2>

Zone 3:

0x21 0x03 0x00 0x00 0x00 0x00 0x00 0x00 <R3> <G3> <B3>

reactive_color

handler: reactive_rgbcolor

Packet:

0x26 <R> <G> <B>

led_brightness

handler: range

Packet:

0x22 <brightness>

<brightness>:

  • [0-100, 1] % → [0x00-0x64, 1]

rainbow_effect

handler: choice

Packet:

0x22 <effect>

<effect>:

  • all: 0b111
  • bottom: 0b100
  • middle: 0b010
  • top: 0b001
  • bottom-middle: 0b110
  • middle-top: 0b011
  • bottom-top: 0b101

default_lighting

handler: choice

Packet:

0x27 <2B:value>

<value>:

  • off: 0x00 0x00
  • reactive: 0x00 0x01
  • rainbow: 0x01 0x00
  • reactive-rainbow: 0x01 0x01

buttons_mapping

handler: buttons

packet:

0x2A <5B:Button1> ... <5B:Button6(cpi)> <5B:ScrollUp> <5B:ScrollDown>
  • disable: 0x00
  • button 1-6: 0x01 - 0x06
  • CPI: 0x30
  • ScrollUp: 0x31
  • ScrollDown: 0x32
  • Keyboard Key: 0x51
  • Multemedia Key: 0x61

save

packet:

0x11 0x00

flozz avatar Jun 13 '25 07:06 flozz

With my very limited ability, I was able to make a profile for just the color and default_lighting. Endpoint is 3. Color for zone 1 and zone 2 works as expected, but setting a value for zone 3 just turns off the LEDs for zones 1 and 2. Setting default_lighting to off turns off the LEDs for just zone 3. So I can at least get all the LEDs off, which is what I wanted.

The default rainbow setting is awful for a dark or work environment. I thought I could just turn it off with the Engine software on my Mac laptop and reconnect it to my Linux desktop. Turns out that Engine doesn't save the settings to the hardware, so I'd be stuck with rainbow on Linux. Thanks so much for this, you've made my workspace a little less visually polluted 🙂

I'd also be happy to test out profiles for this model!

paytoncarter14 avatar Jul 15 '25 19:07 paytoncarter14

My rival 3 gen 2 isn't recognized, can I do something about it ?

ShinobuFormula avatar Jul 23 '25 12:07 ShinobuFormula

@ShinobuFormula It is normal : currently we only have the specs, now we have to do the code :)

flozz avatar Jul 23 '25 18:07 flozz

I'm willing to test, I followed what paytoncarter14 did on my mouse and got the annoying rainbow effect off. My script saved to the mouse internal memory successfully.

I attached the python script I used (Ai helped me write this) and I attached the PCap file from opening GG Engine starting at frame 7.

rival 3 v2 pcap.txt RivalRGBoff.py.txt

T3Kgamer avatar Jul 29 '25 08:07 T3Kgamer

First of all, thanks a lot for this project! I just purchased this model of mouse (rival 3 gen 2 wired), love the mouse but hate the ridiculous GG / engine crapware that you are supposed to use to set it up (for some reason it prevents the computer from entering sleep mode / screen saver, and it doesn't save the settings you choose if GG is not running).

In case it helps anyone, I was able to use the RivalRGBoff.py script that @T3Kgamer shared above to permanently turn off the led lights. You just have to add to the python script a call to hid.enumerate(0x1038, 0x1870), which returns a list of HID devices in the form of a dictionary. From that list, you need to select the dictionary with interface_number = 3 and replace device_path in the script by the value of the 'path' key, for me for example it was device_path = b'DevSrvsID:4295862085'

With this, the script successfully turns off the light, however a light still shows up whenever you click. To turn that off, following the information in the initial post for this issue, you can add the following command to the commands being sent to the mouse:

CMD_REACTIVE_COLOR_OFF = bytearray([0x00, 0x26, 0x00, 0x00, 0x00] + [0x00] * 59)

Also, to set the DPI values, one can use the following command (this sets both x and y DPI values to 7000):

CMD_SET_DPI = bytearray([0x00, 0x34, 0x01, 0x00, 0xA2, 0xA2] + [0x00] * 58)

simoncouture avatar Aug 19 '25 05:08 simoncouture

The implementation in the pull request is complete for firmware version 1.1.5. Report inconsistencies or broken features mentioning your firmware version.

orsonteodoro avatar Sep 15 '25 06:09 orsonteodoro

I'm willing to test, I followed what paytoncarter14 did on my mouse and got the annoying rainbow effect off. My script saved to the mouse internal memory successfully.

I attached the python script I used (Ai helped me write this) and I attached the PCap file from opening GG Engine starting at frame 7.

rival 3 v2 pcap.txt RivalRGBoff.py.txt

Thank you very much for the RivalRGBoff.py script. I also successfully saved RGB/ReaktiveOff in the mouse's internal memory using GTPchat. Now the mouse is perfect, I am very happy!

faszombele34-lang avatar Oct 04 '25 04:10 faszombele34-lang

@T3Kgamer @simoncouture Thank you so much! I've turned off the lights.

Couple of notes for those unfamiliar with Python (like me):

  1. Download script RivalRGBoff.py.txt to rivalcfg.env directory and run it from there with
./bin/python3 RivalRGBoff.py.txt
  1. Add line print(hid.enumerate(0x1038, 0x1870)) on line 6 to list devices to find device_path (interface_number = 3).
  2. Add line device_path = b'DevSrvsID:4298590934' on line 10 with your correct device_path from hid.enumerate.

afanasy avatar Nov 15 '25 02:11 afanasy