{"id":1475,"date":"2013-03-10T18:59:50","date_gmt":"2013-03-10T17:59:50","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=1475"},"modified":"2013-08-25T17:07:47","modified_gmt":"2013-08-25T16:07:47","slug":"s-a-r-a-h-controler-votre-domotique-autrement","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2013\/03\/10\/s-a-r-a-h-controler-votre-domotique-autrement\/","title":{"rendered":"S.A.R.A.H. , Contr\u00f4ler votre domotique autrement"},"content":{"rendered":"<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sarah.png\"><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1477\" title=\"sarah\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sarah.png\" alt=\"\" width=\"255\" height=\"282\" \/><\/a><\/p>\n<p>Un retour \u00e0 la domotique en attendant la suite de mon billet syst\u00e8me qui me prend plus de temps de r\u00e9daction que pr\u00e9vu :p<br \/>\nQue voulez-vous, on se laisse aller \u00e0 tester plein de trucs et le temps file plus vite que l&rsquo;on ne le souhaiterait&#8230;<\/p>\n<p>Aujourd&rsquo;hui je vais vous pr\u00e9senter un projet dont vous avez s\u00fbrement entendu parler si vous c\u00f4toyez l&rsquo;actualit\u00e9 domotique, <a title=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\" href=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\" target=\"_blank\">S.A.R.A.H.<\/a><\/p>\n<p>S.A.R.A.H. (Self Actuated Residential Automated Habitat) est un framework \u00e9crit en C# pour Windows, bas\u00e9 sur les API de reconnaissance vocale <a title=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms723627(v=vs.85).aspx\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms723627(v=vs.85).aspx\" target=\"_blank\">Speech API<\/a> et le <a title=\"http:\/\/www.microsoft.com\/en-us\/kinectforwindows\/develop\/overview.aspx\" href=\"http:\/\/www.microsoft.com\/en-us\/kinectforwindows\/develop\/overview.aspx\" target=\"_blank\">SDK de la Kinect<\/a> de Microsoft.<\/p>\n<p>Et la vous vous dites, le GuiguiAbloc, il a p\u00e9t\u00e9 un c\u00e2ble, il parle de windows sur son blog et il met m\u00eame des liens vers Micro$oft !!!<\/p>\n<p>C&rsquo;est pas faux&#8230;<\/p>\n<p>J&rsquo;avoue que j&rsquo;ai train\u00e9 des pieds avant de tester le projet de <a title=\"http:\/\/encausse.wordpress.com\/\" href=\"http:\/\/encausse.wordpress.com\/\" target=\"_blank\">Jean-Philippe Encausse<\/a> \u00e0 cause de ma r\u00e9vulsion envers <a title=\"http:\/\/www.microsoft.com\/fr-fr\/default.aspx\" href=\"http:\/\/www.microsoft.com\/fr-fr\/default.aspx\" target=\"_blank\">celui dont on peut pas citer le nom<\/a>, mais il faut bien se rendre \u00e0 l&rsquo;\u00e9vidence, la reconnaissance vocale sous Linux, c&rsquo;est une horreur.<br \/>\nA part des POCs a 2 balles ou des d\u00e9mos du M.I.T., je n&rsquo;ai pour l&rsquo;instant vu personne faire un(e) tuto\/d\u00e9monstration tout simple pour faire de la reconnaissance vocale sous mon OS f\u00e9tiche (si toi aussi tu as essayer de te configurer <a title=\"http:\/\/cmusphinx.sourceforge.net\/\" href=\"http:\/\/cmusphinx.sourceforge.net\/\" target=\"_blank\">Sphinx<\/a> le soir au fond des bois, tu me comprendras&#8230;)<\/p>\n<p>Bref, mes aversions mises de c\u00f4t\u00e9, il faut se rendre a l&rsquo;\u00e9vidence, ce Monsieur a fait un travail \u00e9poustouflant.<\/p>\n<p>Ca me r\u00e9concilierais presque avec Micro$oft (nan j&rsquo;d\u00e9conne).<\/p>\n<p>S.A.R.A.H. permet de contr\u00f4ler votre domotique par la voix, par les gestes, par la reconnaissance faciale (en cours), par des QR codes etc&#8230;<br \/>\nEn gros, toutes les possibilit\u00e9s \u00e9normes de la Kinect sont exploit\u00e9es pour interagir avec votre domotique et bonus, elle vous r\u00e9pond (bon d&rsquo;accord \u00e7a fait une femme de plus a causer dans la maison, je vous l&rsquo;accorde)<\/p>\n<p>En gros, il suffit de dire \u00ab\u00a0Sarah, allume la lumi\u00e8re du salon\u00a0\u00bb et \u00ab\u00a0Sarah, lis le film <a title=\"NSFW !!!!\" href=\"http:\/\/www.xvideos.com\/video163285\/clara_la_-_cambrioleuse\" target=\"_blank\">la Cambrioleuse<\/a>\u00a0\u00bb pour que <a title=\"http:\/\/xbmc.org\/\" href=\"http:\/\/xbmc.org\/\" target=\"_blank\">xbmc<\/a> lance votre film favori sous le doux \u00e9clairage de votre halog\u00e8ne.<\/p>\n<p>Int\u00e9ressant, non ?<\/p>\n<p>Concernant l&rsquo;architecture de S.A.R.AH., vous trouverez tout ce qu&rsquo;il vous faut ici:<\/p>\n<p><a title=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/s-a-r-a-h-architecture\/\" href=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/s-a-r-a-h-architecture\/\" target=\"_blank\">http:\/\/encausse.wordpress.com\/s-a-r-a-h\/s-a-r-a-h-architecture\/<\/a><\/p>\n<p>Je ne rentrerais pas dans les d\u00e9tail du projet, <a title=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\" href=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\">le site de l&rsquo;auteur<\/a> vous l&rsquo;expliquera mieux que moi, vid\u00e9o \u00e0 l&rsquo;appui, mais je vais plut\u00f4t vous parlez de sa mise en oeuvre ainsi que de la cr\u00e9ation d&rsquo;un plugin tout simple pour s&rsquo;intercaler avec un webservice qui interrogera une base de donn\u00e9es.<\/p>\n<p>Car si j&rsquo;ai une remarque \u00e0 formuler, c&rsquo;est le c\u00f4t\u00e9 l\u00e9ger de la documentation pour l&rsquo;installation et l&rsquo;utilisation, surtout quand, comme moi, on n&rsquo;a pas toucher un Windows depuis 1993&#8230;<\/p>\n<p>Tout d&rsquo;abord, il vous faut un windows, Seven de pr\u00e9f\u00e9rence.<br \/>\nJ&rsquo;ai personnellement install\u00e9 un windows 7 32bits tout ce qu&rsquo;il y a de plus basique, sans fioritures, sur un ordinateur portable avec 2Go de RAM (ce qui me permet de profiter du micro int\u00e9gr\u00e9).<\/p>\n<p>Ensuite, les pr\u00e9-requis (bien s\u00fbr, installer les versions x64 si vous \u00eates sous un windows en 64bits) :<\/p>\n<p>&#8211; Le<a title=\"http:\/\/www.microsoft.com\/fr-fr\/download\/details.aspx?id=30653\" href=\"http:\/\/www.microsoft.com\/fr-fr\/download\/details.aspx?id=30653\" target=\"_blank\"> framework Microsoft .Net 4.5<\/a><\/p>\n<p>&#8211; Le <a title=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27226\" href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27226\" target=\"_blank\">SDK Microsoft Speech Platform<\/a> (j&rsquo;ai install\u00e9 la version 11)<\/p>\n<p>&#8211; Le <a title=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27225\" href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27225\" target=\"_blank\">Speech Platform Runtime<\/a> (version 11 \u00e9galement)<\/p>\n<p>&#8211; Le <a title=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27224\" href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=27224\" target=\"_blank\">pack de langue Fran\u00e7aise<\/a><\/p>\n<p>&#8211; les <a title=\"http:\/\/www.microsoft.com\/en-us\/kinectforwindows\/develop\/developer-downloads.aspx\" href=\"http:\/\/www.microsoft.com\/en-us\/kinectforwindows\/develop\/developer-downloads.aspx\" target=\"_blank\">runtime Kinect<\/a><\/p>\n<p>En r\u00e9sum\u00e9, voici ce que j&rsquo;ai d&rsquo;installer pour faire tourner S.A.R.A.H.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/prereq.png\" target=\"_blank\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1484\" title=\"prereq\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/prereq-300x179.png\" alt=\"\" width=\"300\" height=\"179\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/prereq-300x179.png 300w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/prereq.png 1010w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Ensuite je vous conseille fortement de configurer la reconnaissance vocale de Windows 7\u00a0 pour \u00eatre sur que tout fonctionne correctement.<\/p>\n<p><a title=\"http:\/\/windows.microsoft.com\/fr-fr\/windows7\/set-up-speech-recognition\" href=\"http:\/\/windows.microsoft.com\/fr-fr\/windows7\/set-up-speech-recognition\" target=\"_blank\">http:\/\/windows.microsoft.com\/fr-fr\/windows7\/set-up-speech-recognition<\/a><\/p>\n<p>Ne reste qu&rsquo;a r\u00e9cup\u00e9rer le programme <a title=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\" href=\"http:\/\/encausse.wordpress.com\/s-a-r-a-h\/\" target=\"_blank\">S.AR.A.H<\/a><\/p>\n<p>D\u00e9zipper le (j&rsquo;ai tout mis dans c:\\sarah).<\/p>\n<p>&#8211; Installer la voix fran\u00e7aise \u00ab\u00a0Virginie\u00a0\u00bb inclus dans le r\u00e9pertoire README\/ScanSoftTTS<br \/>\n(je vous conseille d&rsquo;ailleurs de r\u00e9gler la voix de synth\u00e8se vocale dans les param\u00e8tres Windows <a title=\"http:\/\/windows.microsoft.com\/fr-fr\/windows7\/setting-speech-options\" href=\"http:\/\/windows.microsoft.com\/fr-fr\/windows7\/setting-speech-options\" target=\"_blank\">http:\/\/windows.microsoft.com\/fr-fr\/windows7\/setting-speech-options<\/a> )<\/p>\n<p>Puis lancer le WSRNode.bat<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/wsrnode.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1486\" title=\"wsrnode\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/wsrnode-300x152.png\" alt=\"\" width=\"300\" height=\"152\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/wsrnode-300x152.png 300w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/wsrnode.png 675w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Si vous n&rsquo;avez pas autant de plugins qui se lance, rassurez vous, cela s&rsquo;installe apr\u00e8s<\/p>\n<p>Puis le WSRMicro.bat (si comme moi vous n&rsquo;avez qu&rsquo;un micro, sinon le WSRKinect.bat si vous avez la kinect).<\/p>\n<p>L&rsquo;ic\u00f4ne d&rsquo;une petite maison doit appara\u00eetre dans la barre des t\u00e2ches et si vous faites un clic droit dessus, vous pouvez lancer \u00ab\u00a0Sentinel\u00a0\u00bb qui permet de visualiser en direct les logs du programmes.<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sentinelsarah.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1506\" title=\"sentinelsarah\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sentinelsarah-300x187.png\" alt=\"\" width=\"300\" height=\"187\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sentinelsarah-300x187.png 300w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sentinelsarah-1024x640.png 1024w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2013\/03\/sentinelsarah.png 1280w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>A vous de jouer maintenant pour essayer S.A.R.A.H en testant le plugin \u00ab\u00a0time\u00a0\u00bb d\u00e9j\u00e0 inclus :<\/p>\n<p>Dites \u00ab\u00a0Sarah, quelle heure est-il ?\u00a0\u00bb et elle devrait vous donner l&rsquo;heure \ud83d\ude00 Magique non ?<\/p>\n<p>Si cela ne fonctionne pas, regarder ce qui d\u00e9file dans la console Sentinel, cela devrait vous aider a d\u00e9bugger. Sachez que <a title=\"https:\/\/plus.google.com\/communities\/105964514508504667709#communities\/105964514508504667709\" href=\"https:\/\/plus.google.com\/communities\/105964514508504667709#communities\/105964514508504667709\">le groupe de discussion est l\u00e0 pour vous aider<\/a> \ud83d\ude42<\/p>\n<p>Maintenant que cela fonctionne, vous pouvez ajouter des plugins via l&rsquo;interface web (http:\/\/127.0.0.1:8080), dans le \u00ab\u00a0Store\u00a0\u00bb.<br \/>\nCes plugins s&rsquo;installeront dans le r\u00e9pertoire \u00ab\u00a0plugins\u00a0\u00bb (dingue, non) et leur structure est toute simple.<\/p>\n<p>Nous allons donc ensemble cr\u00e9er un plugin tout simple qui va me permettre d&rsquo;interroger S.A.R.A.H pour conna\u00eetre la temp\u00e9rature ou le degr\u00e9 d&rsquo;hygrom\u00e9trie dans une pi\u00e8ce de la maison.<\/p>\n<p>Toutes les donn\u00e9es de mes sondes de temp\u00e9ratures sont enregistr\u00e9es dans une base MySQL gr\u00e2ce au client <a title=\"http:\/\/syno.haeflinger.com\/index.php\/Module_PERL_pour_stocker_les_donn%C3%A9es\" href=\"http:\/\/syno.haeflinger.com\/index.php\/Module_PERL_pour_stocker_les_donn%C3%A9es\">xpl-mysql-logger<\/a>.<br \/>\nLa structure de la table est toute simple :<\/p>\n<pre lang=\"text\">mysql&gt; desc sensor ;\r\n+----------------+--------------+------+-----+---------+----------------+\r\n| Field\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Null | Key | Default | Extra\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+----------------+--------------+------+-----+---------+----------------+\r\n| idx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | int(11)\u00a0\u00a0\u00a0\u00a0\u00a0 | NO\u00a0\u00a0 | PRI | NULL\u00a0\u00a0\u00a0 | auto_increment |\r\n| curDate\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | date\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n| curTime\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | time\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n| sensorType\u00a0\u00a0\u00a0\u00a0 | varchar(10)\u00a0 | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n| sensorLocation | varchar(255) | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n| sensorValue\u00a0\u00a0\u00a0 | varchar(25)\u00a0 | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n| sensorUnit\u00a0\u00a0\u00a0\u00a0 | varchar(25)\u00a0 | YES\u00a0 |\u00a0\u00a0\u00a0\u00a0 | NULL\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n+----------------+--------------+------+-----+---------+----------------+\r\n7 rows in set (0.00 sec)<\/pre>\n<p>Pour interroger cette base de donn\u00e9es, on va vite fait s&rsquo;\u00e9crire un Webservice en python :<\/p>\n<p>simplews.py<\/p>\n<pre lang=\"python\">#!\/usr\/bin\/env python\r\n# Grouik coded by GuiguiAbloc\r\n\r\nimport web, MySQLdb\r\nimport re,socket,sys,os\r\nweb.config.debug = False\r\nurls = (\r\n'\/', 'index',\r\n'\/temp\/(.*)', 'temp'\r\n)\r\n\r\nrender = web.template.render('templates\/', globals={'re':re})\r\napp = web.application(urls, globals())\r\n\r\nclass index:\r\ndef GET(self):\r\nreturn web.HTTPError(403)\r\ndef POST(self):\r\nreturn web.HTTPError(403)\r\n\r\nclass temp:\r\ndef GET(self,id):\r\ndb = web.database(dbn='mysql', user='sensor', pw='sensor', db='sensor')\r\ntodos = db.query(\"SELECT * from sensor where sensorType=$toto ORDER BY idx DESC limit 1\", vars={ 'toto' : id})\r\nfor todo in todos:\r\nreturn todo.sensorValue\r\n\r\nif __name__ == '__main__':\r\napp.run()<\/pre>\n<p>Ne reste qu&rsquo;a le lancer en sp\u00e9cificant le port d&rsquo;\u00e9coute:<\/p>\n<p>python simplews.py 8085<\/p>\n<p>et une simple requ\u00eate http du type :<\/p>\n<p>http:\/\/serveur;8085\/temp\/TempSalon interrogera la base de donn\u00e9es et vous retournera la valeur associ\u00e9e \u00e0 l&rsquo;entr\u00e9e TempSalon :<\/p>\n<pre lang=\"text\">$ curl http:\/\/serveur:8085\/temp\/TempSalon\r\n20.7\r\n\r\n# python simplews.py 8085\r\nhttp:\/\/0.0.0.0:8085\/\r\n192.168.0.10:58311 - - [10\/Mar\/2013 17:30:49] \"HTTP\/1.1 GET \/temp\/TempSalon\" - 200 OK<\/pre>\n<p>Maintenant que nous avons un webservice, \u00e9crivons un petit plugin pour S.A.R.A.H.<\/p>\n<p>Dans c:\\sarah\\plugins, nous allons cr\u00e9er le r\u00e9pertoire \u00ab\u00a0temperature\u00a0\u00bb.<\/p>\n<p>Ce r\u00e9pertoire contiendra 3 fichiers :<\/p>\n<p>temperature.prop (qui est le descriptif du plugin)<\/p>\n<pre lang=\"text\">{\r\n\"modules\" : {\r\n\"temperature\":\u00a0\u00a0\u00a0\u00a0 {\r\n\"description\": \"Lit des infos provenant de la bdd\",\r\n\"version\"\u00a0\u00a0\u00a0 : \"0.1\",\r\n\"api_url\"\u00a0\u00a0\u00a0 : \"http:\/\/serveur:8085\/temp\"\r\n}\r\n}\r\n}<\/pre>\n<p>temperature.js (qui est le script js qu&rsquo;ex\u00e9cutera S.A.R.A.H)<\/p>\n<pre lang=\"javascript\">exports.action = function(data, callback, config){\r\n\r\n\/\/ Retrieve config\r\nconfig = config.modules.temperature;\r\nif (!config.api_url){\r\nconsole.log(\"Missing temperature config\");\r\nreturn;\r\n}\r\n\r\nconsole.log(\"temperature config complete\");\r\nvar periphId;\r\nif (data.room == \"salon\") {\r\nvar place = \"le salon\";\r\nif (data.type == \"T\") {\r\nvar mesure = \"la temp\u00e9rature\";\r\nperiphId = \"TempSalon\";\r\n}\r\n}\r\n\r\nif (data.room == \"dehors\") {\r\nvar place = \"le jardin\";\r\nif (data.type == \"T\") {\r\nvar mesure = \"la temp\u00e9rature\";\r\nperiphId = \"TempExt\";\r\n}\r\nif (data.type == \"H\") {\r\nvar mesure = \"le taux d'humidit\u00e9\";\r\nperiphId = \"HygroExt\";\r\n}\r\n}\r\n\r\n\/\/ Build URL\r\nvar url = config.api_url;\r\nurl += '\/'+periphId;\r\n\r\nconsole.log('URL:' + url);\r\n\r\n\/\/ Send Request\r\nvar request = require('request');\r\nrequest({ 'uri' : url }, function (err, response, body){\r\n\r\nif (err || response.statusCode != 200) {\r\ncallback({'tts': \"D\u00e9sol\u00e9 , je ne parviens pas r\u00e9cup\u00e9rer\u00a0 \" + mesure + \"dans \" + place});\r\n\r\nreturn;\r\n}\r\n\/\/ Callback with TTS\r\nconsole.log(\"Page : \" + body);\r\nconsole.log(data.type + \" : \" +body);\r\nvar value = body;\r\ncallback({'tts': mesure + \" est de \" + value + data.unit + \" dans \" + place});\r\n});\r\n}<\/pre>\n<p>Et enfin, le temperature.xml qui configure les phrases sur lesquelles S.A.R.A.H. doit r\u00e9agir :<\/p>\n<pre lang=\"text\"><grammar version=\"1.0\" xml:lang=\"fr-FR\" mode=\"voice\" root=\"ruletemperature\" xmlns=\"http:\/\/www.w3.org\/2001\/06\/grammar\" tag-format=\"semantics\/1.0\">\r\n  <rule id=\"ruletemperature\" scope=\"public\">\r\n\r\n<example>Sarah combien fait-il dans le salon<\/example>\r\n    <tag>out.action=new Object(); <\/tag>\r\n    <item weight=\"2\">Sarah<\/item>\r\n    <one-of>\r\n<item>Quelle est la temperature dans out.action.type=\"T\"out.action.unit=\"degr\u00e9s\"\r\n<\/tag><\/item>\r\n<item>Quelle est la temperature out.action.type=\"T\"out.action.unit=\"degr\u00e9s\"\r\n<\/tag><\/item>\r\n<item>Combien fait-il dans out.action.type=\"T\"out.action.unit=\"degr\u00e9s\"\r\n<\/tag><\/item>\r\n<item>Combien fait-il out.action.type=\"T\"out.action.unit=\"degr\u00e9s\"\r\n<\/tag><\/item>\r\n<item>Quel est le taux d'humidit\u00e9 out.action.type=\"H\"out.action.unit=\"pourcents\"\r\n<\/tag><\/item>\r\n<item>Quelle est l'humidit\u00e9 out.action.type=\"H\"out.action.unit=\"pourcents\"\r\n<\/tag><\/item>\r\n<item>Quelle est l'hygrom\u00e9trie out.action.type=\"H\"out.action.unit=\"pourcents\"\r\n<\/tag><\/item>\r\n\r\n<\/one-of>\r\n    <one-of>\r\n\r\n<item>le salonout.action.room=\"salon\"\r\n<\/tag><\/item>\r\n<item>dehorsout.action.room=\"dehors\"\r\n<\/tag><\/item>\r\n<\/one-of>\r\n<tag>out.action._attributes.tts=\"Je regarde tout de suite\";\r\n<\/tag>\r\n<tag>out.action._attributes.uri=\"http:\/\/127.0.0.1:8080\/sarah\/temperature\";\r\n<\/tag>\r\n<\/rule>\r\n<\/grammar>\r\n<\/pre>\n<p>Vraiment tout simple non ?<\/p>\n<p>Pour vous donner un aper\u00e7u de ce que cela donne, je vous colle une petite vid\u00e9o vite faite \ud83d\ude42<\/p>\n<p><iframe src=\"http:\/\/www.dailymotion.com\/embed\/video\/xy3i75\" frameborder=\"0\" width=\"480\" height=\"270\"><\/iframe><br \/>\n<a href=\"http:\/\/www.dailymotion.com\/video\/xy3i75_demonstration-s-a-r-a-h_tech\" target=\"_blank\">D\u00e9monstration S.A.R.A.H.<\/a> <em>par <a href=\"http:\/\/www.dailymotion.com\/Guiguiabloc\" target=\"_blank\">Guiguiabloc<\/a><\/em><\/p>\n<p>Bref un excellent projet, qui fonctionne parfaitement et je compte continuer mes exp\u00e9rimentations avec une Kinect, histoire de voir ce que cela donne \ud83d\ude00<\/p>\n<p>Amusez-vous bien \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un retour \u00e0 la domotique en attendant la suite de mon billet syst\u00e8me qui me prend plus de temps de r\u00e9daction que pr\u00e9vu :p Que voulez-vous, on se laisse aller \u00e0 tester plein de trucs et le temps file plus &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2013\/03\/10\/s-a-r-a-h-controler-votre-domotique-autrement\/\">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":[198,199],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1475"}],"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=1475"}],"version-history":[{"count":35,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1475\/revisions"}],"predecessor-version":[{"id":1564,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1475\/revisions\/1564"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=1475"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=1475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}