isno.fr

Piloter ses volets Profalux dans Home Assistant

Piloter mes volets roulants Profalux 868 MHz depuis Home Assistant, en local, sans la clé constructeur. Tout est open source et reproductible de deux façons : un ESP32 avec un module CC1101 pour une quinzaine d'euros, ou une carte intégrée, la Super v1.0, dont les fichiers de fabrication sont publiés.

Code : github.com/Isno-Open/OpenProfalux

🔒 Brouillon - visible uniquement en réseau local
Piloter ses volets Profalux dans Home Assistant
La carte Super v1.0 nue, puis montée dans son boîtier imprimé. L'une des deux routes pour faire tourner OpenProfalux ; l'autre est un ESP32 et un module CC1101 câblés à la main.
Sommaire
  1. Le principe : cloner une télécommande, pas casser la crypto
  2. Route A : ESP32 + CC1101 (~15 €)
  3. Route B : faire produire la Super v1.0 (open hardware)
  4. Le flash (sans compiler)
  5. Premier démarrage et Wi-Fi
  6. L’intégration Home Assistant (MQTT)
  7. L’apprentissage des volets
  8. Compatibilité
  9. Sécurité de l’interface
  10. Pour reproduire

Mes volets roulants sont des Profalux 868 MHz (moteurs MAI-EMPX / MAI-EMNOE). Aucune passerelle officielle, aucun pont vers Home Assistant, et une télécommande en KeeLoq (code tournant) qu’on ne peut a priori pas rejouer. J’ai quand même voulu les piloter depuis Home Assistant, en local, sans cloud et sans tirer de fil.

Résultat : OpenProfalux, un firmware open source (GPL-3.0) qui tourne sur un ESP32 avec un petit module radio. Tout est publié et reproductible, et il y a deux façons de faire le matériel, toutes les deux ouvertes :

Dans les deux cas, c’est le même firmware et le même usage dans Home Assistant.

Ma télécommande murale Profalux MAI-EMPX, trois boutons montée / stop / descente, celle que le firmware va cloner

Le principe : cloner une télécommande, pas casser la crypto

J’ai d’abord cherché la clé constructeur pendant des jours. Puis j’ai testé la chose la plus bête : rejouer une trame déjà captée.

Le moteur l’accepte. Le compteur anti-rejeu du KeeLoq n’est pas vérifié par le récepteur : une trame capturée puis réémise fait bouger le volet, même après avoir utilisé la vraie télécommande entre-temps. Donc aucune clé n’est nécessaire pour piloter par rejeu.

OpenProfalux clone donc une télécommande : on capture les trames montée / stop / descente d’une vraie télécommande, on les nomme, et on les rejoue à la demande depuis Home Assistant.

Pour les moteurs récents, une seconde méthode est gérée : l’enrôlement. Le boîtier crée sa propre identité que le moteur apprend, puis génère lui-même ses trames à code tournant, sans rejouer les captures. C’est souvent le plus fiable selon la génération. Quelle méthode marche sur quel moteur ne se devine pas : le projet tient une table de compatibilité, une ligne par retour vérifié (marque, modèle, fréquence, méthode), alimentée par les issues et le forum, dans docs/COMPATIBILITE.md du dépôt.

Route A : ESP32 + CC1101 (~15 €)

Le montage accessible, à la portée de tous : un ESP32 et un module CC1101, reliés par quelques fils.

Gros plan d'un module CC1101 868 MHz, l'antenne ressort en cuivre visible

Un seul avertissement important : le CC1101 fonctionne en 3,3 V, jamais en 5 V.

Câblage, exemple ESP32-WROOM DevKit (profil external du dépôt) :

CC1101ESP32 (GPIO)
SCK18
MISO19
MOSI23
CS (CSN)5
GDO04
VCC3V3
GNDGND

GDO2 n’est pas utilisé. Chaque carte supportée est décrite par un fichier boards/<carte>.json dans le dépôt (M5 ATOM Lite, D1 mini, Olimex ESP32-POE ont un autre brochage) : le firmware lit ces broches, il n’en code aucune en dur.

Brochage du module CC1101 868 MHz : la sérigraphie nomme chaque pastille, Vcc, GND, MOSI, SCLK, MISO, GDO2, GDO0, CSN d'un côté, GND, ANT, GND de l'autre

