TEST
Les expériences à la con du week-end : épisode 17 - La Razer Base Station V3 Chroma... sur Mac
Il y a un peu plus d'un mois, alors que j'arpentais les allées business de la Gamescom avec mes deux camarades de salon, je me suis arrêté chez Razer pour découvrir un produit qui a immédiatement fait tilt dans mon petit coeur de bidouilleur ayant plein de trucs connectés dans mon appartement, la Base Station V3 Chroma. Et si vous avez suivi nos pérégrinations en audio ou à l'écrit, vous avez déjà une petite idée de ce qui m'intéresse dans ce produit et de ce que j'imaginais faire avec, puisqu'il s'agit d'un support "connecté" pour casque audio. L'heure du test est enfin arrivée, et je me suis dit que vu que j'avais envie de voir jusqu'où la bidouille allait me mener, une petite expérience à la con du weekend était la bienvenue.
Test réalisé avec un matériel fourni par le constructeur
Mais alors finalement, ça ressemble à quoi cette Base Station V3 Chroma ? Après l'assemblage de la base et de son mât à l'aide des deux vis fournies, on se retrouve avec un support pour casque tout bête, posé sur une base antidérapante de 150 mm. A l'arrière, on retrouve le port USB-C qui le connecte à un PC ou un Mac, deux ports USB-A 3.1 sur un hub intégré 5 Gb/s et à l'avant une bande LED verticale à 12 zones d’éclairage individuelles compatibles avec la "norme" Chroma RGB de Razer.
Enfin, la base intègre un DSP 7.1 surround qui permet d'activer un son surround simulé sur n'importe quel casque. Mais ce qui le différencie vraiment de son prédécesseur, c'est son détecteur d'état du casque, via le chapeau posé sur le mât de la base qui vient presser sur ce qui nous a tout l'air d'être une touche de clavier dans le mât. Ainsi la base repère les états, posé et retiré, puis les transmet au système. Le tout passe évidemment par l'application maison Razer Synapse qui se charge de piloter ce système de détection et les LEDs.

Mais alors finalement, ça ressemble à quoi cette Base Station V3 Chroma ? Après l'assemblage de la base et de son mât à l'aide des deux vis fournies, on se retrouve avec un support pour casque tout bête, posé sur une base antidérapante de 150 mm. A l'arrière, on retrouve le port USB-C qui le connecte à un PC ou un Mac, deux ports USB-A 3.1 sur un hub intégré 5 Gb/s et à l'avant une bande LED verticale à 12 zones d’éclairage individuelles compatibles avec la "norme" Chroma RGB de Razer.
Enfin, la base intègre un DSP 7.1 surround qui permet d'activer un son surround simulé sur n'importe quel casque. Mais ce qui le différencie vraiment de son prédécesseur, c'est son détecteur d'état du casque, via le chapeau posé sur le mât de la base qui vient presser sur ce qui nous a tout l'air d'être une touche de clavier dans le mât. Ainsi la base repère les états, posé et retiré, puis les transmet au système. Le tout passe évidemment par l'application maison Razer Synapse qui se charge de piloter ce système de détection et les LEDs.

A voir sur la photo, l'espace entre le mât et le chapeau qui vient pousser un switch mécanique lorsqu'on pose le casque
Razer vend ce système comme permettant des automatisations, comme par exemple, diffuser certaines couleurs sur la Chroma RGB de la base + activer un profil de jeu particulier sur Synapse + lancer un jeu lorsqu'on retire un casque de la base. Sur le papier, la liste des fonctionnalités listées par le fabricant est la suivante :
- Activer un profil Synapse personnalisé (qui permet de configurer automatiquement la précision ou la configuration des boutons sur une souris Naga, des contrôles sur un clavier Huntsman, etc.)
- Changer les couleurs de la Chroma RGB (sur la base et/ou tout autre périphérique Razer compatible et configuré sur Synapse)
- Configurer des macros clavier (sur un périphérique Razer compatible et configuré sur Synapse)
- Basculer l'entrée audio utilisée
- Lancer un jeu
Quelques fonctions rigolotes, mais quand même un peu trop liées à l'écosystème Razer. Je m'attendais à pouvoir pousser un peu les automatisations, pour par exemple pouvoir contrôler mes éclairages Philips Hue, couper la musique en cours, etc. Qu'à cela ne tienne, je me suis tout de même lancé dans l'aventure pour voir si je ne pouvais pas tordre les fonctionnalités à mon avantage. J'installe Synapse pour Mac avant de brancher la base sur mon Mac. Et là c'est le drame.

