Contrôle des volets Somfy RTS¶
Vue d'ensemble¶
Le Raspberry Pi contrôle les volets roulants Somfy via le protocole RTS (Radio Technology Somfy) à 433.42 MHz.
Matériel¶
Émetteur radio¶
- Type : Transmetteur 433.42 MHz (attention, pas 433.92 MHz standard)
- Options :
- Module CC1101 (recommandé, SPI)
- RFLink avec Mega 2560
- RFXCOM RFXtrx433XL (USB, plug & play)
Antenne¶
- Antenne 433 MHz λ/4 (17.3 cm de fil)
Protocole RTS¶
Le protocole Somfy RTS utilise : - Fréquence : 433.42 MHz (pas 433.92 MHz!) - Modulation : OOK (On-Off Keying) - Rolling code : Code tournant pour la sécurité
Structure de la trame¶
Data (56 bits) : - Key (8 bits) : Clé d'encryption - Ctrl (4 bits) : Commande - CRC (4 bits) : Checksum - Address (24 bits) : Adresse télécommande - Rolling code (16 bits) : Code tournant
Commandes (Ctrl)¶
| Code | Commande |
|---|---|
| 0x1 | My (stop/favori) |
| 0x2 | Up (monter) |
| 0x4 | Down (descendre) |
| 0x8 | Prog |
Configuration avec CC1101¶
Câblage SPI¶
| CC1101 | Raspberry Pi |
|---|---|
| VCC | 3.3V (Pin 1) |
| GND | GND (Pin 6) |
| MOSI | GPIO10/MOSI (Pin 19) |
| MISO | GPIO9/MISO (Pin 21) |
| SCK | GPIO11/SCLK (Pin 23) |
| CSN | GPIO8/CE0 (Pin 24) |
| GDO0 | GPIO25 (Pin 22) |
| GDO2 | GPIO24 (Pin 18) |
Activation SPI¶
Logiciel¶
Option 1 : RFM69-OOK-PYTHON¶
git clone https://github.com/matthijskooijman/rfm69-ook-python
cd rfm69-ook-python
pip3 install spidev RPi.GPIO
Option 2 : Pilight¶
Option 3 : RFLink (Arduino)¶
Si utilisation d'un RFLink sur Arduino Mega :
# Communication série
minicom -b 57600 -D /dev/ttyUSB0
# Commande RFLink
10;Somfy;ID;SWITCH;CMD;
# Ex: 10;Somfy;123456;1;UP;
Script Python de contrôle¶
#!/usr/bin/env python3
"""
Contrôle volets Somfy RTS via CC1101
Usage: python3 somfy_control.py <volet> <action>
"""
import sys
import json
from pathlib import Path
# Configuration des volets
VOLETS_CONFIG = Path('/home/pi/somfy/volets.json')
def load_config():
"""Charge la configuration des volets"""
if VOLETS_CONFIG.exists():
return json.loads(VOLETS_CONFIG.read_text())
return {}
def save_config(config):
"""Sauvegarde la configuration"""
VOLETS_CONFIG.write_text(json.dumps(config, indent=2))
def send_command(address, rolling_code, command):
"""
Envoie une commande RTS
À implémenter selon le matériel utilisé
"""
# TODO: Implémenter selon CC1101/RFLink/RFXCOM
pass
def control_volet(name, action):
"""Contrôle un volet par son nom"""
config = load_config()
if name not in config:
print(f"Volet '{name}' non trouvé")
return False
volet = config[name]
commands = {
'up': 0x2,
'down': 0x4,
'stop': 0x1,
'my': 0x1
}
if action not in commands:
print(f"Action '{action}' inconnue")
return False
success = send_command(
volet['address'],
volet['rolling_code'],
commands[action]
)
if success:
# Incrémenter le rolling code
volet['rolling_code'] += 1
save_config(config)
return success
if __name__ == '__main__':
if len(sys.argv) < 3:
print("Usage: somfy_control.py <volet> <up|down|stop>")
print("Volets: salon, chambre, cuisine, ...")
sys.exit(1)
success = control_volet(sys.argv[1], sys.argv[2])
sys.exit(0 if success else 1)
Configuration des volets¶
Fichier /home/pi/somfy/volets.json :
{
"salon": {
"address": "0x123456",
"rolling_code": 1000,
"description": "Volet baie vitrée salon"
},
"chambre": {
"address": "0x234567",
"rolling_code": 500,
"description": "Volet chambre principale"
},
"cuisine": {
"address": "0x345678",
"rolling_code": 750,
"description": "Volet fenêtre cuisine"
}
}
Appairage d'une nouvelle télécommande¶
- Appuyer 3 secondes sur PROG de la télécommande existante
- Le volet fait un va-et-vient
- Envoyer la commande PROG depuis le Raspberry Pi
- Le volet confirme l'appairage
Intégration Home Assistant¶
Via MQTT¶
# configuration.yaml
cover:
- platform: mqtt
name: "Volet Salon"
command_topic: "home/somfy/salon/set"
state_topic: "home/somfy/salon/state"
payload_open: "up"
payload_close: "down"
payload_stop: "stop"
Via shell_command¶
shell_command:
volet_salon_up: 'ssh pi@<IP_RPI> "python3 /home/pi/somfy/control.py salon up"'
volet_salon_down: 'ssh pi@<IP_RPI> "python3 /home/pi/somfy/control.py salon down"'
volet_salon_stop: 'ssh pi@<IP_RPI> "python3 /home/pi/somfy/control.py salon stop"'
Alternatives¶
RFXCOM RFXtrx433XL¶
- Plug & play USB
- Support natif Home Assistant
- Plus cher mais plus simple
Somfy TaHoma/Connexoon¶
- Solution officielle Somfy
- API cloud
- Intégration Home Assistant native
Statut¶
Statut : ✅ Opérationnel (migration boot NFS 2026-03-07)
Configuration Actuelle¶
Matériel en place¶
- Émetteur : RFLink sur Arduino Mega 2560
- Interface : USB CH340 (1a86:7523)
- Port USB physique : 1-1.5
- Symlink :
/dev/volets
Service systemd¶
Le RFLink est exposé via TCP grâce à socat :
# /etc/systemd/system/rflink-tcp.service
[Unit]
Description=RFLink to TCP Bridge (socat)
After=network.target dev-volets.device
Wants=dev-volets.device
[Service]
Type=simple
ExecStart=/usr/bin/socat /dev/volets,b57600,raw,echo=0 TCP-LISTEN:8844,reuseaddr,fork
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Configuration Home Assistant¶
RFLink (/config/.jeremie/rflink.yaml) :
Volets Somfy (/config/.jeremie/somfy.yaml) :
- platform: rflink
devices:
RTS_FAF22D_0:
name: Volet bureau
RTS_7DCE35_0:
name: Volet chambre
RTS_E32A50_0:
name: Volet studio
- platform: group
name: Volets bas
entities:
- cover.volet_chambre
- cover.volet_bureau
Volets configurés¶
| Volet | ID RTS | Entité Home Assistant |
|---|---|---|
| Bureau | RTS_FAF22D_0 |
cover.volet_bureau |
| Chambre | RTS_7DCE35_0 |
cover.volet_chambre |
| Studio | RTS_E32A50_0 |
cover.volet_studio |
| Groupe | - | cover.volets_bas (Bureau + Chambre) |
Commandes RFLink¶
# Test connexion (pas d'émission RF)
echo -e '10;PING;\r' | nc 192.168.1.26 8844
# Réponse : 20;XX;PONG;
# Commande volet (ATTENTION: actionne le volet)
# Format : 10;RTS;ID;SWITCH;CMD;
# Commandes : UP, DOWN, STOP, PAIR
# Réponse : 20;XX;OK; si acceptée
echo -e '10;RTS;FAF22D;0;UP;\r' | nc 192.168.1.26 8844
echo -e '10;RTS;FAF22D;0;DOWN;\r' | nc 192.168.1.26 8844
echo -e '10;RTS;FAF22D;0;STOP;\r' | nc 192.168.1.26 8844
# Lister les devices RTS enregistrés
echo -e '10;RTSSHOW;\r' | nc 192.168.1.26 8844
Rolling Code¶
Le rolling code est stocké dans l'EEPROM du RFLink Arduino. Il s'incrémente automatiquement à chaque commande envoyée. En cas de désynchronisation : 1. Appuyer 3 secondes sur PROG de la télécommande Somfy existante 2. Le volet fait un va-et-vient 3. Envoyer la commande PAIR depuis RFLink 4. Le volet confirme l'appairage