Aller au contenu

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

Préambule | Soft sync | Data (56 bits) | Inter-frame gap

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

sudo raspi-config
# Interface Options → SPI → Enable

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

sudo apt install pilight
# Configurer /etc/pilight/config.json

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

  1. Appuyer 3 secondes sur PROG de la télécommande existante
  2. Le volet fait un va-et-vient
  3. Envoyer la commande PROG depuis le Raspberry Pi
  4. Le volet confirme l'appairage
# Appairage
send_command(new_address, 0, 0x8)  # Commande PROG

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) :

host: 192.168.1.26
port: 8844
tcp_keepalive_idle_timer: 600

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)
# 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