Route B : faire produire la Super v1.0 (open hardware)

Pour une version intégrée et propre, j’ai dessiné une carte, la Super, et j’en ai publié la v1.0 (EVT) en open hardware. On peut la faire produire soi-même : le dépôt OpenSuperRF contient tout ce qu’un fabricant PCBA (JLCPCB, Aisler, PCBWay) demande, dans fab/ :

plus les sources KiCad complètes (hardware/super/) et un boîtier 3D imprimable (enclosures/boitier_super.stl). On commande ces trois fichiers chez le fabricant et on récupère la carte montée : la route est entièrement reproductible.

La Super v1.0 EVT annotée : connecteur SMA, ESP32-S3, les deux radios 433 et 868 MHz, mikroBUS, Qwiic, USB-C, boutons BOOT et RESET

La carte : ESP32-S3 en USB-C, deux radios CC1101 (433 et 868 MHz) réunies sur un seul SMA par un diplexeur LC, connecteurs Qwiic (I2C) et mikroBUS, boutons BOOT/RESET, 4 couches, 67 x 55 mm. Elle a été fabriquée, assemblée et mesurée (porteuses propres au tinySA, mesures dans le dépôt).

Un boîtier imprimé pour la Super : logo isno RF ajouré, repère EXT, grille de ventilation. Prototype conçu par @lecanard38

Le mikroBUS (J2) : l’adaptateur, jamais une nappe droite. Pour piloter des volets avec OpenProfalux, le mikroBUS n’est pas nécessaire, les deux radios sont déjà sur la carte. Si on s’en sert pour une extension, le brochage J2 de la v1.0 est inversé : une nappe IDC droite est destructrice (elle court-circuite les alimentations). Il faut l’adaptateur passif qui croise les signaux, lui aussi open source dans hardware/accessories/mikrobus-adapter (sources KiCad). Ce point et les autres (par exemple ne pas pousser le 433 pile à la limite réglementaire) sont détaillés dans le KNOWN_ISSUES.md du dépôt.

L'adaptateur et le riser mikroBUS de la Super, également publiés en open hardware

Le flash (sans compiler)

Le plus simple, sans installer ESP-IDF : prendre les binaires pré-compilés de la dernière release et flasher avec esptool (pip install esptool). Choisir le binaire qui correspond au matériel, les broches SPI diffèrent :

# Route A, ESP32 DevKit + CC1101 externe
esptool.py --chip esp32 -p /dev/ttyUSB0 --baud 460800 write_flash 0x0 openprofalux-external-full.bin

# Route B, Super v1.0 (ESP32-S3)
esptool.py --chip esp32s3 -p /dev/ttyUSB0 --baud 460800 write_flash 0x0 openprofalux-isno-super-full.bin

Sous Windows (PowerShell), remplacer -p /dev/ttyUSB0 par --port COM4. Si le câble USB coince (« Timed out waiting for packet »), retomber à --baud 115200, qui passe partout. Qui préfère compiler depuis les sources trouvera tout dans firmware/README.md et BUILD.md (ESP-IDF v6.1, ou la même commande via Docker ; le profil carte de la Super est -DBOARD=isno-super).

Mises à jour ensuite : pas besoin de câble, l’onglet OTA de l’interface accepte le binaire -ota, et le bootloader revient tout seul à la version précédente si une mise à jour plante.

