Repository navigation
Intégrations
Le but premier d'ESPSomfy-RTS n'est pas seulement de proposer une interface utilisateur, mais de servir de plateforme d'intégration pour vos volets vers d'autres systèmes.
- Commandes REST : Utilisation des commandes HTTP (GET, POST, PUT).
- Websockets : Notifications en temps réel lors des mouvements.
- MQTT : Connexion bidirectionnelle pour le contrôle et le retour d'état — documentée sur sa propre page.
- Home Assistant : Intégration native "clés en main" (raison d'être principale du projet).
L'interface REST permet le contrôle à distance via votre réseau. Le firmware écoute sur quatre ports différents, chacun avec un rôle précis :
| Port | Rôle |
|---|---|
| 80 | Le serveur complet : l'interface web elle-même et l'intégralité de l'API — y compris toute la configuration (pièces, équipements, groupes, plannings, réseau, sécurité, radio, langues…). |
| 8081 | Un sous-ensemble volontairement restreint, pensé pour une intégration tierce (le code cite nommément Home Assistant) qui n'a besoin ni de l'interface embarquée ni des écrans de configuration. C'est ce sous-ensemble que cette page documente en détail ci-dessous. |
| 8082 | Réservé aux opérations de mise à jour (téléchargement de firmware) — un serveur synchrone séparé, sans rapport avec le reste de l'API. |
| 8080 | Le canal WebSocket temps réel qui notifie l'interface des mouvements — pas du REST, mais le même rôle que /shades en continu plutôt qu'à la demande. |
Note
Tout ce qui est documenté ci-dessous fonctionne aussi bien sur le port 80 que sur le port 8081, les deux portant la même URL. Le port 80 propose en plus énormément d'autres points de terminaison (toute la configuration) qui ne sont pas couverts par cette page : ce sont ceux qu'utilise l'interface web elle-même, pas une surface pensée pour rester stable pour une intégration externe.
Si la sécurité est activée, un en-tête HTTP apikey est exigé — obtenu via GET|PUT|POST /login (voir plus bas). Ce n'est pas un jeton statique : c'est un HMAC-SHA256 calculé à
partir de vos identifiants et de votre adresse IP source, avec un secret propre à
l'appareil (généré une fois, jamais transmis). Concrètement : ce jeton n'est valable que
depuis la même adresse IP qui l'a obtenu — un changement d'IP (DHCP, VPN, proxy) en
nécessite un nouveau.
Deux niveaux de permission distincts existent, pas un seul :
- Les commandes de mouvement (
/shadeCommand,/groupCommand,/tiltCommand,/setPositions,/setSensor) sont de niveau « usage ». - La configuration (créer/modifier/supprimer un équipement, une pièce, un planning…) exige le niveau « configuration ».
Si le réglage de sécurité « Autoriser uniquement les réglages » (mode « Config Only »)
est actif, le niveau « usage » ne demande aucune clé du tout — seule la configuration
reste protégée. Par ailleurs, /shades, /groups et /controller masquent
remoteAddress, lastRollingCode et linkedRemotes à tout appelant qui n'est pas
authentifié au niveau configuration ; /discovery, lui, les masque toujours, quel que
soit le niveau d'authentification.
Important
Si vous activez la sécurité, un outil comme Postman ou curl devient nécessaire
pour fournir l'en-tête apikey — un navigateur seul ne suffit plus pour les commandes
protégées.
Sans sécurité activée, vous pouvez tester vos volets en tapant simplement une adresse dans votre navigateur web.
-
Exemple Adresse IP :
192.168.1.13 -
Port :
8081 -
ID du volet :
1
| Action souhaitée | URL à copier dans votre navigateur |
|---|---|
| Monter | http://192.168.1.13:8081/shadeCommand?shadeId=1&command=up |
| Descendre | http://192.168.1.13:8081/shadeCommand?shadeId=1&command=down |
| Arrêter (Stop) | http://192.168.1.13:8081/shadeCommand?shadeId=1&command=stop |
Retourne la configuration complète du contrôleur : limites, réglages radio, état de la mise à jour, et une référence de tous vos équipements/groupes/pièces/plannings.
| Paramètre | Retour | Méthode | Port | URL d'exemple |
|---|---|---|---|---|
| Aucun | JSON | GET |
80 ou 8081
|
http://192.168.1.13/controller |
Voir GET /shades et GET /groups pour le détail des objets qu'il contient.
Exemple de retour
{
"maxRooms": 16,
"maxShades": 32,
"maxGroups": 16,
"maxGroupedShades": 32,
"maxLinkedRemotes": 7,
"maxSchedules": 32,
"startingAddress": 656296,
"transceiver": {
"config": {
"type": 56,
"TXPin": 13,
"RXPin": 12,
"SCKPin": 18,
"MOSIPin": 23,
"MISOPin": 19,
"CSNPin": 5,
"rxBandwidth": 99.97000122,
"frequency": 433.4200134,
"txPower": 10,
"proto": 0,
"enabled": true,
"radioInit": true,
"radioBoardType": 0
}
},
"version": {
"available": false,
"status": 0,
"error": 0,
"cancelled": false,
"checkForUpdate": true,
"inetAvailable": true,
"fwVersion": { "name": "v3.0.0", "major": 3, "minor": 0, "build": 0, "suffix": "" },
"appVersion": { "name": "3.0.0", "major": 3, "minor": 0, "build": 0, "suffix": "" },
"latest": { "name": "v3.0.0", "major": 3, "minor": 0, "build": 0, "suffix": "" }
},
"rooms": [],
"shades": [],
"groups": [],
"repeaters": [],
"schedules": []
}Note
Le champ deviation, présent dans d'anciennes versions, n'existe plus dans cette sortie —
voir Configurer la Radio
pour l'explication complète.
Une version allégée de /controller, pensée pour qu'une intégration tierce identifie
l'appareil sans télécharger toute sa configuration radio.
| Paramètre | Retour | Méthode | Port | URL d'exemple |
|---|---|---|---|---|
| Aucun | JSON | GET |
80 ou 8081
|
http://192.168.1.13:8081/discovery |
-
authType— type d'authentification requis :0aucune,1code PIN,2nom d'utilisateur/mot de passe. -
permissions— masque de bits :0x00tout protégé,0x01seule la configuration l'est (mode « Config Only »). -
connType—"Wifi","Ethernet", ou"Unknown"(point d'accès / pas encore connecté). C'est la connexion réellement active, pas la préférence configurée : un appareil réglé en « Ethernet préféré » mais actuellement replié sur le Wi-Fi renverra"Wifi". -
memory—max/free/min/total(octets de tas) etlargest(plus grand bloc contigu disponible — un indicateur de fragmentation mémoire, absent des versions antérieures).
Exemple de retour
{
"serverId": "49E4AC",
"version": "v3.0.0",
"latest": "v3.0.0",
"model": "ESPSomfyRTS",
"hostname": "ESPSomfyRTS",
"authType": 0,
"permissions": 0,
"chipModel": "",
"connType": "Wifi",
"checkForUpdate": true,
"memory": { "max": 110580, "free": 164008, "min": 110924, "total": 266040, "largest": 98304 },
"rooms": [],
"shades": [],
"groups": []
}Note
Sur /discovery, shades et groups masquent toujours remoteAddress,
lastRollingCode et linkedRemotes, même authentifié — c'est volontaire et ne dépend
d'aucun réglage.
Envoie une commande à tous les volets d'un groupe simultanément.
-
groupId— identifiant du groupe [1-14] (0 et 15 sont réservés en interne, jamais attribués). -
command— voir la liste complète des commandes sous/shadeCommandci-dessous ; les mêmes alias s'appliquent. -
repeat— nombre de répétitions.repeat=0est ici respecté explicitement (contrairement à/shadeCommand, voir plus bas) : 1 trame est envoyée, sans répétition. -
stepSize— comme pour/shadeCommand(équipements 80 bits).
GET /groupCommand?groupId=1&command=up — ouvre tous les volets du groupe.
Référence JSON du groupe.
Tableau des groupes configurés.
Exemple de retour
[
{
"groupId": 1,
"roomId": 0,
"name": "Rez-de-chaussée",
"remoteAddress": 515023,
"lastRollingCode": 120,
"bitLength": 56,
"proto": 0,
"sunSensor": false,
"flipCommands": false,
"ledFeedback": false,
"flags": 0,
"repeats": 0,
"sortOrder": 1,
"linkedShades": [
{ "shadeId": 1, "roomId": 0, "name": "Volet Salon", "shadeType": 4, "proto": 0, "bitLength": 56 }
]
}
]Depuis v3.0.0, linkedShades contient les objets allégés des équipements membres (pas
seulement leurs identifiants) — mêmes champs que la forme masquée de GET /shades.
Échange vos identifiants contre une clé apikey à fournir dans l'en-tête des requêtes
suivantes.
-
pin— si l'authentification est par code PIN. -
username/password— si l'authentification est par identifiant.
GET /login?pin=1234
-
type— type d'authentification utilisé. -
success—true/false. -
msg— message lisible. -
apiKey— HMAC-SHA256 hexadécimal (64 caractères), à renvoyer tel quel dans l'en-têteapikeyde chaque requête protégée suivante.
Exemple de retour
{
"type": 1,
"success": true,
"msg": "Login successful",
"apiKey": "9b92ba08950cd40451eeb41d8e137e3c35bc6dc6ed0b695f7a4724cfc0ba702f"
}Warning
Protection anti-force brute : 3 tentatives libres par adresse IP, puis un verrouillage
qui double à chaque échec (15 secondes → jusqu'à 15 minutes), avec une réponse HTTP 429
précisant soit le nombre de tentatives restantes, soit le délai d'attente (retryAfter).
Le compteur se réinitialise après 15 minutes sans nouvelle tentative. Une réponse 503
signale que l'appareil manque temporairement de mémoire pour calculer le jeton — réessayez.
Envoie une commande à un équipement identifié.
-
shadeId— identifiant [1-30] (0 et 31/32 sont réservés en interne). -
command— l'une des valeurs suivantes (insensibles à la casse) :My,Up,MyUp,Down,MyDown,UpDown,MyUpDown,Prog,SunFlag,StepUp,StepDown,Flag,Sensor,Toggle,Favorite,Stop. Des préfixes courts existent pour la plupart (u→Up,d→Down,m→My,p→Prog,mu→MyUp,md→MyDown,ud→UpDown,mud→MyUpDown,su→StepUp,sd→StepDown,f→Flag,s→SunFlag,t→Toggle,fav→Favorite) — mais pasStop, qui n'a pas d'alias court : tapez-le en entier. -
target— pourcentage cible [0-100], alternative àcommand. -
repeat— nombre de répétitions supplémentaires (1 trame de base +repeattrames). -
stepSize— [1-127], pour les commandes d'étape sur équipements 80 bits.
GET /shadeCommand?shadeId=1&command=up — ouvre complètement.
GET /shadeCommand?shadeId=1&target=50 — déplace à 50%.
Caution
Une commande non reconnue ne génère aucune erreur : elle retombe silencieusement sur
My. Vérifiez l'orthographe de vos intégrations plutôt que de vous fier à un message
d'erreur qui ne viendra pas.
Note
repeat=0 envoyé explicitement n'est pas respecté ici : l'appareil retombe sur le
nombre de répétitions mémorisé pour cet équipement (1 par défaut). Pour forcer une seule
trame sans répétition via l'API, utilisez /groupCommand ou /repeatCommand, qui eux
respectent repeat=0 explicitement — une incohérence entre routes, à garder en tête.
Référence JSON de l'équipement.
Tableau de tous les équipements configurés.
-
shadeType[0-16] :0Store enrouleur,1Store vénitien,2Rideau (gauche),3Store banne,4Volet,5Garage (1 bouton),6Garage (3 boutons),7Rideau (droit),8Rideau (central),9/10Contact sec,11-13Portail (gauche/centre/ droit),14-16Portail 1 bouton (gauche/centre/droit). -
tiltType[0-4] :0Aucun,1Moteur d'inclinaison séparé,2Mécanisme intégré,3Inclinaison uniquement,4Mode Europe (nouveau, absent des versions antérieures). -
direction[-1/0/1] : monte / arrêté / descend.tiltDirection[-1/0/1] : sens horaire / arrêté / antihoraire — une sémantique différente dedirection, à ne pas confondre. -
flags(masque de bits) :0x01SunFlag activé,0x02capteur de soleil présent,0x04mode démo,0x10il y a du vent,0x20il y a du soleil,0x80position My simulée (ces deux derniers bits sont nouveaux par rapport aux versions antérieures). -
tiltTimeUp/tiltTimeDown— remplacent l'ancien champ uniquetiltTime: les durées de montée et de descente de l'inclinaison peuvent désormais différer. -
linkedRemotes— tableau des télécommandes liées.
Exemple de retour
[
{
"shadeId": 4,
"roomId": 0,
"name": "Volet Salon",
"remoteAddress": 515025,
"upTime": 10000,
"downTime": 10000,
"paired": true,
"lastRollingCode": 4,
"position": 32,
"tiltType": 0,
"tiltPosition": 0,
"tiltDirection": 0,
"tiltTimeUp": 7000,
"tiltTimeDown": 7000,
"stepSize": 100,
"tiltTarget": 0,
"target": 32,
"myPos": -1,
"myTiltPos": -1,
"direction": 0,
"shadeType": 0,
"bitLength": 56,
"proto": 0,
"flags": 0,
"flipCommands": false,
"flipPosition": false,
"inGroup": false,
"sunSensor": false,
"repeats": 0,
"sortOrder": 1,
"linkedRemotes": [
{ "remoteAddress": 4886595, "lastRollingCode": 14415 }
]
}
]Incline les lames d'un équipement capable d'inclinaison.
-
shadeId— [1-30]. -
command— recommandé :My,Up,Down,StepUp,StepDown(les mêmes alias que/shadeCommandsont techniquement acceptés mais sans effet pertinent sur l'inclinaison). -
target— cible [0-100], alternative àcommand.
Note
Contrairement à /shadeCommand, cette route n'accepte ni repeat ni stepSize — tout
paramètre de ce type envoyé ici est simplement ignoré.
Référence JSON de l'équipement.
Recale la position enregistrée d'un équipement sans émettre aucune trame radio — utile si un capteur externe (fin de course, contact magnétique) vous dit où le volet se trouve réellement, pour resynchroniser l'affichage sans bouger le moteur.
-
shadeId,position[0-100],tiltPosition[0-100] —tiltPositionn'a d'effet que si l'équipement a un type d'inclinaison différent de « Aucun ».
GET /setPositions?shadeId=1&position=50
Warning
Le nom du paramètre est bien position — pas liftPosition, qui ne fait rien
(ignoré silencieusement s'il est envoyé par erreur).
Référence JSON de l'équipement.
Simule un capteur Sunis (soleil) ou Eolis (vent) pour un équipement ou un groupe. Ne déclenche pas de mouvement immédiat : l'appareil mémorise l'état transmis, et c'est sa boucle interne qui décide ensuite de bouger, après les délais suivants — à condition que le réglage « Sun Flag » soit actif sur l'équipement concerné :
| Condition | Délai avant réaction |
|---|---|
| Vent détecté → rétractation | 2 secondes de vent continu |
| Fin du vent → nouveau déploiement possible | 12 minutes de calme continu |
| Soleil détecté → déploiement | 2 minutes de soleil continu |
| Fin du soleil → rétractation | 20 minutes sans soleil |
-
shadeIdOUgroupId,sunny(0/1),windy(0/1),repeat.
GET /setSensor?shadeId=1&windy=1 — signale du vent à l'équipement 1.
Référence JSON de l'équipement ou du groupe ciblé.
Ces routes existent et sont, elles aussi, disponibles sur le port 8081 comme les précédentes, mais ne sont pas détaillées ici (structures plus proches de la configuration interne, moins stables dans le temps) :
| Route | Rôle |
|---|---|
GET /rooms, GET /room
|
Liste des pièces, ou une pièce précise |
GET /schedules, GET /schedule, POST /saveSchedule
|
Lecture et écriture des plannings |
GET /shade, GET /group
|
Un équipement ou un groupe précis (plutôt que le tableau complet) |
POST /repeatCommand |
Commande adressée à un répéteur radio |
POST /backup |
Génère un fichier de sauvegarde (identique au bouton Sauvegarder) |
POST /downloadFirmware, POST /reboot
|
Déclenche une mise à jour, ou un redémarrage |
Note
Le port 80 expose en plus la totalité de l'API interne qu'utilise l'interface web elle-même (création/modification/suppression de pièces, équipements, groupes, plannings, réglages réseau, sécurité, radio, langues…). Elle n'est pas couverte par cette page : contrairement au sous-ensemble du port 8081, rien ne garantit sa stabilité d'une version à l'autre.
Documentation déplacée sur sa propre page : voir MQTT.
L'intégration de ESPSomfy-RTS dans Home Assistant n'est pas seulement une option, c'est l'aboutissement logique de votre installation. Si ESPSomfy-RTS est le "cerveau" qui parle à vos moteurs, Home Assistant est le "chef d'orchestre" qui donne vie à votre maison.
L'utilisation de l'intégration dédiée (via HACS) transforme radicalement votre expérience utilisateur :
- Gestion Native des "Covers" : Vos volets sont reconnus comme des entités standards (objets "Cover"). Cela vous permet de les piloter à la voix via Alexa, Google Assistant ou Siri, de les intégrer à des interfaces tactiles élégantes ou de les commander depuis l'application mobile, que vous soyez dans votre salon ou à l'autre bout du monde.
-
Exemple d'automatisations Avancées : Ne vous contentez plus d'un simple bouton. Créez une maison qui anticipe vos besoins :
- Arrivée à la maison : Le portail et le garage s'ouvrent automatiquement dès que votre smartphone est détecté à 100 mètres de la maison.
- Simulation de Présence : Durant vos vacances, Home Assistant anime vos volets de façon aléatoire pour simuler une activité réelle et dissuader toute intrusion.
- Rythme Circadien : Programmez un réveil doux avec une ouverture progressive 10 minutes avant votre lever, et une fermeture automatique précise au coucher du soleil.
- Synchronisation Parfaite : Contrairement à une télécommande classique qui envoie un signal "dans le vide", cette intégration remonte l'état des volets en temps réel. De plus, chaque groupe créé dans ESPSomfy-RTS est instantanément importé dans Home Assistant avec toutes ses commandes associées.
- Indépendance Totale du Cloud : Tout le système fonctionne en réseau local. Pas de dépendance aux serveurs Somfy, pas de coupure en cas de panne internet et une latence quasi nulle. Vos volets répondent au doigt et à l'œil.
Une fois vos automatisations configurées pour répondre à vos scénarios de vie, vous n'aurez plus jamais besoin de chercher une télécommande. C'est un véritable "game changer" pour le confort de votre foyer, la technologie s'efface pour laisser place à un quotidien parfaitement fluide.
Si vous êtes un utilisateur de Home Assistant, oubliez les configurations manuelles fastidieuses ci-dessus. Rendez-vous sur le dépôt de l'intégration pour une installation simplifiée en quelques clics :
| Ressource | Lien de téléchargement |
|---|---|
| Dépôt Intégration | ESPSomfy-RTS enhanced pour Home Assistant |
Si vous utilisez actuellement l'intégration originale de rstrouse (ESPSomfy-RTS-HA), le système fonctionnera globalement. Cependant, un problème critique de suivi des versions se pose.
Les notes de version du firmware ne s'afficheront pas dans Home Assistant lorsqu'une mise à jour sera disponible.
Important
Pourquoi c'est critique ?
Depuis la v3.0.0, le firmware nécessite une mise à jour manuelle (deux fichiers distincts à téléverser). Sans les notes de version visibles, vous risquez de lancer une mise à jour automatique qui échouera.
Tip
Si vous mettez à jour depuis une version v2.5.3 à v2.5.8, un défaut de ces versions empêchait la fiche de découverte MQTT d'atteindre Home Assistant lorsqu'un root topic était configuré — corrigé en v3.0.0. Après la mise à jour, redémarrez Home Assistant une fois : HA garde en mémoire l'échec de découverte précédent et ne retente pas de lui-même tant qu'il n'a pas relu les fiches depuis le courtier.
Pour que l'intégration originale pointe vers le bon dépôt et affiche correctement les notes de mise à jour, vous devez modifier manuellement un fichier de l'intégration.
- Ouvrez le fichier suivant sur votre serveur Home Assistant :
/config/custom_components/espsomfy_rts/update.py - Repérez la fonction
release_urlaux alentours de la ligne 155. - Remplacez le bloc de code existant :
@property
def release_url(self) -> str | None:
"""URL to the full release notes of the latest version available."""
if (version := self.latest_version) is None:
return None
return f"https://github.com/rstouse/ESPSomfy-RTS/releases/tag/{version}"par
@property
def release_url(self) -> str | None:
"""URL to the full release notes of the latest version available."""
if (version := self.latest_version) is None:
return None
return f"https://github.com/xkain/ESPSomfy-RTS/releases/tag/{version}"et redemarrer Home Assistant