flozz / rivalcfg

CLI tool and Python library to configure SteelSeries gaming mice
https://flozz.github.io/rivalcfg/
Do What The F*ck You Want To Public License
761 stars 62 forks source link

Request: Aerox 3 #156

Closed imLinguin closed 2 years ago

imLinguin commented 3 years ago

Whould it be possible to add Aerox 3 mouse support? I will try to reverse engineer it in a few days. Will add lsusb output later.

imLinguin commented 3 years ago

lsusb output: Bus 001 Device 006: ID 1038:1836 SteelSeries ApS SteelSeries Aerox 3

hmenke commented 3 years ago

There is also a wireless version ID 1038:1838 SteelSeries ApS SteelSeries Aerox 3 Wireless

mewtlu commented 3 years ago

Would be very interested in support for this and happy to provide testing! (will take a look at adding it myself when I have some spare time but that may not be for a while)

fluffynuts commented 2 years ago

@flozz https://flozz.github.io/rivalcfg/contributing.html mentions reverse-engineering protocols - and I'd like to give it a go. What methods / tools do you use?

flozz commented 2 years ago

@fluffynuts Hello,

Basically, I use Wireshark and a Windows VM with the SteelSeries Engine 3 installed on it.

I do not had time to write a documentation in English, but I wrote two articles (in French) on my blog:

Maybe Google Translate could help you :)

fluffynuts commented 2 years ago

@flozz thanks, I'll see what I can figure out (:

fluffynuts commented 2 years ago

@flozz after a quick look through a translated one - nice articles! I think that I'll be able to figure it out. I have a windows machine here so I can skip the VM part, but otherwise, excellent. Thanks!

fluffynuts commented 2 years ago

@flozz ok, I've had a look, and so far I can see:

setting colors by zone, data packets: zone 1: 21 01 00 RR GG BB zone 2: 21 01 01 RR GG BB zone 3: 21 01 02 RR GG BB

Setting any of the fancy effects results in a lot of chatter that looks like this, so it looks like breath and rainbow and so forth may set up by the software? But when one receives the mouse or when it reverts to "default", I see the overall rainbow effect, no breathing, so I'm not sure how that's accomplished in the light of watching other effects applied.

For my immediate use, I just want solid colors - I want to do an orange-to-red gradient from the front of the mouse back, to match my rig, so I figure this is as good a time as any to start on a profile.

This is where the wheels fall off a bit - I have this so far:

from .. import usbhid

profile = {
    "name": "SteelSeries Aerox 3",
    "models": [
        {
            "name": "SteelSeries Aerox 3 Wireless - USB Wired",
            "vendor_id": 0x1038,
            "product_id": 0x183A,
            "endpoint": 0 # ? not sure what to set here
        }
    ],
    "settings": {
        "z1_color": {
            "label": "Strip top LED color",
            "description": "Set the color of the top LED of the strip",
            "cli": ["--strip-top-color", "--z1"],
            "report_type": usbhid.HID_REPORT_TYPE_OUTPUT,
            "command": [0x21, 0x01, 0x00],
            "command_suffix": [0x64], # not sure what to put here: the observed frames are 00 all the way after the location indicator and color
            "value_type": "rgbcolor",
            "default": "red"
        },        
        "z2_color": {
            "label": "Strip middle LED color",
            "description": "Set the color of the middle LED of the strip",
            "cli": ["--strip-middle-color", "--z2"],
            "report_type": usbhid.HID_REPORT_TYPE_OUTPUT,
            "command": [0x21, 0x02, 0x00],
            "command_suffix": [0x64], # not sure what to put here: the observed frames are 00 all the way after the location indicator and color
            "value_type": "rgbcolor",
            "default": "red"
        },       
        "z1_color": {
            "label": "Strip bottom LED color",
            "description": "Set the color of the bottom LED of the strip",
            "cli": ["--strip-top-color", "--z3"],
            "report_type": usbhid.HID_REPORT_TYPE_OUTPUT,
            "command": [0x21, 0x03, 0x00],
            "command_suffix": [0x64], # not sure what to put here: the observed frames are 00 all the way after the location indicator and color
            "value_type": "rgbcolor",
            "default": "red"
        },
    }

This is for the aerox 3 as plugged in directly on usb; the device id changes to 1838 for the wireless dongle, so I guess I'd add a "model" for that?

What I'm missing:

I also see .csv files, so it looks like device python files might be generated? Assuming I'm even remotely on the right track with the data I think I've captured, where do I go from here? Sorry if this is a stupid question - if there's a doc that I should be looking at, please point me there (I don't see answers to my questions at https://flozz.github.io/rivalcfg/contributing.html or in the readme, but that might just me being stupid)

imLinguin commented 2 years ago

In wired version I noticed that Engine is constantly sending packets to mice. Is this also a thing on wireless version? I'm just curious

fluffynuts commented 2 years ago

I'm just assuming so - I connected my aerox in wireless state and it didn't seem to make much difference in the chatter

fluffynuts commented 2 years ago

@imLinguin that's why I don't think this mouse can do the effects "natively" - I saw constant updates being sent (color-wise) when I had an effect enabled in the engine. As far as solid colors go, it looks like that's remembered until the mouse changes connection or powers off. BUT I see that other mice have a "save" packet, and I haven't seen that when testing against this (yet) - though I could just be missing it. When I click "save" in Engine, I haven't seen any different packets going to the mouse, so either I'm missing it or "save" means "save to Engine storage and keep applying as required".

If the latter is the case, I'd probably recommend to not use effects if you want the most out of your Aerox 3 - that chatter is quite noisy & can't come for free, surely. Not that I'm trying to bash this mouse - I'm really enjoying gaming with it, and the color-setting to match my rig would just be nice-to-have.

flozz commented 2 years ago

additional data from @imLinguin :)