Premier démarrage et Wi-Fi

  1. Sans Wi-Fi configuré, l’ESP32 ouvre un point d’accès ouvert OpenProfalux_XXXX.
  2. On s’y connecte : le portail captif s’ouvre tout seul (sinon http://192.168.4.1). Onglet Wi-Fi : réseau, mot de passe, nom du boîtier.
  3. Au redémarrage, le boîtier rejoint le réseau, joignable sur http://openprofalux-xxxx.local.

L’onglet Wi-Fi montre ensuite l’état de la connexion : réseau, signal, adresse sur le réseau. À noter, l’ESP32 ne voit que le 2,4 GHz, pas le 5 GHz.

Onglet Wi-Fi d'OpenProfalux : état de connexion, nom du réseau, mot de passe, nom du boîtier (valeurs masquées)

L’intégration Home Assistant (MQTT)

Dans l’onglet MQTT de l’interface, on renseigne l’adresse du broker. Le firmware publie alors ses entités par MQTT discovery : chaque volet apparaît tout seul dans Home Assistant comme une entité cover (ouvrir / fermer / stop / position en %). Rien à écrire dans configuration.yaml. Un bouton détecte même le broker en mDNS, et le TLS (mqtts://) est disponible.

Onglet MQTT d'OpenProfalux : adresse du broker, détection mDNS, utilisateur, TLS, nom de l'appareil pour Home Assistant (valeurs masquées)

L'interface web embarquée d'OpenProfalux, onglet Volets : une carte par volet avec montée / stop / descente et la position estimée

Pour piloter sans l’interface :

L’apprentissage des volets

Deux méthodes, dans l’onglet Télécommandes, à choisir selon le moteur (voir la compatibilité plus bas).

Rejeu : cloner une télécommande

Le cas le plus simple. On choisit un volet (ou on le crée), puis on capture une à une les commandes montée / stop / descente en appuyant sur la vraie télécommande, gardée à portée du boîtier. Une capture par commande suffit, et Home Assistant rejoue ensuite ces trames.

Onglet Cloner une télécommande d'OpenProfalux : capture de montée / stop / descente, une par bouton (noms de volets masqués)

Enrôlement : créer une télécommande virtuelle

Pour les moteurs qui refusent le rejeu (code tournant strict). Le boîtier crée sa propre identité et l’apprend au moteur. Il faut quand même la télécommande d’origine pour le geste de validation : on choisit le modèle de moteur, on lance, puis on appuie sur la vraie télécommande. Le boîtier reçoit une identité nouvelle si le moteur est inconnu, ou la même s’il est déjà connu. Ensuite il génère lui-même ses trames à code tournant, sans plus rejouer les captures.

Onglet Créer une télécommande virtuelle d'OpenProfalux : choix du modèle de moteur, puis appui sur la télécommande d'origine

Position : la calibration

Le moteur ne renvoie pas sa position. On la fait estimer par le temps de course : volet en butée haute, on lance une descente et on marque l’arrivée en bas, puis l’inverse pour la montée. La position en % apparaît alors dans Home Assistant, avec recalage aux butées.

Onglet Calibration d'OpenProfalux : mesure du temps de course (butée haute, descente, puis montée) pour estimer la position en %

Le boîtier suit aussi la vraie télécommande, et on peut associer plusieurs télécommandes à un même volet.

Compatibilité

Confirmé par des retours d’utilisateurs. La table ci-dessous est tenue à jour au fil des retours, directement depuis le dépôt :

La porteuse Profalux varie selon la génération (868,350 à 868,425 MHz) : pour un volet ancien ou une autre marque, la fréquence et le profil radio se règlent dans l’interface, onglet Système > Appareil. Le bouton Caler sur ma télécommande trouve la fréquence exacte que le boîtier reçoit. Les particularités de réglage (moteurs solaires, Eveno, FranciaFlex) sont détaillées dans docs/COMPATIBILITE.md.

Onglet Système > Appareil d'OpenProfalux : profil radio (marque des volets), fréquence active et bouton « Caler sur ma télécommande »

Le même boîtier sait aussi émettre en Somfy RTS (433,42 MHz) : appairage par le bouton PROG puis course complète en appui bref, validé sur un récepteur Somfy Soliris RTS (volet à lames orientables), voir l’issue #73 sur GitHub. À confirmer sur d’autres récepteurs. Il tente aussi l’io-homecontrol (Velux, Somfy io), qui n’est pas encore fonctionnel. Le cœur du projet reste Profalux.

Sécurité de l’interface

Le boîtier refuse les commandes qu’une page d’un autre site tenterait de lui faire exécuter via le navigateur (protection CSRF, réponse 403). Rien ne change pour l’interface, pour Home Assistant (MQTT ou REST) ni pour un script curl. Un mot de passe facultatif protège en plus l’accès à l’interface et à la sauvegarde.

Pour reproduire

Tout est ouvert et reproductible :

Les retours, captures d’autres moteurs et ajouts de cartes sont les bienvenus via les issues des dépôts.

Matériel

Prix indicatifs relevés au moment du projet. Aucun lien affilié - je ne touche rien.