Je viens d’atteindre un premier résultat.
Sans arriver à vraiment faire le reverse-engineering du protocole, j’ai réussi à rejouer des trames capturées depuis ma télécommande!
Bon, c’est en ligne de commande pour le moment (pas via Home Assistant), avec l’outil GitHub - nbeguier/rfxcmd: RFXCMD v2.0.1 · GitHub
J’ai d’abord capturé les trames RF avec cet outil. Il a fallu créer un fichier config.xml (à partir du fichier config.xml.sample du repo git), en y passant simplement la valeur de protocol_startup à « yes » au lieu de « no », puis modifier le fichier procotol.xml pour passer la valeur de state à « 1 » au lieu de « 0 » pour le protocole « Undecoded ».
Ensuite on peut écouter les trames avec:
sudo ./rfxcmd.py -l -d /dev/ttyUSB0 -v -o config.xml
En appuyant sur le bouton « lumière » de ma télécommande, ça a affiché ça:
2026-04-22 21:32:12,859 - INFO - ------------------------------------------------
2026-04-22 21:32:12,860 - INFO - Received = fc7f...(longue chaine hexa de 508 caractères en tout)
2026-04-22 21:32:12,860 - INFO - Date/Time = 2026-04-22 21:32:12
2026-04-22 21:32:12,860 - INFO - Packet Length = fc
2026-04-22 21:32:12,862 - ERROR - unrecognizable packet (fc7...(longue chaine hexa de 508 caractères en tout)) Line: [read_rfx:944]
2026-04-22 21:32:12,862 - ERROR - '7f'
2026-04-22 21:32:12,921 - INFO - ------------------------------------------------
2026-04-22 21:32:12,921 - INFO - Received = fc7f...(longue chaine hexa de 508 caractères en tout)
2026-04-22 21:32:12,921 - INFO - Date/Time = 2026-04-22 21:32:12
2026-04-22 21:32:12,921 - INFO - Packet Length = fc
2026-04-22 21:32:12,922 - ERROR - unrecognizable packet (fc7f...(longue chaine hexa de 508 caractères en tout)) Line: [read_rfx:944]
2026-04-22 21:32:12,923 - ERROR - '7f'
2026-04-22 21:32:12,984 - INFO - ------------------------------------------------
2026-04-22 21:32:12,985 - INFO - Received = dc7f...(longue chaine hexa de 444 caractères en tout)
2026-04-22 21:32:12,985 - INFO - Date/Time = 2026-04-22 21:32:12
2026-04-22 21:32:12,985 - INFO - Packet Length = dc
2026-04-22 21:32:12,985 - ERROR - unrecognizable packet (dc7f...(longue chaine hexa de 444 caractères en tout)) Line: [read_rfx:944]
2026-04-22 21:32:12,986 - ERROR - '7f'
Donc j’ai pu récupéré les 3 paquets, au format hexadécimal.
Puis les rejouer, en enchainant dans un script:
sudo python3 rfxcmd.py -o config.xml -v -d /dev/ttyUSB0 -s fc7f...(longue chaine hexa de 508 caractères en tout)
sudo python3 rfxcmd.py -o config.xml -v -d /dev/ttyUSB0 -s fc7f...(longue chaine hexa de 508 caractères en tout)
sudo python3 rfxcmd.py -o config.xml -v -d /dev/ttyUSB0 -s dc7f...(longue chaine hexa de 444 caractères en tout)
Ca affiche les messages suivants, avec des erreurs « unrecognizable packet »:
2026-04-22 21:46:24,420 - INFO - Verbose printout [<module>:1626]
2026-04-22 21:46:24,420 - INFO - RFXCMD Version 2.0.1
2026-04-22 21:46:25,425 - INFO - ------------------------------------------------
2026-04-22 21:46:25,425 - INFO - Send = fc7f...(longue chaine hexa de 508 caractères en tout)
2026-04-22 21:46:25,426 - INFO - Date/Time = 2026-04-22 21:46:25
2026-04-22 21:46:25,426 - INFO - Packet Length = fc
2026-04-22 21:46:25,427 - ERROR - unrecognizable packet
2026-04-22 21:46:26,427 - INFO - ------------------------------------------------
2026-04-22 21:46:26,429 - INFO - Received = 0402010500
2026-04-22 21:46:26,429 - INFO - Date/Time = 2026-04-22 21:46:26
2026-04-22 21:46:26,429 - INFO - Packet Length = 04
2026-04-22 21:46:26,430 - INFO - Packettype = Receiver/Transmitter Message
2026-04-22 21:46:26,430 - INFO - Subtype: Transmitter response
2026-04-22 21:46:26,430 - INFO - Sequence number: 05
2026-04-22 21:46:26,430 - INFO - Message: ACK, transmit OK
{"timestamp": "2026-04-22 21:46:26", "rawcmd": "0402010500", "packettype": "Receiver/Transmitter Message", "packettype_id": "02", "subtype": "01", "seqnbr": "05", "metadata": {"id1": "00"}}
2026-04-22 21:46:26,539 - INFO - Verbose printout [<module>:1626]
2026-04-22 21:46:26,539 - INFO - RFXCMD Version 2.0.1
2026-04-22 21:46:27,544 - INFO - ------------------------------------------------
2026-04-22 21:46:27,544 - INFO - Send = fc7f...(longue chaine hexa de 508 caractères en tout)
2026-04-22 21:46:27,545 - INFO - Date/Time = 2026-04-22 21:46:27
2026-04-22 21:46:27,545 - INFO - Packet Length = fc
2026-04-22 21:46:27,546 - ERROR - unrecognizable packet
2026-04-22 21:46:28,547 - INFO - ------------------------------------------------
2026-04-22 21:46:28,547 - INFO - Received = 0402010600
2026-04-22 21:46:28,547 - INFO - Date/Time = 2026-04-22 21:46:28
2026-04-22 21:46:28,547 - INFO - Packet Length = 04
2026-04-22 21:46:28,547 - INFO - Packettype = Receiver/Transmitter Message
2026-04-22 21:46:28,547 - INFO - Subtype: Transmitter response
2026-04-22 21:46:28,547 - INFO - Sequence number: 06
2026-04-22 21:46:28,547 - INFO - Message: ACK, transmit OK
{"timestamp": "2026-04-22 21:46:28", "rawcmd": "0402010600", "packettype": "Receiver/Transmitter Message", "packettype_id": "02", "subtype": "01", "seqnbr": "06", "metadata": {"id1": "00"}}
2026-04-22 21:46:28,633 - INFO - Verbose printout [<module>:1626]
2026-04-22 21:46:28,633 - INFO - RFXCMD Version 2.0.1
2026-04-22 21:46:29,638 - INFO - ------------------------------------------------
2026-04-22 21:46:29,639 - INFO - Send = dc7f...(longue chaine hexa de 444 caractères en tout)
2026-04-22 21:46:29,639 - INFO - Date/Time = 2026-04-22 21:46:29
2026-04-22 21:46:29,639 - INFO - Packet Length = dc
2026-04-22 21:46:29,640 - ERROR - unrecognizable packet
2026-04-22 21:46:30,641 - INFO - ------------------------------------------------
2026-04-22 21:46:30,641 - INFO - Received = 0402010700
2026-04-22 21:46:30,641 - INFO - Date/Time = 2026-04-22 21:46:30
2026-04-22 21:46:30,642 - INFO - Packet Length = 04
2026-04-22 21:46:30,642 - INFO - Packettype = Receiver/Transmitter Message
2026-04-22 21:46:30,642 - INFO - Subtype: Transmitter response
2026-04-22 21:46:30,642 - INFO - Sequence number: 07
2026-04-22 21:46:30,643 - INFO - Message: ACK, transmit OK
{"timestamp": "2026-04-22 21:46:30", "rawcmd": "0402010700", "packettype": "Receiver/Transmitter Message", "packettype_id": "02", "subtype": "01", "seqnbr": "07", "metadata": {"id1": "00"}}
… mais ça change bien l’état de la LED de mon ventilo! ça l’allume si c’était éteint, et ça l’éteint si c’était allumé

Bon, évidemment, ce n’est qu’un petit début, mais c’est très encourageant, et donne quelques informations importantes:
- Il n’y a pas de commande ON ou OFF, mais une seule commande pour changer l’état de la LED (donc l’état est géré côté ventilo, pas côté télécommande)
- Il n’y aurait pas de rolling code? (Ou alors il est très permissif?). En tous cas, je peux utiliser la télécommande ou mon script: les deux semblent pouvoir fonctionner en parallèle