EDIT: I add the link here to keep a track, not everyone is on Discord :)

flozz commented 2 years ago

I started to implement the support of the

on the aerox3branch and I need you to test on both devices.


Here is the implemented commands:

SteelSeries Aerox 3 Options:
  -s SENSITIVITY, --sensitivity SENSITIVITY
                        Set sensitivity preset (DPI) (up to 5 settings, from 200 dpi to 8500
                        dpi, default: '800, 1600')
  -p POLLING_RATE, --polling-rate POLLING_RATE
                        Set polling rate (Hz) (values: 125, 250, 500, 1000, default: 1000)
  --top-color Z1_COLOR, --z1 Z1_COLOR
                        Set the color of the top LED (e.g. red, #ff0000, ff0000, #f00, f00,
                        default: red)
  --middle-color Z2_COLOR, --z2 Z2_COLOR
                        Set the color of the middle LED (e.g. red, #ff0000, ff0000, #f00,
                        f00, default: lime)
  --bottom-color Z3_COLOR, --z3 Z3_COLOR
                        Set the color of the bottom LED (e.g. red, #ff0000, ff0000, #f00,
                        f00, default: blue)
  -l LED_BRIGHTNESS, --led-brightness LED_BRIGHTNESS
                        Set the brightness of the LEDs (from 0 to 100, default: 100)

To test, first get / setup the project:

sudo apt install python3-venv

git clone https://github.com/flozz/rivalcfg.git rivalcfg-aerox3
cd rivalcfg-aerox3
git checkout aerox3

python3 -m venv __env__
source __env__/bin/activate

pip install -e .

then you can test with command like:

python -m rivalcfg ...

example:

python -m rivalcfg --z1 red --z2 lime --z3 blue

Please test all commands on both devices, it will help

NOTE: I used the information from the Aerox Wireless (wired) for the colors, but it seems slightly different from the non Wireless one, so please test the three zones and repports me any errors / incoherence :)


Also can you provide screenshot of your SS Engine for each mice to help me to understand available settings? :)


Finally, once we will be done with de basic configuration,

:)

imLinguin commented 2 years ago

Here are the screenshots from SSE. Aerox 3 non-wireless version obraz obraz

fluffynuts commented 2 years ago

On linux, the mouse (wireless) doesn't appear to fully "see" the mouse:

if I run, eg python -m rivalcfg --help, there's no device-specific help, and python -m rivalcfg -z1 red errors

however, python -m rivalcfg --print-debug prints out:

RIVALCFG
========
Version: 4.3.0
udev rules installed: True
udev rules up to date: True
Installation path: /home/daf/code/opensource/rivalcfg/rivalcfg

OPERATING SYSTEM
================
OS: Linux
Platform: Linux-5.10.52-gentoo-x86_64-x86_64-11th_Gen_Intel-R-_Core-TM-_i9-11900KF_@_3.50GHz-with-glibc2.33
Version: #4 SMP Sat Aug 14 20:35:58 SAST 2021
Distribution issue: This is \n.\O (\s \m \r) \t

