Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Request: Aerox 3 #156

Closed
imLinguin opened this issue Dec 30, 2020 · 34 comments
Closed

Request: Aerox 3 #156

imLinguin opened this issue Dec 30, 2020 · 34 comments

Comments

@imLinguin
Copy link

imLinguin commented Dec 30, 2020

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
Copy link
Author

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

@hmenke
Copy link

hmenke commented Apr 21, 2021

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

@mewtlu
Copy link

mewtlu commented Jun 2, 2021

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
Copy link

@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
Copy link
Owner

flozz commented Aug 12, 2021

@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
Copy link

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

@fluffynuts
Copy link

@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
Copy link

fluffynuts commented Aug 13, 2021

@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:

  • how to figure out the parts I've marked with comments (endpoint, command_suffix)
  • the "save" command - issuing a save from the steelseries software, i only saw the color setting commands as above, which were being issued during the live preview phase too.
    • currently, if I turn the mouse off and on again (ie disconnect from usb, where I don't need the mouse to be "on"), it reverts to rainbow. If I reconnect on wireless to the machine running the SS software, colors come back as set up. If I shut down the SS software, colors revert to defaults. I'm not sure if this means that permanently setting a color on this mouse is impossible? Or if this is the same experience you have had with other devices?
  • if I can get this to work (scratch my personal itch), I'll look into the other parts (button mappings, etc)

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
Copy link
Author

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
Copy link

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
Copy link

fluffynuts commented Aug 14, 2021

@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
Copy link
Owner

flozz commented Aug 18, 2021

additional data from @imLinguin :)

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

@flozz flozz mentioned this issue Aug 18, 2021
@flozz
Copy link
Owner

flozz commented Aug 18, 2021

I started to implement the support of the

  • Aerox 3
  • Aerox 3 Wireless (wired mode)

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,

  • we will work to see if there is a save command and if it work for both devices,

  • we will see if there is some "effects" available in the mouse like the Rival 3

:)

@imLinguin
Copy link
Author

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

@fluffynuts
Copy link

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
Copy link
Author

@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
Copy link

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
Copy link

ah, will give it a go @imLinguin

@fluffynuts
Copy link

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

@fluffynuts
Copy link

fluffynuts commented Aug 18, 2021

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
Copy link
Author

imLinguin commented Aug 18, 2021

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
Copy link
Author

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

@flozz
Copy link
Owner

flozz commented Aug 18, 2021

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

@flozz
Copy link
Owner

flozz commented Aug 19, 2021

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

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

@flozz
Copy link
Owner

flozz commented Aug 19, 2021

@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
Copy link
Author

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
Copy link

mewtlu commented Aug 19, 2021

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
Copy link
Owner

flozz commented Aug 19, 2021

Thank you for your feedback @mewtlu


We are talking about two different devices in this thread:

  • The Aerox 3, that supports
    • a wired USB connection
  • The Aerox 3 Wireless, that supports
    • a wired USB connection
    • a wireless 2.4 GHz connection (using an USB dongle)
    • a wireless Bluetooth connection

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
Copy link
Owner

flozz commented Aug 19, 2021

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
Copy link
Author

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
Copy link
Owner

flozz commented Aug 24, 2021

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
Copy link
Author

Works perfectly

@flozz
Copy link
Owner

flozz commented Nov 10, 2021

I am back on the project :)

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

@flozz
Copy link
Owner

flozz commented Nov 14, 2021

The Aerox 3 support is now on master :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants