Roccat Suora FX : désactiver les arcs-en-ciel et autres licorneries sous Linux

Et c'est reparti ! Je me retrouve, une fois de plus, à développer un outil pour configurer des périphériques USB sous Linux. Cette fois-ci, c'est au tour du clavier gaming Suora FX de chez Roccat de passer entre mes mains... Voyons un peu ce qu'il a dans le ventre ! 😁️

Pour la petite histoire, je me suis retrouvé à tripatouiller le Suora FX pour donner un coup de main à un collègue. Il utilise ce clavier depuis quelques semaines au boulot ; et s'il semble en être plutôt content dans l'ensemble, le clavier à tout de même un gros défaut : de base il est animé de vagues arcs-en-ciel très lumineuses et totalement insupportables... Je vous laisse juger par vous-même :

Apperçu des licorneries du Suora FX

Connaissant ma « passion » pour le reverse engineering de périphériques USB, mon collègue est donc venu me demander s'il n'y avait pas moyen de bricoler quelque chose pour que son clavier arrête de vomir des arcs-en-ciel ; si possible avant de se faire assassiner par ses voisins de bureaux. 😛️

Les mains dans le cambouis

Mon premier réflex pour étudier le fonctionnement du clavier a été de suivre la même méthode que celle que j'ai utilisée pour les souris et les casques SteelSeries. J'installe donc Roccat Swarm, l'outil de configuration fourni par le constructeur, sur une machine virtuelle Windows... Et ce fut un échec : je n'ai jamais réussi à faire marcher ce truc... 😭️

Heureusement, après quelques recherches, je suis tombé sur le dépôt Github d'un petit programme écrit en Vala, permettant de parler au Suora FX. On pourrait se dire que ça y est, c'est bon, finalement quelqu'un a déjà fait un outil pour configurer le clavier... mais pas tout à fait. L'outil en question est un éditeur de texte permettant de scripter le clavier en Lua : c'est un peu « too much » pour ce que l'on cherche à accomplir... Mais au moins on dispose des infos utiles dans le code source du logiciel ! 👌️

Essayons donc d'écrire rapidement un petit script Python pour stopper la déferlante arc-en-ciel du clavier...

Pour commencer il nous faudra libusb1 pour pouvoir dialoguer avec des périphériques USB. Sous Debian / Ubuntu, on peut l'installer avec la commande suivante :

sudo apt install python3-libusb1

En suite on peut écrire le script suivant, que j'ai nommé smecta.py (oui oui 😛️), pour éteindre le clavier:

#!/usr/bin/env python3

import usb1

VENDOR_ID = 0x1e7d
PRODUCT_ID = 0x3246
INTERFACE = 0x03

# On récupère une connexion a notre périphérique USB
context = usb1.USBContext()
handle = context.openByVendorIDAndProductID(
    VENDOR_ID,
    PRODUCT_ID,
    skip_on_error=True,
)

# On demande au noyau Linux d'arrêter de contrôler l'interface dont on a besoin
handle.detachKernelDriver(INTERFACE)

# On prend le contrôle de l'interface
handle.claimInterface(INTERFACE)

# On prépare les données que l'on va envoyer
data = [
    0x08, 0x02,  # Commande (ne change jamais)
    0x01,        # Effet prédéfini : 0x01 - 0x0D
    0x0A,        # Vitesse : 0x00 (rapide) - 0x0A (lent)
    0x00         # Luminosité : 0x00 (éteint) - 0x32 (max)
    0x01,        # Couleur : 0x01 - 0x08. Dans l'ordre:
                 # rouge, vert, jaune, bleu, cyan, violet, blanc
    0x00,        # Options : 0x00 la plupart du temps, ou une
                 # valeur de 0x01 à 0x04 lorsque l'effet 0x03 est utilisé
    0xE9,        # Somme de contrôle, calculée en soustrayant
                 # l'ensemble des octets précédent à 0xFF :
                 # 0xFF - 0x08 - 0x02 - 0x01 - 0x0A - 0x00 - 0x01 - 0x00 = 0xE9
]

