URL: https://linuxfr.org/news/ma-domotique-avec-le-systeme-angharad-troisieme-generation Title: Ma domotique avec le système Angharad, troisième génération Authors: Babelouest Davy Defaud, Benoît Sibaud, ZeroHeure, palm123 et tuiu pol Date: 2016年09月29日T10:18:55+02:00 License: CC By-SA Tags: angharad, domotique, taulas, zwave et firefox Score: 33 Angharad gère les lumières, les thermostats, les interrupteurs, les capteurs, les images des caméras, la musique. C’est mon système domotique maison à base de _C_, d’API REST et de client Web avec plein de JQuery dedans. Dans sa 3^(e) génération, c’est un ensemble de bibliothèques gérant les protocoles Z-Wave et Taulas pour créer facilement plein de modules domotiques. L’API est documentée sur GitHub. Sagremor, le client Web écrit avec AngularJS, permet de tout piloter.  ---- [Journal à l’origine de la dépêche](http://linuxfr.org/users/superzen/journaux/ma-domotique-avec-le-systeme-angharad-3e-generation) [Dépôt Git Angharad ](https://github.com/babelouest/angharad) [Dépôt Git Sagremor avec copies d’écran](https://github.com/babelouest/sagremor) ---- # Préambule Il y a quelques deux ans de ça, j’ai parlé de mon [système domotique maison](https://linuxfr.org/users/superzen/journaux/angharad-mon-systeme-de-domotique-maison) à base d’API REST et de client Web avec plein de JQuery dedans. Depuis, j’ai continué ce projet avec entrain et il en est maintenant dans sa 3^(e) génération : [Angharad sur GitHub](https://github.com/babelouest/angharad). Pourquoi 3^(e) génération et pas version 3.0 ? Parce qu’au début, c’était pas mal un serveur autonome, mais avec le temps, c’est devenu un ensemble de logiciels qui forment un écosystème et se parlent entre eux via des protocoles _ad hoc_. Pourquoi je n’ai pas parlé de la 2^(e) génération ? Surtout parce qu’elle n’est pas venue en une seule fois ; les idées et les améliorations sont venues petit à petit pendant l’année qui a suivi mon premier journal. Les principales améliorations ont été l’ajout du support de [Z-Wave](https://fr.wikipedia.org/wiki/Z-Wave), l’ajout de services Web en PHP pour gérer les photos et les flux d’une instance [Motion](http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome) et les lecteurs de musique avec [_mpd_](https://www.musicpd.org/). # Cheminement Puis je voyais [AngularJS](https://fr.wikipedia.org/wiki/AngularJS) et je voyais aussi que mes API REST étaient quand même pas super propres : que du _status 200_, même en cas d’erreur, et je me disais que supporter une autre base de données, normaliser par‐ci, uniformiser par‐là aurait été pas mal. Et puis, je me demandais si les service annexes, caméra et musique, pouvaient être intégrés facilement à mon idée de serveur d’API REST en _C_, parce que j’aime bien le _C_. Et j’ai commencé un nouveau module pour brancher un capteur de température à un Raspberry _Pi_ et y accéder avec une API REST et j’ai trouvé que, même en réutilisant mon code, c’était long et fastidieux pour coder un simple [service Web](https://fr.wikipedia.org/wiki/Service_web). Je me suis donc mis à faire des bibliothèques qui me faciliteraient la [manipulation des requêtes HTTP](https://github.com/babelouest/ulfius) (celui‐là, j’en ai déjà [parlé](https://linuxfr.org/users/superzen/journaux/ulfius-framework-pour-faire-des-api-web-en-c) il n’y a pas très longtemps), les [_logs_](https://github.com/babelouest/yder) ou encore les [requêtes SQL](https://github.com/babelouest/hoel). Je n’ai pas inventé l’eau chaude non plus, mais quand je cherchais des bibliothèques existantes, je n’en trouvais pas qui me paraissaient simples, efficaces et pas trop lourdes. # Angharad, ça fait quoi concrètement ? Cela gère les lumières, les thermostats, les interrupteurs, les capteurs, les images des caméras, la musique. Cela automatise tout ça avec des scripts et des tâches planifiées, ça gère des alertes, et ça supervise les données également. ## Domotique pure Pour la partie domotique pure (lumières, interrupteurs, thermostats, capteurs), ça gère le protocole Z-Wave via la bibliothèque [Openzwave](http://www.openzwave.com/) et une clef USB Z-Wave. Cela gère aussi le protocole [Taulas](https://github.com/babelouest/taulas) qui est une évolution du protocole de communication que j’avais mis en place avec les Arduinos du début. Donc en utilisant des Arduinos ou autre chose, du moment que ça respecte le protocole, ça parle avec le serveur.  On peut rajouter d’autres protocoles domotiques si ça nous chante, il « suffit » de programmer sa [bibliothèque](https://github.com/babelouest/benoic/tree/master/device-modules) qui implémente les bonnes fonctions, on la compile, on la copie dans le répertoire dédié, on recharge les modules avec l’API _Kivabien_^(©) et, hop, on a un nouveau type de périphérique, sans même avoir à relancer le serveur, grâce à la magie de `dlopen()` et `dlsync()`. ## Autres services _**There is no IOT, just devices dedicated to a simple task.**_ Pour les autres services (caméras, musique, etc.), on utilise un principe similaire avec des bibliothèques compilées et chargées pendant l’exécution. Là, le système est plus permissif et autorise à créer ses propres API et faire ses propres accès à la base de données. ### Motion Cela permet d’accéder aux flux temps réel et aux images enregistrées par un service _Motion_. Pour accéder aux images, il faut que le serveur Angharad puisse accéder au répertoire sur lequel sont les images _Motion_, donc un répertoire réseau ou quelque chose du genre. Pour accéder au flux, c’est directement grâce à l’adresse URL fournie au service. J’ai essayé de _proxyfier_ le flux MJPEG, mais sans grand succès... ### MPD Chez moi, j’ai placé des Raspberry _Pi_ dans pas mal de pièces, branchés sur des haut‐parleurs. La plupart du temps, j’y fais jouer une webradio locale que j’ai créée via LiquidSoap et [Icecast](https://fr.wikipedia.org/wiki/Icecast). J’ai donc limité les commandes MPD à `stop`, `play`, `pause`, changer le volume et lancer une liste de lecture. Mais, bon, lister les artistes, albums, chansons, fichiers ne serait pas hyper compliqué à gérer.  ### Liquidsoap D’ailleurs, ladite webradio est un peu gérable elle aussi, on a accès aux infos des dix derniers morceaux joués, et on peut faire `play`, `pause`, `stop` et `next` sur la radio. ## Application cliente On gère sa maison via [Sagremor](https://github.com/babelouest/sagremor), qui est une application AngularJS 1.5 avec du [Bootstrap](https://fr.wikipedia.org/wiki/Bootstrap_%28framework%29) dedans. Elle permet de manipuler toutes les API. Je ne suis pas très fort en ergonomie et encore moins en design _eye candy_, mais l’interface a l’air assez intuitive, au moins pour les commandes de base (allumer, éteindre, etc.), pour que ma blonde ou un invité s’en serve sans que j’ai à expliquer. Pour le coté pratique, j’ai deux tablettes Android [Ubislate 7Ci](http://ubislate.ca/product.php?prodid=1), j’y ai collé un Firefox qui fait tourner l’application cliente, et je les ai placées à chaque entrée chez moi juste à côté de la porte. J’ai toujours le projet de faire une application cliente Android et, maintenant que j’ai une machine un peu plus récente, j’ai pu m’y mettre. Parce que développer des applications Android quand on ne peut pas lancer l’émulateur Android sur sa machine, c’est pas facile... # Essaye donc ! C’est tout libre, les bibliothèques sont en LGPL, les programmes serveurs GPL v3, l’application cliente est sous licence MIT. Je n’ai pas la prétention de faire mieux que les autres, comme [Domoticz](https://domoticz.com/) ou [Jeedom](https://www.jeedom.com/), juste d’avoir un serveur domotique qui réponde à mes besoins ; et puis c’est un bon moyen d’apprendre des nouvelles technos et de tester des concepts. J’aimerais bien fédérer des amateurs autour de ce projet, mais je ne sais pas trop par où commencer. S’il y a des curieux pour tester et participer, c’est avec plaisir !