# Automatiser ses volets roulants
## Matériel
La maison dans laquelle je vis possède des volets roulants électriques, avec des télécommandes (une par volet). Aucune des télécommandes ne permet de fermer ou d'ouvrir tout les volets en même temps, celles-ci restent donc la plupart du temps accrochées à leur volet.
J'ai vu ce type de volets et télécommandes chez des amis aussi mais sans système centralisé, enfin a moins de disposer l'ensemble des télécommandes dans un tiroir unique mais ce n'est pas l'idéal.
Mes volets / télécommandes sont de marque Somfy, et après quelques recherches sur Internet j'ai trouvé que celles-ci pouvaient s'interfacer avec le boitier [RFXtrx433E](http://www.rfxcom.com/RFXtrx433E-USB-43392MHz-Transceiver/en) de chez RFXCOM. J'en ai donc acheté un (environ 110€, chez [Domadoo](http://www.domadoo.fr/fr/interface-domotique/2561-rfxcom-interface-rfxtrx433e-usb-avec-recepteur-et-emetteur-43392mhz-compatible-somfy-rts.html)).
J'ai également à la maison un [raspberry pi](https://www.raspberrypi.org/) (vieux) et une [cubieboard2](http://cubieboard.org), sur laquelle j'ai branché le boitier RFXtrx433E pour automatiser la gestion des volets.
## Prise en main
Le boitier RFXtrx433E viens avec peu de [softs](http://www.rfxcom.com/epages/78165469.sf/en_GB/?ObjectPath=/Shops/78165469/Categories/Downloads) (un sous Windows pour les firmwares, un autre sous Windows aussi pour le contrôle) mais cela permet de tester la bestiole.
Il est par contre à priori bien supporté par les différentes solutions / distributions domotiques, mais je n'ai pas testé cela.
Pour appairer ses volets et tester une première fois, le soft fourni [RFXmngr](http://www.rfxcom.com/WebRoot/StoreNL2/Shops/78165469/MediaGallery/Downloads/RFXmngrSetup.exe) est trè simple d'utilisation. On trouve assez facilement des tutos à ce sujet :
ex: http://blog.domadoo.fr/2014/06/06/appairer-volet-roulant-somfy-rfxcom-rfxtrx433e/
N'oubliez pas non plus de mettre le firmware de votre RFXtrx433E à jour !
## Contrôle sous Linux
Une fois que votre volet monte et descend en utilisant RFXmngr, voyons comment le faire fonctionner sous Linux, **en command-line**. Ma CubieBoard étant headless, un soft graphique ne me servira a rien. Le soft qui m'a paru le plus abouti (à ce jour) est [RFXcmd](https://github.com/ssjoholm/rfxcmd_gc), une lib Python, testée sur un Raspberry Pi et Debian, parfait donc.
Cette lib permet de gérer quasiment tout les protocoles pris en compte par le boîtier RFXtrx433E. L'implémentation du protocole Somfy RTS souffre par contre d'un bug, il faudra donc intégrer un petit patch avant de pouvoir utiliser RFXcmd.
```markdown
$ git clone https://github.com/ssjoholm/rfxcmd_gc
$ wget https://www.warcow.org/domotique/rfxcmd.py.patch
$ patch -p0 rfxcmd_gc/rfxcmd.py < rfxcmd.py.patch
```
La librairie RFXcmd est un peu avare en documentation et en exemples, mais on s'en sort quand même en lisant le code... Voici comment décomposer une commande Somfy RTS envoyée à RFXcmd :
```markdown
$ cd rfxcmd_gc/
$ sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050103A100000000" -v
```
Cette commande permet d'envoyer la valeur *0D1A00200104050103A100000000* au boitier, et c'est cette valeur que nous allons décomposer :
```markdown
"0D1A00200104050103A100000000"
0D : longueur de la chaine (14 octets)
1A : type de trame (RTS)
00 : subtype RTS
20 : sequence number
010405 : code volet (defini lors de l'appairage)
01 : unitcode
03 : ordre (monter / descendre / stop)
A1 : signal level
00000000 : padding
```
La partie qui nous intéresse est donc le **code volet** et la **commande**. Pour les volets Somfy de ma maison, 3 commandes me sont utiles :
```markdown
00 : stop
01 : up
03 : down
```
En modifiant la chaine envoyée a votre volet avec le code de celui-ci, et un ordre, votre volet devrait se mettre en mouvement. Le *-v* permet d'avoir du debug.
```markdown
$ sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050101A100000000" -v
RFXCMD Version 0.3 (739)
------------------------------------------------
Send = 0D 1A 00 20 01 04 05 01 01 A1 00 00 00 00
Date/Time = 2016-01-25 13:24:25
Packet Length = 0D
Packettype = RTS
RTS packet
Subtype = RTS
Seqnbr = 20
Id1-3 = 010405
Unitcode = 01
Command = 01 / Up
Signal level = 10
------------------------------------------------
Received = 04 02 01 20 00
Date/Time = 2016-01-25 13:24:26
Packet Length = 04
Packettype = Receiver/Transmitter Message
Subtype = Transmitter response
Seqnbr = 20
Message = ACK, transmit OK
```
## Automatisation
Une fois que nos volets peuvent être controllés indépendamment vie RFXcmd, on peut scripter un truc pour monter l'ensemble de nos volets, a heure fixe ou avec un petit random et en fonction de l'horaire du lever du soleil par exemple ...
Voici deux petits scripts rapides pour monter et descendre mes volets :
* up.sh : *
```markdown
#!/bin/bash
#
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
cd /path/to/rfxcmd_gc
STATFILE="volets.status"
STATE=$(cat $STATFILE)
if [ -f .lock ]; then
exit 0
fi
trap "[ -f .lock ] && rm -f .lock" EXIT
sunrise=$(curl -s http://domogeek.entropialux.com/sun/annecy/sunrise/now)
date_now=$(date +%s)
date_sunrise=$(date -d $sunrise +%s)
function up() {
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050101A100000000"
sleep 10
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050201A100000000"
sleep 10
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050301A100000000"
}
touch .lock
if [ $date_now -gt $date_sunrise ] && [[ "$STATE" == "down" ]]; then
sleep $(((RANDOM%30)*60))
logger -t "domotique" "Ouverture des volets"
up
echo "up" > $STATFILE
fi
rm -f .lock
```
* down.sh : *
```markdown
#!/bin/bash
#
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
cd /path/to/rfxcmd_gc
STATFILE="volets.status"
STATE=$(cat $STATFILE)
if [ -f .lock ]; then
exit 0
fi
trap "[ -f .lock ] && rm -f .lock" EXIT
sunset=$(curl -s http://domogeek.entropialux.com/sun/annecy/sunset/now)
date_now=$(date +%s)
date_sunset=$(date -d $sunset +%s)
function down() {
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050103A100000000"
sleep 10
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050203A100000000"
sleep 10
sudo ./rfxcmd.py -d /dev/ttyUSB0 -s "0D1A00200104050303A100000000"
}
touch .lock
if [ $date_now -gt $date_sunset ] && [[ "$STATE" == "up" ]]; then
sleep $(((RANDOM%30)*60))
logger -t "domotique" "Descente des volets"
down
echo "down" > $STATFILE
fi
rm -f .lock
```
Et une petite tàche cron pour lancer ces commandes toutes les 5 minutes :
```markdown
# volets
*/5 7-9 * * * user /path/to/rfxcmd_gc/up.sh
*/5 17-22 * * * user /path/to/rfxcmd_gc/down.sh
```
Mes volets s'ouvrent donc le matin dans un délais de 30 minutes après le lever du soleil, mais pas avant 7h. Ils se ferment le soir maximum 30 minutes après le coucher du soleil.
## Fin
On pourra bien évidement améliorer le système, les heures d'ouverture en semaine et le week-end par exemple etc...