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 = fc7f00050001a00470047c019f019e04660196046c047b01a0019e0462047a01a50470019f046d0198046e019b019b046801a40468019d047201a40461047401b10480019c046c019804600198047701a2019f046f019d045f046901a8048f019a01a4046b019f04670476019c047001a1016c1a4801aa0486044b01a601b20476046e018f0191047a01880466048001940194048c045e019c047101a2047801a1046e019c019e048a015904970195048b018d046b04710189048501910489019104860185048b01870193048001960475047801b804660187018804ba015104ba04720182046701b801861a3e01830496046501860189047d04830191
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 (fc7f00050001a00470047c019f019e04660196046c047b01a0019e0462047a01a50470019f046d0198046e019b019b046801a40468019d047201a40461047401b10480019c046c019804600198047701a2019f046f019d045f046901a8048f019a01a4046b019f04670476019c047001a1016c1a4801aa0486044b01a601b20476046e018f0191047a01880466048001940194048c045e019c047101a2047801a1046e019c019e048a015904970195048b018d046b04710189048501910489019104860185048b01870193048001960475047801b804660187018804ba015104ba04720182046701b801861a3e01830496046501860189047d04830191) 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 = fc7f01060001900486018f04750473018e0194047d0494018c04780188047701890482018e01960485018d048401920472019104830483018d0479018c047d018904810190048b018e0198047c0197047a04720188047f018f019a049d019a0454049a0194045701cb015c1a58019c04830476018a018e04a1046501870189049b01850465047201c101830468047a0195049c01910483018b046c0187019104860192048f01920474018c04770489018f048f018d04760186047a018f048f018d019404800193047a047f01ba04650183018e0486019a0496044a01cc044a0194019a1a4701a10465047a019f01a2046c0471019a01a2046401a3046d
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 (fc7f01060001900486018f04750473018e0194047d0494018c04780188047701890482018e01960485018d048401920472019104830483018d0479018c047d018904810190048b018e0198047c0197047a04720188047f018f019a049d019a0454049a0194045701cb015c1a58019c04830476018a018e04a1046501870189049b01850465047201c101830468047a0195049c01910483018b046c0187019104860192048f01920474018c04770489018f048f018d04760186047a018f048f018d019404800193047a047f01ba04650183018e0486019a0496044a01cc044a0194019a1a4701a10465047a019f01a2046c0471019a01a2046401a3046d) 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 = dc7f020701048001a101a0046d0470019e047701a104710199046a019e019b046501a4049b015d04a001920480044d019f047101a0048d01a10470019b0471019b01a1045c019e0470048101a20476019b019e046601a404770486019b0476019901971a1301a20475048b01a101a0046b0469019a01a1046b019e046e047d01a4019b0465047d01a104890197046601980462019e01a2047101a3046c019d046b01a7049f045e01950462019c047c01a5047a019a0479019c019c0462019e0497045c019b046e01d5015f04aa0194045c047701a5048601a0016b2af8
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 (dc7f020701048001a101a0046d0470019e047701a104710199046a019e019b046501a4049b015d04a001920480044d019f047101a0048d01a10470019b0471019b01a1045c019e0470048101a20476019b019e046601a404770486019b0476019901971a1301a20475048b01a101a0046b0469019a01a1046b019e046e047d01a4019b0465047d01a104890197046601980462019e01a2047101a3046c019d046b01a7049f045e01950462019c047c01a5047a019a0479019c019c0462019e0497045c019b046e01d5015f04aa0194045c047701a5048601a0016b2af8) 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 fc7f00050001a00470047c019f019e04660196046c047b01a0019e0462047a01a50470019f046d0198046e019b019b046801a40468019d047201a40461047401b10480019c046c019804600198047701a2019f046f019d045f046901a8048f019a01a4046b019f04670476019c047001a1016c1a4801aa0486044b01a601b20476046e018f0191047a01880466048001940194048c045e019c047101a2047801a1046e019c019e048a015904970195048b018d046b04710189048501910489019104860185048b01870193048001960475047801b804660187018804ba015104ba04720182046701b801861a3e01830496046501860189047d04830191
sudo python3 rfxcmd.py -o config.xml -v -d /dev/ttyUSB0 -s fc7f01060001900486018f04750473018e0194047d0494018c04780188047701890482018e01960485018d048401920472019104830483018d0479018c047d018904810190048b018e0198047c0197047a04720188047f018f019a049d019a0454049a0194045701cb015c1a58019c04830476018a018e04a1046501870189049b01850465047201c101830468047a0195049c01910483018b046c0187019104860192048f01920474018c04770489018f048f018d04760186047a018f048f018d019404800193047a047f01ba04650183018e0486019a0496044a01cc044a0194019a1a4701a10465047a019f01a2046c0471019a01a2046401a3046d
sudo python3 rfxcmd.py -o config.xml -v -d /dev/ttyUSB0 -s dc7f020701048001a101a0046d0470019e047701a104710199046a019e019b046501a4049b015d04a001920480044d019f047101a0048d01a10470019b0471019b01a1045c019e0470048101a20476019b019e046601a404770486019b0476019901971a1301a20475048b01a101a0046b0469019a01a1046b019e046e047d01a4019b0465047d01a104890197046601980462019e01a2047101a3046c019d046b01a7049f045e01950462019c047c01a5047a019a0479019c019c0462019e0497045c019b046e01d5015f04aa0194045c047701a5048601a0016b2af8
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 = fc7f00050001a00470047c019f019e04660196046c047b01a0019e0462047a01a50470019f046d0198046e019b019b046801a40468019d047201a40461047401b10480019c046c019804600198047701a2019f046f019d045f046901a8048f019a01a4046b019f04670476019c047001a1016c1a4801aa0486044b01a601b20476046e018f0191047a01880466048001940194048c045e019c047101a2047801a1046e019c019e048a015904970195048b018d046b04710189048501910489019104860185048b01870193048001960475047801b804660187018804ba015104ba04720182046701b801861a3e01830496046501860189047d04830191
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 = fc7f01060001900486018f04750473018e0194047d0494018c04780188047701890482018e01960485018d048401920472019104830483018d0479018c047d018904810190048b018e0198047c0197047a04720188047f018f019a049d019a0454049a0194045701cb015c1a58019c04830476018a018e04a1046501870189049b01850465047201c101830468047a0195049c01910483018b046c0187019104860192048f01920474018c04770489018f048f018d04760186047a018f048f018d019404800193047a047f01ba04650183018e0486019a0496044a01cc044a0194019a1a4701a10465047a019f01a2046c0471019a01a2046401a3046d
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 = dc7f020701048001a101a0046d0470019e047701a104710199046a019e019b046501a4049b015d04a001920480044d019f047101a0048d01a10470019b0471019b01a1045c019e0470048101a20476019b019e046601a404770486019b0476019901971a1301a20475048b01a101a0046b0469019a01a1046b019e046e047d01a4019b0465047d01a104890197046601980462019e01a2047101a3046c019d046b01a7049f045e01950462019c047c01a5047a019a0479019c019c0462019e0497045c019b046e01d5015f04aa0194045c047701a5048601a0016b2af8
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