Circulez, y'a rien à voir sur Mac
Le constat est sans appel : comme à peu près 90 % du catalogue Razer, la Base Station V3 Chroma n'est pas reconnue par l'application Synapse pour Mac. Pire encore, alors que la V2 comportait encore une compatibilité Mac sur sa fiche produit, elle a carrément disparu de la V3. Bon, ça commence mal cette histoire. Pourtant, j'ai de l'espoir, car lorsque j'ai branché le périphérique, il a immédiatement été détecté comme un clavier par MacOS. Malgré tout, la configuration s'est arrêtée là, l'OS ne sachant pas identifier son layout, et pour cause.
Mais ça m'a permis de me rassurer sur deux choses. La première, c'est que mon intuition initiale sur le fonctionnement du chapeau poussoir de la base était bonne, il y a bien un switch derrière le mécanisme. La seconde, c'est que si macOS a "vu" un clavier là-dedans, je pourrais peut-être tirer quelque chose de la base en passant par la case rétro-ingénierie. Dans mon boulot, j'adore bidouiller des trucs et me lancer dans des projets bizarres. J'ai par exemple créé un robot de test de portiques d'embarquement à grand renfort de Python, OpenCV et PySerial, ou conçu une stack applicative interfacée avec une appli en serverless et hébergée sur des vieilles bécanes tournant 24/7 sous Windows XP Embedded, avec tout ce que ça comporte de galères.
Ce genre de défis, c'est mon dada au quotidien et je vois ici un nouveau terrain de jeu. Je me suis donc d'abord attaqué au diagnostic du périphérique. Pour ça, j'ai utilisé la librairie magique hid pour Python, qui se base sur hidapi qui permet d'interroger le système à propos de ses périphériques HID (claviers, souris, tout périphérique d'interface humain-machine en USB). Une fois la liste des périphériques affichée, je me suis rendu compte que la Razer Base Station V3 Chroma apparaissait en clair dans le système, et ce sans driver spécifique installé !
A partir de là, j'ai récupéré ses VID (Vendor ID) et PID (Product ID) et j'ai bricolé un script pour rester en écoute sur le périphérique, puis j'ai manuellement posé et retiré le casque plusieurs fois pour identifier les trames de données qui transitaient sur le port USB et isoler des patterns. Quelques minutes plus tard, j'étais capable d'afficher deux messages dans mon script Python lorsque je posais ou retirais mon casque. Pour la partie Chroma RGD, là j'ai joué les fainéants, car plusieurs projets GitHub comme razer-macos ont déjà "reverse-engineeré" toute cette partie-là, qui est commune à tous les périphériques de la marque. Ouf !

A partir de là, j'ai récupéré ses VID (Vendor ID) et PID (Product ID) et j'ai bricolé un script pour rester en écoute sur le périphérique, puis j'ai manuellement posé et retiré le casque plusieurs fois pour identifier les trames de données qui transitaient sur le port USB et isoler des patterns. Quelques minutes plus tard, j'étais capable d'afficher deux messages dans mon script Python lorsque je posais ou retirais mon casque. Pour la partie Chroma RGD, là j'ai joué les fainéants, car plusieurs projets GitHub comme razer-macos ont déjà "reverse-engineeré" toute cette partie-là, qui est commune à tous les périphériques de la marque. Ouf !

Et puis de toute façon, vous le savez si vous suivez mes tests matos, faire mumuse avec les lumières n'était pas ma priorité. Bref, avec ce premier proof-of-concept en place, j'avais déjà finalement tout le boulot le plus compliqué de fait. Il "restait juste" à faire une belle application macOS qui viendrait se loger dans la barre des menus et permettrait de lancer des actions au retrait ou à la pose du casque. Et pour cela, j'ai vite opté pour du vibe coding, pour plusieurs raisons. D'abord, ça fait très longtemps que j'avais envie de me lancer dans un petit projet IA, mais je m'étais toujours dit qu'il fallait que je trouve quelque chose d'original à faire, plutôt que de reproduire l'existant. Et puis je n'ai aucune notion de Swift ou autre langage orienté Apple. Enfin, et c'est aussi le but de cet article, je ne voulais pas passer plus d'une journée de taf, soit 8 heures, sur ce programme, pour voir ce que je pouvais faire en un weekend seulement. Je fais donc bouffer à l'IA une belle spécification fonctionnelle et les indications sur le périphérique, les données techniques que j'avais extraites de mon POC, etc.
Je vous passe les détails et l'aller-retour avec l'IA lors des problèmes au build de l'application, les hallucinations et une UI en sortie parfois douteuse, mais je suis assez rapidement arrivé à faire une première itération d'application vibe codée en Swift, proposant un menu "Actions simples" qui permettait d'effectuer plusieurs actions lorsqu'elle détecte que le casque a été retiré ou posé sur la base. Et ce sans toucher au firmware car je ne souhaitais pas risquer de briquer le périphérique pendant mon bricolage. Mieux encore, cette mouture allait déjà plus loin que ce que proposait Synapse, le tout en utilisant strictement les APIs systèmes offertes par macOS, sans dépendre de librairies tierces :
- Lancer ou fermer une application (ou un jeu)
- Changer les couleurs de la Chroma RGB
- Basculer l'entrée et/ou la sortie audio utilisée
- Ajuste le volume sonore
- Ouvrir un lien Internet
- Arrêter la musique en cours (sur un lecteur audio ou directement dans le navigateur)
- Afficher une notification système personnalisée
- Suspendre l'activité (mettre le Mac en veille)

Et pour le fun, quelques fonctionnalités geek qui me serviraient pour me connecter à ma maison connectée.
- Lancer une commande shell
- Exécuter un Applescript
- Appeler n'importe quelle API (avec ou sans authentification/payload)
Avec un panel d'actions pareil, j'avais déjà de quoi m'amuser, par exemple en me connectant à mon compte IFTTT, j'aurais même pu aller taper sur Google Home et jouer avec mes éclairages Hue, ma télé Android TV, et autres (avec un peu d'huile de coude). Seulement voilà, un petit truc me triturait l'esprit. Razer parle d'automatisations dans sa fiche produit, mais dans les faits, ce ne sont que des actions liées entre elles. Et si on allait plus loin pour proposer de véritables automatisations sous conditions ? Deux heures de vibe coding plus tard, j'ajoutais un menu "Automatisations" qui reprenait les déclencheurs (casque retiré/posé), la liste d'actions ci-dessus, mais rajoutait une ou plusieurs conditions obligatoires pour exécuter ces actions si et seulement si elles étaient remplies :
- Si telle ou telle application est ouverte/fermée
- Si le volume est supérieur/inférieur à telle valeur
- Si la sortie ou l'entrée audio est tel ou tel périphérique
- Si un périphérique particulier est connecté à l'un des ports USB du hub de la base
- Si tel ou tel port USB du hub de la base est utilisé
- Avant ou après le lever/coucher du soleil
- Avant ou après une heure précise
Avec ça, je décuplais les possibilités de mon application. Oh et oui, j'ai également réussi à isoler les deux ports USB du hub de la base (ça n'était pas une mince affaire à cause de leurs IDs) et les périphériques branchés dessus. Ce qui me permettait de configurer des automatisations rigolotes comme "Si j'ai ma journée de travail après 18 h, que Microsoft Teams est ouvert et que je repose le casque sur la base, alors tu bascules sur la sortie audio de mon écran et tu ouvres le site de Factor dans mon navigateur".


Une petite automatisation "Factor en fin de journée"
Quelques heures de bidouille plus tard, j'ai même rajouté des statistiques, un mode debug qui me permettait de simuler les changements d'état du casque, un logging complet et surtout une API interne à l'application. Grâce à ça, elle expose des données sur la base (état du casque retiré ou posé, date de dernier changement d'état, état et périphériques branchés sur les ports USB) à la demande, ce qui permet de carrément l'interfacer directement avec un Home Assistant ou autre logiciel tiers et ainsi d'en faire un VRAI produit connecté.
Alors certes, tout n'est pas parfait, mais en moins de 8 heures de temps, j'ai quelque chose de non seulement fonctionnel, mais exploitable et stable, car le programme tourne h24 sur mon Mac depuis déjà quelques jours. Evidemment, vibe coding oblige, toute la passe de QA a été zappée (tests aux limites, rétrocompatibilité avec les futurs OS). Subsistent quelques petits bugs comme la gestion de la Chroma RGB qui peut encore être améliorée, une interface qui elle aussi mériterait un petit coup de polish, mais le défi est réussi avec une application qui pèse moins de 3 Mo en sortie de cette expérience à la con du weekend. Et puis de toute manière, je n'avais pas envie d'en faire une version commerciale pour amasser des montagnes de pognon dans les caisses de Factor, pour ça il y a notre Tipeee et on vous en remercie.
Si je souhaitais y passer plus de temps, j'intégrerais probablement la gestion de l'énergie sur les ports USB du hub de la base pour par exemple pouvoir endormir les ports dans une automatisation. Je devrais également trouver le moyen de catcher les notifications d'applications tierces pour, par exemple, pouvoir changer la Chroma RGB lorsque je reçois un appel sur Teams, ou sur WhatsApp.

