vendredi 28 mars 2014

RaspberryPi + Domotique X10 retour sur 1 an de fonctionnement

Suite à des échanges sur le forum français de Rapberrypi.org, j'ai décidé d'écrire ce billet pour relater nom cas d'usage en domotique. Je suis en production depuis un an avec le système décrit ci-dessous.

Au final on a sa disposition pour commander l'éclairage de la maison  : une page web servie par un Raspberry Pi, des interrupteurs (classique ou sans fil), une télécommande.

Au début : la problématique.

habitant une maison relativement ancienne où les pièces ont régulièrement changé d'usage, les interrupteurs étaient très mal placés (qui ne s'agace pas en devant se lever afin éteindre la lumière pour regarder un bon film à la télé).
L'électricité étant au norme, je n'avais pas envie de la refaire pour déplacer de simples interrupteurs.
Mon cahier des charges était donc simple : équiper ma maison d'un système pouvant commander les éléments électriques sans devoir complètement refaire mon installation.
Le tout devant être à un coût raisonnable (et oui je n'ai pas gagné à l'euro-million)

Le dur choix de la technologie

Quand je me suis penché sur l'architecture du système j'ai été surpris par le nombre de solution sur le marché :X10, Zigbee, Zwave, solution propriétaire ...

Personnellement j'ai choisi le X10 même si il présente quelques inconvénients voici ceux qui n'impactes
  • pas de retour sur le protocole donc difficile de connaître les états des appareils (mais il existe des solutions de contournement dont une est exposée dans ce billet)
  • un délais de latence un peu long parfois (pas la peine d'y pensée au début d'un couloir de 2m, vous l'aurez traversé avant que la lumière soit allumée)
  • Un seul ordre sur le réseaux à la fois
Par contre les modules sont bon marché et facilement disponible.

Le protocole :

Le protocole est très simple, il envoie un signal électrique de type courant porteur dans le réseau électrique de la maison pour commander les appareils. Le système est donc composé des éléments suivants  :

  •  l'actionneur ( l'élément qui pilote un appareil, une lampe ...) : il reçoit une adresse composée d'une lettre (code maison) de A à P et d'un chiffre (unit code) de 1 à 16. Il y a donc un actionneur par appareil à commander (il existe des actionneurs pour commander deux lampes par exemples).

  • Un contrôleur : pour envoyer les signaux dans l'installation électrique et convertir les signaux RF (interrupteur sans fil, télécommande) en signaux électrique.
voici le schéma de principe que j'ai donc adopté au final  :

Branchement électrique :

Pour les modules LNM32 il faut réaliser les branchements électriques, dans mon cas je les aient cachés dans les boîtes électriques présentes dans la maison.

Le schéma de montage est simple, et vous permet de relier votre interrupteur existant si besoins. La documentation du module est bien faîte et ne pose pas de soucis ( si vous avez besoins de précision sur les branchements électrique, contactez moi j'essayerais de vous répondre le plus précisément possible).
 

Le pilotage des modules actionneurs : 

Au début du projet :

j'ai donc commencé à installer le CM15 Pro et les contrôleurs pour les lampes, rien de plus simple :
On installe sous widows le logiciel fournit par le CM15 Pro, puis on le connecte au pc via USB.
On programme via l'interface graphique, chaque contrôleur.
Et l'étape la plus longue, pour chaque actionneur (l'un après l'autre) dans mon cas il y en a 7 (LNM32 et LM15ES) , on active le bouton programmation puis on allume les lampes à l'aide du logiciel.
La doc complète en français est fournis sur le site de Narmiteck :

La télécommande et les interrupteurs sans fil : 

Une fois que les actionneurs fonctionnent, via l'interface graphique. J'ai relié les interrupteurs sans fil  et la télécommande. Encore une fois il y a une doc en français, il suffit de suivre les instructions pas à pas. 
     Pour les interrupteurs sans fil : http://www.marmitek.com/fr/download/manuals/ss13/124/0


Piloter le tout depuis le Rapsberry PI

Étant fan du Raspberry Pi je ne pouvais pas l'oublier dans ce projet, l'idée est donc de créer une interface web pour commander les actionneurs de la maison.
Les hypothèses est que votre Raspi est fonctionne, avec une distrib linux ( de type debian) et qu'il est connecté au réseaux

Nous allons donc installer un pilote pour le CM15Pro, un serveur web avec PHP (ici apache, mais un autre fonctionnera aussi, pour info maintenant j'utilise MonkeyHTTP),puis le projet web

Installons un pilote pour le CM15 pro :

Le pilote en question s'appelle mochad, le wiki est très bien fait, je remet quand même le lien de téléchargement et les commandes pour les non anglophone.

1) on installe la libusb :
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev

2) télécharger mochad  :
cd
mkdir mochad
cd mochad

