URL: https://linuxfr.org/users/superzen/journaux/angharad-mon-systeme-de-domotique-maison Title: Angharad, mon système de domotique maison Authors: Babelouest Date: 2014年08月19日T17:46:41+02:00 License: CC By-SA Tags: domotique, arduino, c, angharad et debian Score: 63 Pour voir si c'est possible, j'ai voulu me fabriquer mon système domotique du début à la fin. Les systèmes domotiques qui existent déjà sont souvent très chers pour pas grand-chose j'ai trouvé, de plus ils sont souvent fermés, et j'ai furieusement envie de savoir comment ca fonctionne par en dedans chez moi. De preuve de concept en prototype, j'ai fini par mettre en place un système qui, bien qu'il ne soit pas encore parfait, est utilisable. Je me suis donc dit qu'un petit journal sur linuxfr serait un bon début pour en parler au monde que ca pourrait intéresser. C'est ma première contribution au libre dans un projet que j'initie, et je ne sais pas comment ca va évoluer encore, je verrai bien... La partie matérielle est à base d'Arduinos qui sont commandés par un serveur écrit en C et qui fournit des webservices REST/JSON. J'ai placé des [Arduinos UNO](http://arduino.cc/en/Main/arduinoBoardUno) dans les pièces que je veux contrôler. Chacun est relié à des [relais 5V/10A](http://www.robotshop.com/eu/fr/relais-5v-8-canaux.html) et des capteurs de température. Les relais permettent d'allumer/éteindre les lumières, des prises et le chauffage électrique. J'utilise le câble USB étendu via un [connecteur USB/RJ45](http://i00.i.aliimg.com/photo/v0/400550788/_font_b_USB_b_font_RJ45.jpg) pour connecter l'arduino au serveur et l'alimenter. Le programme dans les Arduinos est assez basique, c'est voulu, je préfère que ce soit le serveur qui fasse le travail, donc l'arduino répond à des commandes simples (État d'un interrupteur, température, gestion du chauffage). Le serveur est écrit en C. Pourquoi ? Parce que je voulais un serveur qui soit petit en mémoire, qui soit rapide à l'exécution et que depuis longtemps je considère que les systèmes embarqués et le C vont bien ensemble, même si ce langage est pas le plus facile à utiliser. Il devait accepter des commandes utilisateur via un webservice et être autonome autant que possible (ne pas dépendre d'un autre service), au cas où on puisse le faire tourner sur d'autres architectures plus limitées en ressources. Les commandes que le serveur peut exécuter sont bien évidemment gérer les interrupteurs/lumières/chauffage, mais aussi lancer des scripts ou des commandes sur le serveur pour par exemple lancer la musique sur les mpd des machines dispersées. Je suis d'accord que c'est un trou béant dans la sécurité, blinder cette partie fait partie des choses à faire. Il y a aussi un scheduler pour lancer des scripts à intervalles réguliers. J'ai poussé le vice jusqu'à permettre de gérer le résultat des actions, par exemple si tel interrupteur est allumé, on allume l'autre, mais même moi je n'utilise pas ca. Au gré de mes expérimentations et apprentissages, j'ai vu que [libmicrohttpd](http://www.gnu.org/software/libmicrohttpd/) est une chouette bibliothèque pour faire un serveur web minimaliste, [sqlite3](http://www.sqlite.org/) est un moteur de base de données également très efficace, et [libconfig](http://www.hyperrealm.com/libconfig/) permet de gérer des fichiers de conf assez facilement. Actuellement, le serveur tourne assez bien, ca prend quelque 3Mo en mémoire au démarrage, 6Mo au bout de quelques jours (je continue à traquer les fuites mémoire). J'aime debian d'amour vrai et les Raspberry Pi sont des belles machines pour faire du bricolage comme ca, donc pour l'instant mon serveur Angharad tourne sur une raspbian, mais je n'exclue pas de changer de crèmerie, parce que j'ai l'impression que la gestion de l'USB est chaotique, j'ai beaucoup de déconnexions intempestives. Le client qui existe actuellement est une appli jquery qui fait les appels aux webservices. J'y ai aussi ajouté une petite gestion minimaliste de mpd distants en php. Je prévois de développer une application android dans un proche avenir. Il me reste quelques problèmes à régler (fuite mémoire), des améliorations à faire (utiliser libusb à la place des read/write sur les fichiers, gérer le multi-langue dans l'appli web) et des évolutions à prévoir (utiliser aussi des Arduino YUN, commander des serrures électroniques), mais en l'état c'est déjà un bon début je pense. Dans la pratique, je m'en sers actuellement pour allumer/éteindre sans bouger du canapé, couper la prise de courant qui permet uniquement de charger les téléphones/tablettes lorsque je ne m'en sers pas, me réveiller tous les matins par ma douce musique, ou encore allumer puis éteindre les lumières à certaines heures certains soirs lorsque je ne suis pas là pour faire croire que je suis chez moi. On peut trouver plein d'autres utilisations aussi, je cherche encore... J'ai libéré tout ca sur github parce que si ca intéresse des gens, ca serait dommage que mon code reste dans un coin. Donc si d'aventure des gens sont intéressés pour l'utiliser, ou aider à l'améliorer, libre à eux ! Le serveur Angharad: https://github.com/babelouest/angharad L'application web: https://github.com/babelouest/angharadweb