Si je souhaitais y passer plus de temps, j'intégrerais probablement la gestion de l'énergie sur les ports USB du hub de la base pour par exemple pouvoir endormir les ports dans une automatisation. Je devrais également trouver le moyen de catcher les notifications d'applications tierces pour, par exemple, pouvoir changer la Chroma RGB lorsque je reçois un appel sur Teams, ou sur WhatsApp.

Exemple de retour de l'appel à l'API interne
Je vous laisse jeter un oeil à mes screenshots en dessous de l'article pour voir à quoi ressemble l'application plus en détail.
Et pour en revenir au matos en lui-même et à ses fonctionnalités, car c'est à la base pourquoi je m'étais lancé dans son test, il fonctionne parfaitement et correspond totalement à mes attentes (lorsqu'on a le logiciel et les fonctionnalités pour l'exploiter, coucou les ingés de Razer). Le design est comme toujours impeccable avec du métal brossé, et des patins de qualité. J'émets quand même quelques doutes sur la durée de vie du mécanisme en dessous du chapeau. C'est d'ailleurs précisé dans l'emballage via un gros trigger warning que Razer ne sera pas responsable de la casse si l'on s'amuse à démonter et remonter le chapeau de la base régulièrement. Pas glop pour un matos vendu tout de même 90 euros. A part ça, rien à redire, si ce n'est l'absence de recharge QI sur la base, ce qui me semble bien dommage, tant elle prend de place sur le bureau. Peu importe le casque, il y a forcément un peu de place dessous pour y loger un smartphone à recharger. Razer en garde surement sous le capot pour une V4 dans deux ans.
Pour finir, ce qui m'interroge le plus en sortant de ce "test", c'est l'absence de support du machin sur Synapse pour Mac et globalement la pauvreté du support des autres périphériques Razer sur Mac, alors qu'il m'a fallu un peu moins de 8 heures pour sortir une application plus efficace que la leur, et sans leur documentation interne...
Pour finir, ce qui m'interroge le plus en sortant de ce "test", c'est l'absence de support du machin sur Synapse pour Mac et globalement la pauvreté du support des autres périphériques Razer sur Mac, alors qu'il m'a fallu un peu moins de 8 heures pour sortir une application plus efficace que la leur, et sans leur documentation interne...
















