Page initiale ici : https://docs.google.com/document/d/1v4V8VKDGo_6fe7LSrgd0Cox03Dzg9hTLrj030WRMXAA/pub
Je la remettrai à jour sur cette page ci dessous.
Mon but est de piloter des convecteurs électriques afin de:
- Éviter de les oublier allumés.
- Les allumer à distance afin qu’ils aient chauffé les pièces avant mon arrivée au domicile.
Pour cela, il faut d’une part pouvoir les piloter par un système “intelligent”, d’autre part pouvoir connecter celui-ci à un système communiquant. Ce dernier se doit de gérer un minimum de sécurité (dont mots de passes, etc).
L’aventure a commencé il y a bien longtemps, avec cette idée d’interfacer un système intelligent avec des circuits de puissance. A l’époque, j’avais travaillé sur un projet utilisant le bus I²C. J’ai donc assez naturellement gardé à l’idée de réutiliser ce bus là pour piloter mes interfaces de puissance, afin d’éviter d’utiliser toutes mes ressources d’entrée/sortie de mon contrôleur.
Une autre partie de l’aventure a été initiée par l’opportunité d’acheter un dockstar[1], et d’y installer une debian, en suivant un tutoriel[2], parfois avec le support de plus experts, dont pluc.
Le matériel se compose de
- Une connexion internet, à l’aide d’une box standard (en l’occurrence live box, de Orange).
- Un dockstar (à défaut, un sheevaplug peut faire office) ~30 €, mais plus en vente
- Une platine arduino ~ 30 €
- Son extension ethernet shield[3] 30 €
- Une interface de puissance maison, décrite plus bas.
Vue d’ensemble du système:
Dockstar
Le dockstar est un serveur web, il sert de première ligne, derrière le modem, pour recevoir des commandes depuis internet (WAN). Il n’y a rien de particulier au niveau matériel; c’est pourquoi je ne m’y attarde pas ici.
Arduino
La platine arduino est telle qu’achetée, simplement connectée à sa carte d’extension ethernet shield. Ici, (au moins) deux choix s’offraient à moi:
- connecter 1 sortie de la platine arduino par relai.
- les grouper et y accéder par un intermédiaire.
La première solution a l’inconvénient de limiter le système, mais est plus simple à mettre en oeuvre. Elle limite le système au nombre de connecteurs disponibles sur l’arduino, à savoir 14 IO digitale plus 5 IO analogiques, moins 5 pins utilisées pour communiquer avec la carte ethernet. Ce qui peut paraître suffisant. J’ai même acheté une platine d’essai, pour 15€, pour faire des essais dans ce sens, ainsi que des borniers, dont je ne retrouve pas la référence, mais un combo.
Je me suis donc tourné vers la deuxième solution, qui offre des extensions virtuellement illimitées[4], en choisissant comme moyen d’extension le bus I²C, qui a le bon goût d’être simple, économique et supporté par la carte arduino. Certains parleraient du CAN, bien mieux étudié contre les perturbations électromagnétiques, mais il me semble que ses modules sont plus onéreux.
Cette carte d’extension sera donc reliée en I²C, et fera office de carte de puissance, décrite ci-après.
Carte de puissance
Ce montage fut pour moi une ré-initiation aux outils de CAO, que j’avais appris il y a plus de dix ans, à l’école. Il est formé autour d’un PCF8574, avec 4 transistors, leur pull-up et diodes de roue-libre. Le tout sera connecté à des relais, directement branchés dans le tableau électrique, dans leur supports DIN, assurant l’isolation galvanique avec le circuit 230V.
Dockstar
Le dockstar a un environnement logiciel de type debian, installé sur le dockstar en suivant les tutoriels http://jeff.doozan.com/debian/uboot/, http://ahsoftware.de/dockstar/ et http://pluc.fr
Outre ses responsabilités de backup et de serveur DLNA, il a un serveur web lighttpd.
J’ai choisi celui-ci car il me semblait adapté, car léger et simple de mise en oeuvre.
J’ai même entrepris de chiffrer ces transactions avec SSL, et ça fonctionne plutôt bien au détail près que mon certificat ne plait pas trop, car il n’est pas signé par des autorités.
J’ai fait la partie commande en cgi-bin, depuis une URL sécurisée par le module d’autorisation. Le CGI est en fait un programme en python. Sa première version contient une table d’ordres, et de noms de commandes. Elle est parcourue par le script, qui l’affiche en fonction des paramètres passés dans la barre d’adresse de l’explorateur.
Pour l’esthétique de la page, j’utilise jquery mobile, qui propose une jolie interface, qui rend bien sur mon téléphone. La page que e renvoie est fonction des paramètres qui lui sont donnés, y compris ses ordres.
Le détail du source est à venir.
Je prévois, pour la prochaine version, une base de donnée sqlite qui contiendrait la liste des ordres, ainsi que l’état du systèmes, et quelques autres configurations, histoire de rendre le système un peu plus sympa.
Arduino
La platine arduino a une puissance très limitée. J’ai intégré les codes d’exemples d’ethernet et de wire, afin d’envoyer une série de commandes simples à l’esclave I²C.
La platine écoute le port 35000 de son IP fixe, et reçoit des ordres sous la forme d’une ligne ASCII, qui contient une première lettre ordre, suivie de paramètres. Ce format me permet le debug aisé avec netcat.
Le code sera disponible bientôt.
Box
On a tendance à l’oublier, mais la box a son importance. tout d’abord, elle doit se connecter à internet. Bon, jusqu’ici, c’est simple. Ensuite, on doit pouvoir lui parler depuis l’internet, si l’on veut envoyer des ordres à notre système. Pour ce faire, à moins d’avoir une IP fixe, et de s’en rappeler, un moyen simple consiste à avoir un DNS dynamique[5]. J’utilise no-ip.
Ma box, comme beaucoup, a un réglage pour le dns dynamique, à quije donne directement mes coordonnées no-ip. Elle se chargera ainsi de mettre à jour no-ip avec son adresse IP, afinque je puisse l’appeler par son nom depuis n’importe où.
Deuxième étape, le NAT. On ne veut pas se connecter à la box depuis internet, mais bien au dockstar. Il faut donc précsier à l’interface de la box que les paquet entrants doivent être redirigés sur le dockstar. On peut le dire à deux endroits.
- En créant une DMZ sur le dockstar.
Ceci a l’inconvénient d’exposer le dockstar complètement sur internet. Or, on veut peut être autoriser le HTTPS entrant; mais pas les interfaces sur les autres ports, dont webmin, ou DLNA, par exemple. - En redirigeant certains ports seulement, par l’interface de configuration du NAT. Dans mon cas le port HTTPS uniquement[6].
Du coup, quand je me connecte à mon_sous_domaine.no-ip.com, no-ip me renvoie l’IP fournie par ma box, et me redirige sur celle-ci. Ma requête sur la box est envoyée au dockstar, qui me renvoie une page web, après authentification.
Le dockstar recevant un ordre le transmet à l’arduino, qui ‘envoie par I²C sur son module d’entrées/sortie, qui commute le relai par son transistor.
[1] Freeagent Dockstar, par seagate
[3] Aujourd’hui, je recommenderai directement une carte intégrant les deux, comme http://arduino.cc/en/Main/ArduinoBoardEthernet
[4] ou limitée à beaucoup, genre 2 puissance 7 extensions I²C qu’on multiplierait par le nombre d’IO par carte, enfin, beaucoup, quoi
[5] Bon, en fait, j’ai même un nom de domaine en tête de tout ça, mais ce n’est pas nécessaire.
[6] et parfois le port SSH, mais pour d’autres raisons