{"id":1143,"date":"2012-05-22T20:23:46","date_gmt":"2012-05-22T19:23:46","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=1143"},"modified":"2012-05-22T20:23:46","modified_gmt":"2012-05-22T19:23:46","slug":"projet-xpl-pyhal-un-cerveau-xpl-episode-2-alpha-release","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/05\/22\/projet-xpl-pyhal-un-cerveau-xpl-episode-2-alpha-release\/","title":{"rendered":"Projet xPL-pyHAL, un cerveau xPL, Episode 2 : Alpha Release"},"content":{"rendered":"<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2011\/12\/xpl-pyHAL.jpg\"><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1056\" title=\"xpl-pyHAL\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2011\/12\/xpl-pyHAL.jpg\" alt=\"\" width=\"132\" height=\"113\" \/><\/a><\/p>\n<p>Des nouvelles de mon projet de moteur central xPL, xPL-PyHAL dont je vous avez parl\u00e9 <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2011\/12\/23\/projet-xpl-pyhal-un-cerveau-xpl-episode-1\/\">pr\u00e9c\u00e9demment<\/a>.<\/p>\n<p>Apr\u00e8s plusieurs mois, je suis plut\u00f4t pas peu fier de vous pr\u00e9senter la premi\u00e8re version Alpha \ud83d\ude00<\/p>\n<p>Cette version est d\u00e8s \u00e0 pr\u00e9sent t\u00e9l\u00e9chargeable sur :<\/p>\n<p><a title=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=xPL-PyHAL-alpha-0.1.tgz&amp;can=2&amp;q=\" href=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=xPL-PyHAL-alpha-0.1.tgz&amp;can=2&amp;q=\" target=\"_blank\">http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=xPL-PyHAL-alpha-0.1.tgz<\/a><\/p>\n<p>Bien \u00e9videmment, comme toute version Alpha, elle doit subir son bapt\u00eame du feu, et c&rsquo;est pour cela que je vous la propose.<\/p>\n<p>Je l&rsquo;utilise au quotidien sans incidents mais forc\u00e9ment, elle est tr\u00e8s li\u00e9 \u00e0 mon environnement et je ne sais donc pas comment elle se comportera ailleurs, c&rsquo;est pour cela que vous \u00eates grandement invit\u00e9 \u00e0 me remonter tout les bugs\/remarques \u00e9ventuels via <a title=\"http:\/\/code.google.com\/p\/guiguiabloc\/issues\/list\" href=\"http:\/\/code.google.com\/p\/guiguiabloc\/issues\/list\" target=\"_blank\">la partie \u00ab\u00a0Issues\u00a0\u00bb de GoogleCode<\/a> (cela me facilitera la t\u00e2che \ud83d\ude09 )<\/p>\n<p>C&rsquo;est un premier jet (sans jeu de mot, je vous connais hein !!!), des possibilit\u00e9s que je veux donner a xPL-PyHAL.<br \/>\nLe mieux est donc de le tester et de me faire savoir ce que vous attendez d&rsquo;un centralisateur xPL de ce type.<\/p>\n<p>Le plus dur dans un d\u00e9veloppement n&rsquo;est pas de le r\u00e9aliser mais plut\u00f4t de l&rsquo;expliquer. Je vais donc, dans ce billet, d\u00e9tailler le fonctionnement d&rsquo;xPL-PyHAL et de ses classes\/modules.<\/p>\n<p><strong>xPL-PyHAL, le centralisateur xPL<\/strong><\/p>\n<p>xPL-PyHAL est un programme qui se greffe \u00e0 votre bus xPL et \u00e9coute en permanence les messages qui y transitent.<\/p>\n<p>Son r\u00f4le est d&rsquo;\u00e9x\u00e9cuter une action pour un module que vous allez d\u00e9finir dans un fichier texte tout simple quand il verra passer un message xPL li\u00e9 a ce module.<\/p>\n<p>Les ordres sont \u00e0 d\u00e9poser dans le r\u00e9pertoire \u00ab\u00a0yamlrepo\u00a0\u00bb sous la forme de fichier YAML.<br \/>\nLe fichier doit porter l&rsquo;extension \u00ab\u00a0.yaml\u00a0\u00bb.<\/p>\n<p>Exemple d&rsquo;application :<br \/>\nJe souhaite allumer le relais 1 du bo\u00eetier ipx800 quand j&rsquo;appuie sur l&rsquo;interrupteur CHACON.<br \/>\nIl s&rsquo;agit d&rsquo;un ordre de type \u00ab\u00a0HomeEasy\u00a0\u00bb (sch\u00e9ma homeeasy.basic) \u00e0 destination du client xPL-ipx800.<\/p>\n<p>Le fichier YAML aura la forme suivante (interrupteur.yaml) :<\/p>\n<pre lang=\"text\">ACTION: command\r\nMODULE: \"0x4b92ba\"\r\nUNIT: \"9\"\r\nTARGETXPL: \"ipx800\"\r\nTARGETMODULE: 2<\/pre>\n<p>ACTION : c&rsquo;est une commande \u00e0 ex\u00e9cuter<br \/>\nMODULE: le module qui initie l&rsquo;ordre (ici l&rsquo;adresse de l&rsquo;interrupteur CHACON)<br \/>\nUNIT : l&rsquo;unit\u00e9 de l&rsquo;interrupteur<br \/>\nTARGETXPL : le client xPL qui doit ex\u00e9cuter l&rsquo;ordre (ici le <a title=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=xPL-ipx800.py\" href=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=xPL-ipx800.py\" target=\"_blank\">client xPL-ipx800<\/a>)<br \/>\nTARGETMODULE: le relais cible a commander sur l&rsquo;ipx800<\/p>\n<p>Autre exemple, en appuyant sur l&rsquo;interrupteur, je veux allumer une lampe x10 r\u00e9f\u00e9renc\u00e9e comme module A2.<br \/>\nLe fichier interrupteur.yaml contiendra les valeurs suivantes:<\/p>\n<pre lang=\"text\">ACTION: command\r\nMODULE: \"0x54cd16\"\r\nUNIT: \"10\"\r\nTARGETXPL: \"heyu\"\r\nTARGETMODULE: a2<\/pre>\n<p><strong>Description\u00a0 et configuration possible<\/strong><\/p>\n<p>Une fois le fichier xPL-PyHAL.tgz d\u00e9compress\u00e9, vous trouverez diff\u00e9rentes classes et modules python dont je vais d\u00e9tailler le r\u00f4le.<\/p>\n<ul>\n<li><strong>xPL-PyHAL.py<\/strong><\/li>\n<\/ul>\n<p>Il s&rsquo;agit de l&rsquo;executable qui lancera le centralisateur xPL-PyHAL.<\/p>\n<p>&#8211; Configuration : Aucune<\/p>\n<p>A lancer depuis le r\u00e9pertoire du centralisateur :<\/p>\n<p>python xPL-PyHAL start (lance le d\u00e9mon)<\/p>\n<p>python xPL-PyHAL stop (arr\u00eate le d\u00e9mon)<\/p>\n<p>python xPL-PyHAL console (lance le programme dans la console sans le d\u00e9moniser. CTRL-C pour l&rsquo;arr\u00eater)<\/p>\n<ul>\n<li><strong>BrainPyHAL.py<\/strong><\/li>\n<\/ul>\n<p>Le programme principal d&rsquo;xPL-PyHAL.<\/p>\n<p>&#8211; Configuration : Vous pouvez passer en mode debug (sortie dans le fichier logxplhal.log et dans la console si vous l&rsquo;avez d\u00e9marr\u00e9 dans ce mode)<\/p>\n<p># Debug : set True or False<br \/>\ndebug = False<\/p>\n<ul>\n<li><strong>Daemon.py<\/strong><\/li>\n<\/ul>\n<p>Classe permettant de faire tourner xPL-PyHAL en t\u00e2che de fond (d\u00e9mon).<\/p>\n<p>&#8211; Configuration : Aucune<\/p>\n<ul>\n<li><strong>Memcached.py<\/strong><\/li>\n<\/ul>\n<p>Classe permettant d&rsquo;interagir avec un serveur <a title=\"http:\/\/memcached.org\/\" href=\"http:\/\/memcached.org\/\" target=\"_blank\">Memcached<\/a><\/p>\n<p>&#8211; Configuration :\u00a0 l&rsquo;adresse IP et le port du serveur Memcached (localhost:11211 par d\u00e9faut)<\/p>\n<pre lang=\"text\">def __init__(self, hostname=\"127.0.0.1\", port=\"11211\")<\/pre>\n<ul>\n<li><strong>PushingBox.py<\/strong><\/li>\n<\/ul>\n<p>Classe permettant d&rsquo;envoyer des notifications vers le service<a title=\"http:\/\/www.pushingbox.com\/\" href=\"http:\/\/www.pushingbox.com\/\" target=\"_blank\"> PushingBox<\/a><\/p>\n<p>&#8211; Configuration : Aucune<\/p>\n<ul>\n<li><strong>xPLmessage.py<\/strong><\/li>\n<\/ul>\n<p>Classe pemettant de g\u00e9rer les messages xPL<\/p>\n<p>&#8211; Configuration : Aucune<\/p>\n<p><strong>Les fichiers de configuration YAML<\/strong><\/p>\n<p>Les actions qui doivent \u00eatre ex\u00e9cut\u00e9es par xPL-PyHAL doivent \u00eatre d\u00e9pos\u00e9es dans le r\u00e9pertoire \u00ab\u00a0yamlrepo\u00a0\u00bb.<\/p>\n<p>Le fichier texte doit avoir l&rsquo;extension .yaml<\/p>\n<p>Il contient les entr\u00e9es suivantes :<\/p>\n<p>&#8211; L&rsquo;action \u00e0 r\u00e9aliser (au choix)<\/p>\n<p>ACTION : message | store |\u00a0 command |\u00a0 log<\/p>\n<p>message : envoie une notification<\/p>\n<p>store : stocke une valeur quelque part<\/p>\n<p>command : execute un ordre xPL<\/p>\n<p>log : \u00e9crit dans un fichier log<\/p>\n<p>&#8211; l&rsquo;adresse du module qui d\u00e9clenchera l&rsquo;action<\/p>\n<p>MODULE: \u00ab\u00a0xxxxxxx\u00a0\u00bb<\/p>\n<p>&#8211; l&rsquo;unit\u00e9 du module qui d\u00e9clenchera l&rsquo;action (si applicable)<\/p>\n<p>UNIT: \u00ab\u00a0x\u00a0\u00bb<\/p>\n<p>&#8211; La cible qui doit \u00eatre command\u00e9e<\/p>\n<p>TARGETXPL: \u00ab\u00a0xxxxx\u00a0\u00bb<\/p>\n<p>Vous trouverz des exemples dans le r\u00e9pertoire yamlrepo (extension .sample et dans le fichier YAML.FORMAT)<\/p>\n<p>Quelques exemples :<\/p>\n<p>&#8211; Stocker une valeur \u00ab\u00a0alertemode\u00a0\u00bb avec la cl\u00e9 \u00ab\u00a0on\u00a0\u00bb pendant 60 secondes dans un serveur Memcached quand le module \u00ab\u00a00x4b99bb\u00a0\u00bb, unit\u00e9 9 se d\u00e9clenche<\/p>\n<pre lang=\"text\">ACTION: store\r\nTARGETXPL: memcached\r\nMODULE: \"0x4b99bb\"\r\nUNIT: \"9\"\r\nKEY: \"alertemode\"\r\nVALUE: \"on\"\r\nTIME: \"60\" (d\u00e9faut 900)<\/pre>\n<p>&#8211; Envoyer une notification PushingBox quand le module \u00ab\u00a00x4b99bb'\u00a0\u00bb, unit\u00e9 9, se d\u00e9clenche<\/p>\n<pre lang=\"text\">ACTION: message\r\nTARGETXPL: pushingbox\r\nMODULE: \"0x4b99bb\"\r\nUNIT: \"9\"\r\nKEY: \"v9999AAAAEEEE4\"<\/pre>\n<p>J&rsquo;esp\u00e8re que les exemples fournis vous aideront \u00e0 cr\u00e9er vos propres fichiers YAML. Bien s\u00fbr, il peut y avoir plusieurs fichiers YAML pour un m\u00eame module.<\/p>\n<p>La prise en compte se fait \u00e0 chaud, inutile de relancer le d\u00e9mon xPL-PyHAL.<\/p>\n<p>Voila pour une explication succincte d&rsquo;xPL-PyHAL.<\/p>\n<p>Je n&rsquo;intercepte pas encore toutes les erreurs possibles, donc n&rsquo;h\u00e9sitez pas \u00e0 me remonter les crashs \u00e9ventuels avec le maximum d&rsquo;information possible \ud83d\ude42<\/p>\n<p>Amusez-vous bien \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Des nouvelles de mon projet de moteur central xPL, xPL-PyHAL dont je vous avez parl\u00e9 pr\u00e9c\u00e9demment. Apr\u00e8s plusieurs mois, je suis plut\u00f4t pas peu fier de vous pr\u00e9senter la premi\u00e8re version Alpha \ud83d\ude00 Cette version est d\u00e8s \u00e0 pr\u00e9sent t\u00e9l\u00e9chargeable &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/05\/22\/projet-xpl-pyhal-un-cerveau-xpl-episode-2-alpha-release\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[137],"tags":[168,172,179],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1143"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1143"}],"version-history":[{"count":24,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1143\/revisions"}],"predecessor-version":[{"id":1227,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1143\/revisions\/1227"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=1143"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=1143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}