PYTHON
======
Python version: 3.9.6
HIDAPI version: 0.10.1

PLUGGED STEELSERIES DEVICES ENDPOINTS
=====================================
1038:1838 | 00 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:1838 | 01 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:1838 | 02 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:1838 | 03 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:1838 | 04 | SteelSeries Aerox 3 Wireless (firmware v0)

I also don't get -z1 to work when running the mouse wired, though the output from --print-debug differs slightly as the mouse presents as a different device:

RIVALCFG
========
Version: 4.3.0
udev rules installed: True
udev rules up to date: True
Installation path: /home/daf/code/opensource/rivalcfg/rivalcfg

OPERATING SYSTEM
================
OS: Linux
Platform: Linux-5.10.52-gentoo-x86_64-x86_64-11th_Gen_Intel-R-_Core-TM-_i9-11900KF_@_3.50GHz-with-glibc2.33
Version: #4 SMP Sat Aug 14 20:35:58 SAST 2021
Distribution issue: This is \n.\O (\s \m \r) \t

PYTHON
======
Python version: 3.9.6
HIDAPI version: 0.10.1

PLUGGED STEELSERIES DEVICES ENDPOINTS
=====================================
1038:183a | 00 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:183a | 01 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:183a | 02 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:183a | 03 | SteelSeries Aerox 3 Wireless (firmware v0)
1038:183a | 04 | SteelSeries Aerox 3 Wireless (firmware v0)

it's not impossible that I'm just Doing Something Wrong. I followed the steps from above tho:

  1. clone
  2. git checkout aerox3
  3. python3 -m venv env
  4. source env/bin/activate
  5. pip install -e .

I've also tried python3 -m rivalcfg --update-udev just in case - no change

imLinguin commented 2 years ago

@fluffynuts try changing endpoint value here: https://github.com/flozz/rivalcfg/blob/aerox3/rivalcfg/devices/aerox3.py#L17 Changing it to 3 worked for my non-wireless Aerox3. Try finding which works for you.

fluffynuts commented 2 years ago

a friend on windows is achieving the same non-result so either we're both doing the same Wrong Thing, or there's something more interesting at play here...

fluffynuts commented 2 years ago

ah, will give it a go @imLinguin

fluffynuts commented 2 years ago

eh, tried endpoints 0-4, no luck ):

fluffynuts commented 2 years ago

one thing I noticed is that when I run with --print-debug, the report includes device id 1038:1838 which isn't in the models list (tho adding doesn't seem to have helped much, tbh)

I wonder if this is related to the firmware update I received when I first connected to a windows box? what's the firmware status with other people on this thread? ie, who has updated, who hasn't?

imLinguin commented 2 years ago

You might also need to reboot if you just updated udev rules. You should use the mouse in wired mode for now, which is currently implemented.

imLinguin commented 2 years ago

I'm assuming you are in wireless mode, because of productId mismatch @fluffynuts

flozz commented 2 years ago

I only implemented the wired mode yet, not the wireless mode with the dongle :)

flozz commented 2 years ago

I separated profiles for the Aerox 3 and the Aerox 3 Wireless.

@fluffynuts, let's continue in #167 for your device :)

flozz commented 2 years ago

@imLinguin everything should now work out of the box for the Aerox 3

I also added a, option on enable the rainbow effect:

  -e LIGHT_EFFECT, --light-effect LIGHT_EFFECT
                        Set the light effect (values: rainbow-shift, default: rainbow-shift)

you can try it with:

python3 -m rivalcfg -e rainbow-shift

Also can you try to change value from 0xFF to something else (like 0x00 and other random values) to see if there is other effects available?

imLinguin commented 2 years ago

Firmware version command:

90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Mouse response:

00 69 ba ae ea 94 ff ff 43 01 84 04 01 00 2d 00
c7 48 1e 61 00 00 00 00 b2 1d 0f 00 00 00 00 00
40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00
90 31 2e 30 2e 31 31 20 2b 66 62 35 33 36 37 62
64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

version starts after 0x90

mewtlu commented 2 years ago

Been following this thread and very excited to see it just worked for me for the first time with the latest changes, though the -e/--light-effect flag doesn't appear to work nor does its description show up in the --help menu, is there I might be missing to get that working? Really appreciate what you're doing with this, looking forward to having control of my mouse even on linux!

Logs below:

❯ sudo python3 -m rivalcfg -e rainbow-shift
usage: rivalcfg [-h] [--list] [--version] [--no-save] [--update-udev] [--print-udev]
                [--print-debug] [-s SENSITIVITY] [-p POLLING_RATE] [--top-color Z1_COLOR]
                [--middle-color Z2_COLOR] [--bottom-color Z3_COLOR] [-l LED_BRIGHTNESS]
                [-r]
rivalcfg: error: unrecognized arguments: -e rainbow-shift

❯ sudo python3 -m rivalcfg --help          
usage: rivalcfg [-h] [--list] [--version] [--no-save] [--update-udev] [--print-udev]
                [--print-debug] [-s SENSITIVITY] [-p POLLING_RATE] [--top-color Z1_COLOR]
                [--middle-color Z2_COLOR] [--bottom-color Z3_COLOR] [-l LED_BRIGHTNESS]
                [-r]

optional arguments:
  -h, --help            show this help message and exit
  --list                List supported devices and exit
  --version             show program's version number and exit
  --no-save             Do not persist settings in the internal device memory
  --update-udev         Updates udev rules (Linux only, requires to be run as root)
  --print-udev          Prints udev rules and exit
  --print-debug         Prints debug informations and exit

SteelSeries Aerox 3 Wireless (wired mode) Options:
  -s SENSITIVITY, --sensitivity SENSITIVITY
                        Set sensitivity preset (DPI) (up to 5 settings, from 200 dpi to
                        8500 dpi, default: '800, 1600')
  -p POLLING_RATE, --polling-rate POLLING_RATE
                        Set polling rate (Hz) (values: 125, 250, 500, 1000, default:
                        1000)
  --top-color Z1_COLOR, --z1 Z1_COLOR
                        Set the color of the top LED (e.g. red, #ff0000, ff0000, #f00,
                        f00, default: red)
  --middle-color Z2_COLOR, --z2 Z2_COLOR
                        Set the color of the middle LED (e.g. red, #ff0000, ff0000, #f00,
                        f00, default: lime)
  --bottom-color Z3_COLOR, --z3 Z3_COLOR
                        Set the color of the bottom LED (e.g. red, #ff0000, ff0000, #f00,
                        f00, default: blue)
  -l LED_BRIGHTNESS, --led-brightness LED_BRIGHTNESS
                        Set the brightness of the LEDs (from 0 to 16, default: 16)
  -r, --reset           Reset all settings to their factory default

Please report any bug on Github: https://github.com/flozz/rivalcfg/issues
flozz commented 2 years ago

Thank you for your feedback @mewtlu


We are talking about two different devices in this thread:

The -e option is only for the Aerox 3 and you seems to have the Aerox 3 Wireless, that's why you do not have it.

To avoid confusion (as the devices are different and use a slightly different protocol), there is an other issue dedicated to the wireless version of the Aerox 3 → #167

flozz commented 2 years ago

I updated the Aerox 3 (not the wireless one) with the following options:

  -e RAINBOW_EFFECT, --rainbow-effect RAINBOW_EFFECT
                        Set the rainbow effect (can be cleared by setting a color) (values:
                        all, bottom, middle, top, bottom-middle, middle-top, bottom-top,
                        default: all)
  -b BUTTONS_MAPPING, --buttons BUTTONS_MAPPING
                        Set the mapping of the buttons (default: buttons(button1=button1;
                        button2=button2; button3=button3; button4=button4; button5=button5;
                        button6=dpi; scrollup=scrollup; scrolldown=scrolldown;
                        layout=qwerty))

I still have to implement the firmware reading code, then the support of this device should be complete. :)

(and once this one finished, i will continue working on the Aerox 3 Wireless, there is a lot to do on it :) )

imLinguin commented 2 years ago

There is also Reactive tab in SSE which I documented in my repo as Reactive Effect. It's wave looking, one color effect from top to bottom, being triggered when you press any mouse button. It can be either set to some color or disabled.

flozz commented 2 years ago

Update: I added the reactive color option:

  -a REACTIVE_COLOR, --reactive-color REACTIVE_COLOR
                        Set the color of the LEDs in reaction to a button click (e.g. off,
                        disable, red, #ff0000, ff0000, #f00, f00, default: off)

can you check it works? :)

imLinguin commented 2 years ago

Works perfectly

flozz commented 2 years ago

I am back on the project :)

The Aerox 3 Support seems ok, just need to write some test before merging it to master.

flozz commented 2 years ago

The Aerox 3 support is now on master :)