3) on décompresse, compile et installe le tout :

  tar xzf mochad-...tar.gz
  cd mochad-...
  ./configure
  make
  sudo make install

4) rebooter , et brancher le CM15 Pro au raspi via le cable USB et procédons à quelques tests
sudo lsusb
Vous deviez voir votre CM15Pro

5) un petit test
maintenant avec la ligne de commande essayez d'allumer une lampe :

echo "pl c1 on" | nc localhost 1099

C1 est l'adresse de mon module X10

Le server web :

Installer apache et PHP sur le Raspi si ce n'est déjà fait, les commandes sont les suivantes :
sudo apt-get update
sudo apt-get install apache2
sudo apt-get install php5


Et voila maintenant si vous tapez dans un browser http://<ip du raspberry>/, vous devriez avoir une pages web vous disant que cela fonctionne

Le code source : 

maintenant le projet web, on une page web avec les boutons pour allumer et éteindre, puis deux pages PHP qui seront appelées en AJAX pour allumer et éteindre un module et une autre pour connaître les statuts des modules ( le CM15 Pro, mémorise l'état des périphériques commandés depuis le dernier reboot).

Voici un exemple de la page web créée : 
copiez les fichiers du Zip (code source) dans votre répertoire /var/www 
Pour l'instant je n'ai pas créé de dépôt GIT car le code devrais évoluer pour être intégré dans un autre projet plus vaste.

Les pages PHP, sont génériques quelque soit l'adresses de vos modules, essayer donc d'allumer une lampe en tapant :

http://<ip du raspberry>/homecontrol.php?action=CHANGE_ENGINE_STATE&engine=<adresse du module>&command=on
 
Puis de recevoir l'état du module

http://<ip du raspberry>/homecontrol.php?action=GET_STATE

La pages web et le script MyHome.js sont à adapter en fonction des besoins. Il faut mettre mettre les bons libellés,  les bonnes adresses des modules, les bonnes adresses IP

L'architecture du site : 
 

La page Home.html  : 

Elle est le centre du dispositif. Elle dessine l'interface et fait les appels Ajax à HomeControl.Php.
La page possède une dépendance à la bibliothèque JQUERY pour faciliter la manipulation de la DOM et les appels AJAX.
Pour ajouter des boutons, il suffit de de créer la section suivante dans le code HTML : 
<section><a href="#" id="MonIDBouton">&#xF011;</a><span></span></section>
Oui je sais ça ne ressemble pas à un bouton rond, mais la magie de la CSS va faire le reste (en fonction des demandes j'écrirais un post sur la création du bouton dans le détail). 
Il faut aussi ajouter quelques lignes de JavaScrpit au début de la page dans le $(document).ready : 
$('#MonIDBouton').on('click',{engine:"C3",state:states.cuisine},onClickBtLumiere);
c'est la même technique pour les boutons qui allument plusieurs lampes, ils font appels à une fonction JS, qui simule les boutons correspondants aux lampes :
$('#buttonSection2').on('click',onClickSection2);

dans le fichier myHome.js : 
 function onClickSection2()
{
  $('#buttonExt').click();
  $('#buttonExt1').click();
} 

Dans le $(document).ready on trouve aussi un appel pour connaître l'état de départ :
 $.getJSON("http://192.168.1.29/getState.php",getStateCallback); 
Naturellement il faut personnaliser l'adresse IP

Le Fichier myHome.js : 

Il regroupe l'ensemble des fonctions pour les boutons
Si vous avez ajouté des boutons il faut les ajouter dans la variable states et modifier la fonction getStateCallback.
Dans la fonction sendRequest, il faut mettre votre adresse IP
Sinon les fonctions n'ont rien de complexe : 
  • getStateCallback est la fonction de callback appelée par la requête Ajax au chargement de la page myHome.html
  • sendRequest, lance les appels ajax vers homecontrol.php qui communique avec mochad
  • onClickBtLumiere est la fonction appelée par le click sur les boutons, elle crée les paramètres à passer dans l'url de la page homecontrol.php

Le fichier homecontrol.php  : 

c'est le fichier qui fait le lien entre le driver Mochad et le l'interface user de MyHome.html
Le flux est super simple :
  • je lis les paramètres d'entré
  • je mets un gros switch pour lancer les commandes 


Voila si vous avez des questions j'y répondrais volontiers et si nécessaire je compléterais le post

Aucun commentaire:

Enregistrer un commentaire