# On envoie les données au clavier
handle.controlWrite(0x21, 0x09, 0x0300, 0x03, data)

# On relâche notre contrôle sur l'interface du clavier
handle.releaseInterface(INTERFACE)

# Et on rend la main au noyau Linux
handle.attachKernelDriver(INTERFACE)

On peut à présent exécuter notre script avec les commandes suivantes :

chmod +x smecta.py
sudo ./smecta.py

Oui, vous avez bien vu, il faut exécuter le script en root pour pouvoir accéder au périphérique USB. Mais on peut heureusement améliorer cela facilement en configurant udev (on en reparle un peu plus bas 😉️).

Si tout s'est bien passé, le clavier devrait à présent être éteint, pour le plus grand bonheur de votre rétine ! Fini les arcs-en-ciel ! 😎️

Amélioration du script : suorafxctl

Maintenant qu'on a pu écrire un petit script fonctionnel, il ne nous reste plus qu'à développer un petit outil en ligne de commande pour que ça soit plus pratique à utiliser. Je vous présente donc suorafxctl :

Installer suorafxctl

Pour commencer, il faut installer la libusb 1.0 sur la machine, ce qui peut être fait avec la commande suivante sous Debian / Ubuntu et leurs dérivés :

sudo apt install libusb-1.0-0

Ensuite, vous pouvez installer suorafxctl avec pip :

sudo pip install suorafxctl

Si vous souhaiter pouvoir utiliser l'outil sans avoir besoin d'être root, créez le fichier /etc/udev/rules.d/99-roccat-suora-fx.rules et placez-y la ligne suivante :

SUBSYSTEM=="usb", ATTRS{idVendor}=="1e7d", ATTRS{idProduct}=="3246", MODE="0666"

Puis indiquez à udev qu'il doit prendre en compte vos changements:

sudo udevadm trigger

Il ne vous reste plus qu'à débrancher / rebrancher votre clavier pour que les nouveaux paramètres soient effectifs.

Utiliser suorafxctl

L'outil s'utilise très simplement en ligne de commande. Pour obtenir l'aide vous pouvez taper la commande suivante :

suorafxctl --help
usage: suorafxctl [-h] [-e EFFECT] [-s 0-10] [-b 0-50] [-c COLOR] [-r]

optional arguments:
  -h, --help            show this help message and exit
  -e EFFECT, --effect EFFECT
                        Illumination effect (full-lit, breathing, color-shift,
                        wave-right, wave-left, wave-up, wave-down, fade-out,
                        fade-in, ripple, rain, snake, spiral, game-over,
                        scanner, radar)
  -s 0-10, --speed 0-10
                        Illumination effect speed, from 0 (fast) to 10 (slow)
  -b 0-50, --brightness 0-50
                        keyboard brightness, from 0 (light off) to 50
  -c COLOR, --color COLOR
                        Illumination color (red, green, yellow, blue, aqua,
                        purple, white)
  -r, --reset           reset all settings to their default

The first call to this command will reset all unspecified settings to their
default value

Par exemple, si vous souhaitez définir une couleur bleue statique et moyennement lumineuse sur le clavier, vous pouvez passer les paramètres suivants :

suorafxctl --effect full-lit --brightness 25 --color blue

Conclusion

L'outil Roccat Swarm permet beaucoup d'autres personnalisations pour le Suora FX (enfin lorsque l'on arrive à le faire fonctionner 🙄️), mais je me contenterai de ces quelques options basiques dans suorafxctl. Elles sont suffisantes pour le but recherché : préserver sa rétine des déferlantes arc-en-ciel du clavier. 🦄️

J'espère en tout cas que cet article et que cet outil pourront vous être utiles. Je vous retrouve dans pas trop longtemps (enfin j'espère) pour un nouvel article ! 😉️