<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>GuiguiAbloc</title>
	<atom:link href="http://blog.guiguiabloc.fr/index.php/feed/" rel="self" type="application/rss+xml"/>
	<link>http://blog.guiguiabloc.fr</link>
	<description>Le Blog Geek de GuiguiAbloc</description>
	<lastBuildDate>Mon, 31 Oct 2016 20:58:32 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.6.17</generator>
	<itunes:explicit>no</itunes:explicit><itunes:subtitle>Le Blog Geek de GuiguiAbloc</itunes:subtitle><item>
		<title>Gestion d’une Cave à vins avec Tasker et Python</title>
		<link>http://blog.guiguiabloc.fr/index.php/2016/10/31/gestion-dune-cave-a-vins-avec-tasker-et-python/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2016/10/31/gestion-dune-cave-a-vins-avec-tasker-et-python/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Mon, 31 Oct 2016 18:32:09 +0000</pubDate>
				<category><![CDATA[geekerie]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tasker]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1800</guid>

					<description><![CDATA[Je suis un grand amateur de vin et après m&#8217;être essayé au livre de cave papier (rébarbatif il va s&#8217;en dire) pour gérer le stocks de bouteilles de ma cave à vin, j&#8217;ai cherché et essayé nombre d&#8217;application (sous Linux &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2016/10/31/gestion-dune-cave-a-vins-avec-tasker-et-python/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/winecellar.png"><img loading="lazy" class="aligncenter size-medium wp-image-1802" alt="winecellar" src="http://blog.guiguiabloc.fr/wp-content/2016/10/winecellar-300x234.png" width="300" height="234" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/winecellar-300x234.png 300w, http://blog.guiguiabloc.fr/wp-content/2016/10/winecellar.png 350w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Je suis un grand amateur de vin et après m&rsquo;être essayé au livre de cave papier (rébarbatif il va s&rsquo;en dire) pour gérer le stocks de bouteilles de ma cave à vin, j&rsquo;ai cherché et essayé nombre d&rsquo;application (sous Linux il va s&rsquo;en dire).<br />
Malheureusement, je n&rsquo;ai jamais trouvé mon bonheur, même si<a title="http://www.open-cellar.com/" href="http://www.open-cellar.com/" target="_blank"> OpenCellar</a> était quand même ce que j&rsquo;avais trouvé de mieux.<br />
J&rsquo;ai donc profité de mon week-end pour mettre en place une gestion de cave à vins qui convient à mes besoins (et aux vôtres aussi peut être :))</p>
<p>J&rsquo;attendais plusieurs choses d&rsquo;une « application » de gestion de cave à vins et je suis surpris de ne rien trouver d&rsquo;adéquat (ou alors j&rsquo;ai mal cherché et je suis ouvert à vos suggestions :))</p>
<p>&#8211; une application légère (donc en mode web)<br />
&#8211; fonctionnant sous Linux (donc le prérequis précédent convient)<br />
&#8211; fonctionnant en local (pas de cloud machin truc)<br />
&#8211; permettant l&rsquo;ajout et le retrait de bouteille avec son smartphone (car se rendre dans la cave à vin, choisir la bouteille, puis aller sur son pc ou son portable, ouvrir le site web, retirer la bouteille, c&rsquo;est un peu lourd, alors que le smartphone, on l&rsquo;a souvent avec soi)</p>
<p>N&rsquo;étant pas un grand développeur web dans l&rsquo;âme (ni avec mes doigts d&rsquo;ailleurs), j&rsquo;ai d&rsquo;abord cherché une base de site sur laquelle commencer car je n&rsquo;avais pas vraiment envie de passer plusieurs heures a faire du css, du div et toute la joie inhérente à ce genre d&rsquo;application.</p>
<p>J&rsquo;ai trouvé les projets de <a title="http://coenraets.org/blog/" href="http://coenraets.org/blog/" target="_blank">Christophe Coenraets</a> sur <a title="https://github.com/ccoenraets" href="https://github.com/ccoenraets" target="_blank">Github</a> qui à écrit plusieurs articles et applications pour gérer sa cave à vin (je vous invite d&rsquo;ailleurs à lire ses billets à ce sujet (<a title="http://coenraets.org/blog/2011/12/restful-services-with-jquery-php-and-the-slim-framework/" href="hthttp://coenraets.org/blog/2011/12/restful-services-with-jquery-php-and-the-slim-framework/tp://" target="_blank">http://coenraets.org/blog/2011/12/restful-services-with-jquery-php-and-the-slim-framework/</a> , <a title="http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/" href="http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/" target="_blank">http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/</a> , <a title="http://coenraets.org/blog/2012/01/using-backbone-js-with-a-restful-java-back-end/" href="http://coenraets.org/blog/2012/01/using-backbone-js-with-a-restful-java-back-end/" target="_blank">http://coenraets.org/blog/2012/01/using-backbone-js-with-a-restful-java-back-end/</a>).<br />
Mon choix s&rsquo;est porté sur<a title="https://github.com/ccoenraets/wine-cellar-php" href="https://github.com/ccoenraets/wine-cellar-php" target="_blank"> sa version PHP</a>, plus léger pour moi à mettre en œuvre.<br />
Le plus de son application, c&rsquo;est la présence d&rsquo;une API permettant d&rsquo;ajouter, mettre à jour ou lister le contenu de sa cave (oh voui j&rsquo;adore ça lister mes vins avec un curl -i -X GET http://localhost/cellar/api/wines <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> )</p>
<p>Je ne vous ferais pas l&rsquo;affront de la mise en place du dépôt sous votre serveur web fétiche (penser à activer les méthodes PUT,DELETE et POST), cela coule de source.</p>
<p>On peuple la base et voila le premier résultat (a peu près, la c&rsquo;est ma version modifiée)</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine1.png"><img loading="lazy" class="aligncenter size-medium wp-image-1804" alt="screenwine1" src="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine1-300x240.png" width="300" height="240" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine1-300x240.png 300w, http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine1-900x720.png 900w, http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine1.png 1020w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Car oui j&rsquo;ai d&rsquo;abord modifié quelques fonctions.<br />
Pour gérer les bouteilles avec mon smartphone, j&rsquo;ai d&rsquo;abord pensé à des <a title="https://www.amazon.co.uk/Stickers-label-LARGE-CAPACITY-smartphones/dp/B008IJN4JE/ref=pd_day0_23_8?_encoding=UTF8&amp;psc=1&amp;refRID=8WT308PXMVECJGD177CC" href="https://www.amazon.co.uk/Stickers-label-LARGE-CAPACITY-smartphones/dp/B008IJN4JE/ref=pd_day0_23_8?_encoding=UTF8&amp;psc=1&amp;refRID=8WT308PXMVECJGD177CC" target="_blank">étiquettes RFID</a>, mais avec le nombre de précieux flacons, j&rsquo;allais exploser mon budget « <a title="NON, ne clique pas !!!" href="http://www.pornhub.com/" target="_blank">loisir</a>« .<br />
Donc mon choix s&rsquo;est plutôt tourné vers un élément que l&rsquo;on retrouve « presque » sur toutes les bouteilles, le code barre (ou<a title="https://fr.wikipedia.org/wiki/EAN_13" href="https://fr.wikipedia.org/wiki/EAN_13" target="_blank"> EAN 13</a> pour les puristes).<br />
Dans l&rsquo;ensemble, j&rsquo;ai très peu de bouteilles sans, principalement des achats direct au producteur, donc ne saisir qu&rsquo;une infime quantité de stock à la mimine m&rsquo;allait parfaitement (au pire, je pourrais faire du RFID avec elles).</p>
<p>NB: Dans ma folie habituelle, je vous avouerais être d&rsquo;abord parti sur de la reconnaissance de l&rsquo;étiquette avec<a title="http://opencv.org/" href="http://opencv.org/" target="_blank"> OpenCV </a>et de <a title="https://fr.wikipedia.org/wiki/Reconnaissance_optique_de_caract%C3%A8res" href="https://fr.wikipedia.org/wiki/Reconnaissance_optique_de_caract%C3%A8res" target="_blank">l&rsquo;OCR</a> mais vu l&rsquo;ampleur du projet, je me suis vite raisonné <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Mes premières modifications apportées sur le code : ajout du champ EAN, traduction des champs, modification de la recherche sur la région en plus du nom et ajout d&rsquo;un champ quantité.</p>
<p>Mes premiers tests de l&rsquo;API était sympa mais il m&rsquo;en fallait plus.<br />
Etant plus à l&rsquo;aise avec Python que PHP ou JavaScript, j&rsquo;ai rapidement codé ma propre API.</p>
<p>Celle ci permet plusieurs choses :<br />
&#8211; POSTer le code EAN d&rsquo;une bouteille et la créer si besoin (en mettant la quantité à 1 par défaut et en lui affectant l&rsquo;image &lsquo;codeEAN&rsquo;.png), si le code existe, ajouter +1 à la quantité. Possibilité également de faire -1 sur la quantité.</p>
<pre lang="python">
class addean:
def POST(self,uri):
try :
ID = web.data()
except:
return web.badrequest()
con = MySQLdb.connect(host=mysqlhost, user=mysqluser, passwd=mysqlpasswd, db=mysqldb);
cur = con.cursor()
print ID
cur.execute("""SELECT * from wine where EAN=%s""", (ID,))
result = cur.fetchone()
if result is None:
print "no bottle"
print ID
data = {'EAN': ID, 'picture': ID+'.png'}
data = json.dumps(data)
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
else:
cur.execute("""UPDATE wine SET nombre=(nombre+1) where EAN=%s""", (ID,))
con.commit()
print "Number of rows updated: %d" % cur.rowcount
con.close()

class removeean:
def POST(self,uri):
try :
ID = web.data()
except:
return web.badrequest()
con = MySQLdb.connect(host=mysqlhost, user=mysqluser, passwd=mysqlpasswd, db=mysqldb);
cur = con.cursor()
print ID
cur.execute("""SELECT * from wine where EAN=%s""", (ID,))
result = cur.fetchone()
if result is None:
print "new bottle"
print ID
data = {'EAN': ID, 'picture': ID+'.png'}
data = json.dumps(data)
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
else:
cur.execute("""UPDATE wine SET nombre=(nombre-1) where EAN=%s""", (ID,))
con.commit()
print "Number of rows updated: %d" % cur.rowcount
con.close()
</pre>
<p>&#8211; POSTer la photo de l&rsquo;étiquette et l&rsquo;inclure dans la fiche.</p>
<pre lang="python">
class index:
def POST(self,uri):
try:
web.cookies().filename
filenamereceived = web.cookies().filename
except:
filenamereceived == "generic"
try :
data = web.data()
except:
return web.badrequest()
if data == "":
return web.badrequest()
print filenamereceived
b64response = base64.b64encode(data)
fh = open(winepics+filenamereceived+".png", "wb")
fh.write(b64response.decode('base64'))
fh.close()
return "200 STORED"
</pre>
<p>Maintenant que mon API était prête, il fallait pouvoir utiliser le smartphone.</p>
<p>La meilleure application d&rsquo;automatisation sous android est pour moi <a title="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&amp;hl=fr" href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&amp;hl=fr" target="_blank">Tasker</a>. De plus, de nombreux plugins existent et l&rsquo;un des maîtres du plugin Tasker est sûrement<a title=" https://joaoapps.com/" href=" https://joaoapps.com/" target="_blank"> João Dias alias joaomgcd</a>.<br />
J&rsquo;utilise quasiment tout ses plugins (qui ne coûte pas grand chose pour une efficacité redoutable, dont le fameux <a title="https://joaoapps.com/autoremote/" href="https://joaoapps.com/autoremote/" target="_blank">AutoRemote</a>) et en cherchant un plugin « barcode » (code barre) pour Tasker, et bien il existe<a title="https://play.google.com/store/apps/details?id=com.joaomgcd.barcode" href="https://play.google.com/store/apps/details?id=com.joaomgcd.barcode" target="_blank"> AutoBarcode</a> ! Magique, ce type est un génie <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Un peu de « codage » Tasker pour réaliser ce que je veux :</p>
<p>Lancer un scan de code barre,</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212503.png"><img loading="lazy" class="aligncenter size-medium wp-image-1805" alt="Screenshot_20161030-212503" src="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212503-300x168.png" width="300" height="168" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212503-300x168.png 300w, http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212503-900x506.png 900w, http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212503.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>une fois effectué, lancer une « scène » Tasker me demandant si je veux ajouter ou retirer cette bouteille :</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212537.png"><img loading="lazy" class="aligncenter size-medium wp-image-1806" alt="Screenshot_20161030-212537" src="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212537-168x300.png" width="168" height="300" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212537-168x300.png 168w, http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212537.png 576w" sizes="(max-width: 168px) 100vw, 168px" /></a></p>
<p>&#8211; je retire, je fais -1 sur la quantité<br />
&#8211; j&rsquo;ajoute, je fais +1 si le code EAN existe, sinon j&rsquo;appelle l&rsquo;API du site pour créer la bouteille avec son code EAN. Je continue en demandant si je veux ajouter une photo, si non, je sors, si oui, je lance l&rsquo;appareil photo qui me permet de photographier l&rsquo;étiquette et de la POSTer en la nommant &lsquo;codeEAN&rsquo;.png.</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212547.png"><img loading="lazy" class="aligncenter size-medium wp-image-1807" alt="Screenshot_20161030-212547" src="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212547-168x300.png" width="168" height="300" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212547-168x300.png 168w, http://blog.guiguiabloc.fr/wp-content/2016/10/Screenshot_20161030-212547.png 576w" sizes="(max-width: 168px) 100vw, 168px" /></a><br />
Bien sur la création de la bouteille lie automatiquement l&rsquo;image à l&rsquo;url ../pics/&rsquo;codeEAN&rsquo;.png.</p>
<p>Il ne me reste alors qu&rsquo;a me rendre sur le site web pour compléter la fiche de la bouteille.</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine2.png"><img loading="lazy" class="aligncenter size-medium wp-image-1808" alt="screenwine2" src="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine2-300x246.png" width="300" height="246" srcset="http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine2-300x246.png 300w, http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine2-900x738.png 900w, http://blog.guiguiabloc.fr/wp-content/2016/10/screenwine2.png 974w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
En quelques heures, j&rsquo;ai enfin pu me créer un site de gestion de ma cave à vin efficace et qui répond à mes besoins.<br />
L&rsquo;ajout ou le retrait d&rsquo;une bouteille se fait avec le smartphone en premier lieu (on peut le faire sur le site aussi).</p>
<p>Si vous voulez vous aussi déployer ce genre d’application chez vous, j&rsquo;ai bien évidemment tout mis sur<a title="https://github.com/guiguiabloc/wine-cellar-php" href="https://github.com/guiguiabloc/wine-cellar-php" target="_blank"> mon Github</a> en forkant le projet de Christophe et en y ajoutant les éléments nécessaires <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Amusez vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2016/10/31/gestion-dune-cave-a-vins-avec-tasker-et-python/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Voyager dans les yeux de Morgan</title>
		<link>http://blog.guiguiabloc.fr/index.php/2016/05/23/voyager-dans-les-yeux-de-morgan/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2016/05/23/voyager-dans-les-yeux-de-morgan/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Mon, 23 May 2016 19:54:36 +0000</pubDate>
				<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1795</guid>

					<description><![CDATA[J&#8217;avoue qu&#8217;il est assez rare que j&#8217;écrive des billets sur d&#8217;autres choses que mes passions primaires :p, mais cela arrive parfois. J&#8217;ai connu Morgan par Twitter, au début sans trop y faire attention et puis je regarde son profil et &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2016/05/23/voyager-dans-les-yeux-de-morgan/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2016/05/morgan.png"><img loading="lazy" class="aligncenter size-medium wp-image-1796" alt="morgan" src="http://blog.guiguiabloc.fr/wp-content/2016/05/morgan-300x123.png" width="300" height="123" srcset="http://blog.guiguiabloc.fr/wp-content/2016/05/morgan-300x123.png 300w, http://blog.guiguiabloc.fr/wp-content/2016/05/morgan.png 430w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>J&rsquo;avoue qu&rsquo;il est assez rare que j&rsquo;écrive des billets sur d&rsquo;autres choses que mes passions primaires :p, mais cela arrive parfois.</p>
<p>J&rsquo;ai connu Morgan par Twitter, au début sans trop y faire attention et puis je regarde son profil et découvre son site.</p>
<p>Et là, c&rsquo;est un peu le choc pour moi. Morgan s&rsquo;est donné un objectif, visiter 50 pays avant ses 50 ans.</p>
<p>En soi, c&rsquo;est déjà un petit exploit et surtout un vieux rêve enfoui pour moi qui approche doucement de la cinquantaine.</p>
<p>Rien que ce « challenge » m&rsquo;a remis en question.<br />
J&rsquo;ai bien vécu, j&rsquo;ai fait des tas de boulots divers et variés, rencontré des tas de personnes formidables, fondé une famille, vécu des expériences inédites et indicibles pour certaines, visité quelques pays mais lire cet objectif m&rsquo;a définitivement remis en place.<br />
Oui, je suis passé à côté de quelque chose.<br />
Ce constat que j&rsquo;ai pris en pleine gueule m&rsquo;a fait encore plus apprécier l&rsquo;individu.</p>
<p>Et puis, j&rsquo;ai lu, relu et vécu ses voyages. Car ce monsieur écrit bien, très bien même. Des récits de voyages, j&rsquo;en ai dévoré pourtant plusieurs, mais Morgan à cette touche personnelle d&rsquo;écriture qui fait que l&rsquo;on vit avec lui son voyage, ses découvertes, ses déconvenues et ses sensations.</p>
<p>Alors oui il est doué, très doué même. Il s&rsquo;est donné le courage et la volonté de vivre sa passion et d&rsquo;atteindre son ambition mais surtout, et c&rsquo;est pour moi<br />
le plus important, il nous l&rsquo;a fait vivre avec ses mots à lui, son regard et son cœur.</p>
<p>Je ne le connais pas encore réellement (ça devrait venir, parce que parmi toutes ses qualités, il est breton <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> et donc on se retrouvera forcément autour d&rsquo;un verre à Brest même !), mais vivre à travers ses écrits ses voyages me rapproche de lui, de mes vieux rêves regréttés et me fait découvrir le monde comme j&rsquo;aurais aimais le découvrir moi même.</p>
<p>Alors ce billet n&rsquo;est qu&rsquo;anecdotique, n&rsquo;est là que pour exprimer mes sincères remerciements à Morgan pour le temps qu&rsquo;il passe à nous faire partager ses voyages, mais surtout, je vis à travers ses écrits des histoires dont j&rsquo;aimerais être le héros. Et après tout, pourquoi pas 50 pays avant mes 70 ans&#8230;</p>
<p>Pour le découvrir, c&rsquo;est ici : <a title="https://lesvoyagesdemorgan.fr/" href="https://lesvoyagesdemorgan.fr/" target="_blank">https://lesvoyagesdemorgan.fr/</a></p>
<p>PS: je suis les voyages d&rsquo;un autre couple qui fait le tour du monde, Chloé et Romain sur <a title="http://www.playingtheworld.com/" href="http://www.playingtheworld.com/" target="_blank">http://www.playingtheworld.com/</a> , à lire également et avec eux trois, prenez un vrai bol d&rsquo;air&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2016/05/23/voyager-dans-les-yeux-de-morgan/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Jouons avec le WD Tv Live et UPNP</title>
		<link>http://blog.guiguiabloc.fr/index.php/2015/09/06/jouons-avec-le-wd-tv-live-et-upnp/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2015/09/06/jouons-avec-le-wd-tv-live-et-upnp/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Sun, 06 Sep 2015 13:02:33 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[upnp]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1785</guid>

					<description><![CDATA[Depuis des années je dispose d&#8217;un boîtier WD TV Live qui me permet de lire sur la télévision les vidéos stockées sur mon NAS Synology. Efficace, ce petit boîtier fonctionne parfaitement bien et a trouver naturellement sa place dans le &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2015/09/06/jouons-avec-le-wd-tv-live-et-upnp/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2015/09/wdtvlive.png"><img loading="lazy" class="aligncenter size-medium wp-image-1786" alt="wdtvlive" src="http://blog.guiguiabloc.fr/wp-content/2015/09/wdtvlive-300x176.png" width="300" height="176" srcset="http://blog.guiguiabloc.fr/wp-content/2015/09/wdtvlive-300x176.png 300w, http://blog.guiguiabloc.fr/wp-content/2015/09/wdtvlive.png 330w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Depuis des années je dispose d&rsquo;un boîtier <a title="http://www.wdc.com/fr/products/products.aspx?id=1270" href="http://www.wdc.com/fr/products/products.aspx?id=1270" target="_blank">WD TV Live</a> qui me permet de lire sur la télévision les vidéos stockées sur mon <a title="https://www.synology.com/fr-fr/products/" href="https://www.synology.com/fr-fr/products/" target="_blank">NAS Synology</a>.<br />
Efficace, ce petit boîtier fonctionne parfaitement bien et a trouver naturellement sa place dans le meuble TV.</p>
<p>J&rsquo;avais un peu oublié sa présence jusqu&rsquo;à me rendre compte que mon système domotique ne le connaissait pas.<br />
Qu&rsquo;a cela ne tienne, c&rsquo;était le moment de jouer avec <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Sur mon téléphone Android, je dispose d&rsquo;une application, <a title="https://play.google.com/store/apps/details?id=com.wdc.wdremote&amp;hl=fr" href="https://play.google.com/store/apps/details?id=com.wdc.wdremote&amp;hl=fr" target="_blank">WD TV Remote</a>, qui permet de contrôler le boitier par wifi.<br />
Cela suffit à se dire qu&rsquo;il doit être possible d&rsquo;interagir avec lui par le réseau local.</p>
<p>Qui dit boîtier multimédia, dit forcement <a title="https://fr.wikipedia.org/wiki/Universal_Plug_and_Play" href="https://fr.wikipedia.org/wiki/Universal_Plug_and_Play" target="_blank">UPNP</a>. Une petite découverte via l&rsquo;outil gssdp-discover du projet <a title="https://wiki.gnome.org/Projects/GUPnP" href="https://wiki.gnome.org/Projects/GUPnP" target="_blank">gupnp-tools</a> nous donne les points d&rsquo;entrées du boîtier (je vous passe l&rsquo;ensemble des équipements trouvés pour se concentrer sur le WD) :</p>
<pre lang="text">gssdp-discover -i eth0.8 --timeout=5
Using network interface eth0.8
Scanning for all resources
resource available
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77::upnp:rootdevice
Location: http://wdtvlive:10184/
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77
Location: http://wdtvlive:10184/
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77::urn:schemas-upnp-org:device:MediaRenderer:1
Location: http://wdtvlive:10184/
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77::urn:schemas-upnp-org:service:AVTransport:1
Location: http://wdtvlive:10184/
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77::urn:schemas-upnp-org:service:ConnectionManager:1
Location: http://wdtvlive:10184/
resource available
USN:      uuid:5e881b94-0090-a9c7-b3b0-56fc82ddce77::urn:schemas-upnp-org:service:RenderingControl:1
Location: http://wdtvlive:10184/</pre>
<p>Une visite sur l&rsquo;url http://wdtvlive:10184/ nous donne un joli arbre <a title="https://fr.wikipedia.org/wiki/Extensible_Markup_Language" href="https://fr.wikipedia.org/wiki/Extensible_Markup_Language" target="_blank">xml</a></p>
<pre lang="text">...
<serviceList><service><serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType><serviceId>urn:upnp-org:serviceId:AVTransport</serviceId><SCPDURL>MediaRenderer_AVTransport/scpd.xml</SCPDURL><controlURL>MediaRenderer_AVTransport/control</controlURL><eventSubURL>MediaRenderer_AVTransport/event</eventSubURL></service>
...</pre>
<p>Déformation professionnelle oblige, je lance un <a title="https://play.google.com/store/apps/details?id=lv.n3o.shark" href="https://play.google.com/store/apps/details?id=lv.n3o.shark" target="_blank">tcpdump</a> sur mon téléphone et j&rsquo;agis sur la télécommande WD TV Remote.</p>
<p>On retrouve bien le POST http sur le point d&rsquo;entrée du boîtier et la réponse de se dernier.</p>
<pre lang="text">POST /MediaRenderer_AVTransport/control HTTP/1.1
Accept: */*
User-Agent: Twonky-NMC/7.3-Android (Android/4.4.2 (Build KOT49H); samsung/GT-I9505) DLNADOC/1.50
Host: wdtvlive:10184
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"
Content-Type: text/xml; charset="utf-8"
Content-Length: 312

<?xml version="1.0" encoding="utf-8"?><s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID></u:GetTransportInfo></s:Body></s:Envelope>HTTP/1.1 200 OK

Transfer-Encoding: chunked
EXT:
CONTENT-TYPE: text/xml; charset="utf-8"
SERVER: POSIX, UPnP/1.0, Intel MicroStack/1.0.1497
1BF

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:GetTransportInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><CurrentTransportState>PAUSED_PLAYBACK</CurrentTransportState><CurrentTransportStatus>OK</CurrentTransportStatus><CurrentSpeed>1</CurrentSpeed></u:GetTransportInfoResponse></s:Body></s:Envelope></pre>
<p>Génial <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Ne reste plus qu&rsquo;a tester tout cela avec une belle requête curl (accrochez-vous à votre clavier..) :</p>
<pre lang="bash">curl -H "Content-Type: text/xml" -H 'SOAPACTION: urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"' -XPOST -d '<s:Envelope xmlns: s="http://schemas.xmlsoap.org/soap/envelope" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding"><s:Body><u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID></u:GetTransportInfo></s:Body></s:Envelope>' http://wdtvlive:10184/MediaRenderer_AVTransport/control
</pre>
<pre lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:GetTransportInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><CurrentTransportState>PAUSED_PLAYBACK</CurrentTransportState><CurrentTransportStatus>OK</CurrentTransportStatus><CurrentSpeed>1</CurrentSpeed></u:GetTransportInfoResponse></s:Body></s:Envelope></pre>
<p>Elle est pas belle la vie ? :p</p>
<p>On voit dans la réponse le mode actuel du boîtier :<br />
<CurrentTransportState>PAUSED_PLAYBACK</CurrentTransportState></p>
<p>En remplacant la méthode « GetTransportInfo » par « GetPositionInfo », le WD Tv nous donne tout un tas d&rsquo;information dont le film actuellement joué :</p>
<pre lang="bash">curl -H "Content-Type: text/xml" -H 'SOAPACTION: urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"' -XPOST -d '<s:Envelope xmlns: s="http://schemas.xmlsoap.org/soap/envelope" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding"><s:Body><u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID></u:GetPositionInfo></s:Body></s:Envelope>' http://wdtvlive:10184/MediaRenderer_AVTransport/control
</pre>
<pre lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:GetPositionInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><Track>1</Track><TrackDuration>00:22:46</TrackDuration><TrackMetaData>&lt;DIDL-Lite xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot;&gt;&lt;item id=&quot;BROWSE_TYPE_KEYvideo*~&gt;_&lt;~*BROWSE_SORT_KEY8*~&gt;_&lt;~*BROWSE_GROUP_KEY0*~&gt;_&lt;~*BROWSE_FILTER_KEYBROWSE_FILTER_TERM_STARTfilepath:&lt;_EQUALS_&gt;:/tmp/media/nfs/NAS/FILMS/Naruto/Naruto.Shippuden.Saison.7BROWSE_FILTER_TERM_END*~&gt;_&lt;~*Naruto Shippuden 170.mkv&quot; parentID=&quot;BROWSE_TYPE_KEYvideo*~&gt;_&lt;~*BROWSE_SORT_KEY8*~&gt;_&lt;~*BROWSE_GROUP_KEY0*~&gt;_&lt;~*BROWSE_FILTER_KEYBROWSE_FILTER_TERM_STARTfilepath:&lt;_EQUALS_&gt;:/tmp/media/nfs/NAS/FILMS/Naruto/Naruto.Shippuden.Saison.7BROWSE_FILTER_TERM_ENDBROWSE_FILTER_TERM_STARTname:&lt;_EQUALS_&gt;:Naruto Shippuden 170.mkvBROWSE_FILTER_TERM_END*~&gt;_&lt;~*&quot; restricted=&quot;0&quot;&gt;&lt;dc:title&gt;Naruto Shippuden 170.mkv&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.videoItem&lt;/upnp:class&gt;&lt;dc:creator&gt;&lt;/dc:creator&gt;&lt;upnp:genre&gt;Unknown&lt;/upnp:genre&gt;&lt;upnp:album&gt;&lt;/upnp:album&gt;&lt;res bitrate=&quot;1230&quot;  protocolInfo=&quot;file-get:*:video/x-matroska::DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=00000000001000000000000000000000&quot; protection=&quot;&quot; tokenType=&quot;0&quot; duration=&quot;&quot; size=&quot;210161304&quot; colorDepth=&quot;0&quot; ifoFileURI=&quot;&quot; resolution=&quot;--&quot;&gt;file:///tmp/media/nfs/NAS/FILMS/Naruto/Naruto.Shippuden.Saison.7/Naruto%20Shippuden%20170.mkv&lt;/res&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</TrackMetaData><TrackURI>file:///tmp/media/nfs/NAS/FILMS/Naruto/Naruto.Shippuden.Saison.7/Naruto%20Shippuden%20170.mkv</TrackURI><RelTime>00:08:00</RelTime><AbsTime>NOT_IMPLEMENTED</AbsTime><RelCount>2147483647</RelCount><AbsCount>2147483647</AbsCount></u:GetPositionInfoResponse></s:Body></s:Envelope></pre>
<p>Ici je vois que Junior regarde le fichier « Naruto Shippuden 20170.mkv » (ok pas très instructif comme film&#8230;) et ce depuis 8 minutes.</p>
<p>Python disposant de l&rsquo;excellent module<a title="http://lxml.de/" href="http://lxml.de/" target="_blank"> lxml</a> pour parser les fichiers XML, un coup de scripting tout simple permet d&rsquo;isoler les informations importantes :</p>
<pre lang="python">from lxml import etree

tree = etree.parse('le fichier xml')
for element in tree.iter('CurrentTransportState'):
result = element.text
print "WD TV Live status: "+result

tree = etree.parse('le fichier xml')
for element in tree.iter('TrackURI'):
film = element.text
print "WD TV Live joue : "+film

WD TV Live status: PLAYING
WD TV joue: file:///tmp/media/nfs/NAS/FILMS/Naruto/Naruto.Shippuden.Saison.7/Naruto%20Shippuden%20170.mkv</pre>
<p>Toutes les commandes disponibles sont référencées sur l&rsquo;<a title="http://www.upnp-database.info/device.jsp?deviceId=244" href="http://www.upnp-database.info/device.jsp?deviceId=244" target="_blank">upnp database</a>.</p>
<p>Maintenant le serveur domotique connait l&rsquo;état du boitier WD TV Live ainsi que le fichier joué sur le téléviseur.<br />
Ce qui nous permet par exemple de programmer une surveillance de ce que Junior regarde&#8230;</p>
<pre lang="python">tree = etree.parse('le fichier xml')
for element in tree.iter('TrackURI'):
film = element.text
if "Pr0n_A_Papa" in film:
# power off immédiat de la télévision</pre>
<p>J&rsquo;espère que ce petit billet vous donnera envie d&rsquo;aller explorer un peu les points d&rsquo;entrée UPNP des différents équipements de votre domicile <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>EDIT : Pour éteindre et allumer votre WD TV Live par une simpe requête http, il suffit d&rsquo;envoyer le POST suivant :<br />
curl -XPOST -d &lsquo;{« remote »: »w »}&rsquo; http://wdtvlive/cgi-bin/toServerValue.cgi</p>
<p>Amusez-vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2015/09/06/jouons-avec-le-wd-tv-live-et-upnp/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>l’API Domogeek, clap de fin</title>
		<link>http://blog.guiguiabloc.fr/index.php/2015/08/01/lapi-domogeek-clap-de-fin/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2015/08/01/lapi-domogeek-clap-de-fin/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Sat, 01 Aug 2015 20:27:36 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1776</guid>

					<description><![CDATA[EDIT DU 06/08/2015 : Bonne nouvelle ! Le groupe Entropia SA basé au Luxembourg m&#8217;a offert gracieusement l&#8217;hébergement de l&#8217;API. Domogeek renait donc de ses cendres 😀 Temporairement, l&#8217;url de l&#8217;API est http://domogeek.entropialux.com &#160; C&#8217;est avec un grand regret que &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2015/08/01/lapi-domogeek-clap-de-fin/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2015/08/closedapi.png"><img loading="lazy" class="aligncenter size-full wp-image-1777" alt="closedapi" src="http://blog.guiguiabloc.fr/wp-content/2015/08/closedapi.png" width="231" height="231" srcset="http://blog.guiguiabloc.fr/wp-content/2015/08/closedapi.png 231w, http://blog.guiguiabloc.fr/wp-content/2015/08/closedapi-150x150.png 150w, http://blog.guiguiabloc.fr/wp-content/2015/08/closedapi-144x144.png 144w" sizes="(max-width: 231px) 100vw, 231px" /></a></p>
<p><strong>EDIT DU 06/08/2015 : Bonne nouvelle ! Le groupe Entropia SA basé au Luxembourg m&rsquo;a offert gracieusement l&rsquo;hébergement de l&rsquo;API. Domogeek renait donc de ses cendres <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
Temporairement, l&rsquo;url de l&rsquo;API est http://domogeek.entropialux.com<br />
</strong></p>
<p>&nbsp;</p>
<p>C&rsquo;est avec un grand regret que je vais cesser d&rsquo;offrir publiquement l&rsquo;accès à l&rsquo;API Domogeek, après 1 an d&rsquo;existence.</p>
<p>Le succès a était au rendez vous puisque ses dernière semaines, le nombre d&rsquo;appels à l&rsquo;API dépassait largement les 500 000 par jour.<br />
J&rsquo;ai tout fait pour supporter la charge (le taux de disponibilité (affiché publiquement par les sondes PingDom) a toujours était supérieur à 99,5%)a et pour cela j&rsquo;ai du investir du temps mais surtout de l&rsquo;argent pour payer la location des serveurs chez OVH.</p>
<p>D&rsquo;une mentalité d&rsquo;entraide et de partage innée chez moi, j&rsquo;ai donc sollicité les utilisateurs pour faire un modeste don afin de m&rsquo;aider à régler ses frais.<br />
En deux appels, j&rsquo;ai récolté la somme faramineuse de&#8230; 50 euros, avec en prime une suppression de mon post sur le forum Jeedom pour la raison que les appels aux dons sur le forum d&rsquo;un produit à vocation commerciale n&rsquo;avait pas lieu d&rsquo;être. Soit. Je me suis longuement expliqué avec l&rsquo;équipe et je concois que cela entrave le fonctionnement de leur businness-plan, mais bon, les plugins open, c&rsquo;est un peu la force de Jeedom aussi&#8230;<br />
Après, j&rsquo;avais une position difficile, je ne suis pas l&rsquo;auteur du plugin (c&rsquo;est tmartinez, qui d&rsquo;ailleurs a était parmi les premiers a faire un don pour l&rsquo;api), et donc je ne suis qu&rsquo;un fournisseur de service sans lien avec Jeedom mais j&rsquo;ai eu un peu de mal à avaler la pastille, moi qui le premier revendique le partage, l&rsquo;entraide et la transparence.</p>
<p>Je ne peux que remercier chaleureusement les  7 (:p) utilisateurs qui ont voulu m&rsquo;aider : tmartinez, Kheops37, Stéphane (lademan ?), Mickael (Mika ?), edreams, mamatdv, lionel</p>
<p>Le code source est toujours disponible sur GitHub et vous pouvez donc l&rsquo;héberger localement pour continuer à utiliser le plugin de tmartinez (pour les utilisateurs de Jeedom) ou en direct pour les autres.</p>
<p>Je suis de cette génération de barbu qui a toujours offert de l&rsquo;entraide, qui a toujours partagé ses découvertes, ses modestes développements et je suis aujourd&rsquo;hui déçu que cette mentalité tend a disparaître de plus en plus.<br />
Sur IRC, sur les forums, je voyais déjà cette aide bénévole se transformait en assistanat (les gens ne cherche plus et attende la réponse tout de suite avec un merci donné du bout des doigts, quand il existe) et cette aventure m&rsquo;a malheureusement démontré qu&rsquo;on ne peut plus solliciter financièrement un coup de main, il faut obligatoirement faire payer le service.</p>
<p>Je salue les quelques irréductibles qui continue à offrir des services à la communauté en payant de leur personne et de leur porte-monnaie les infrastructures nécessaire (j&rsquo;en oublierais sûrement donc spécial coup de chapeau à domotics du forum toute la domotique, à Jean-Philippe Encausse pour son projet SARAH, à l&rsquo;équipe Domogik, à l&rsquo;équipe Imperihome etc&#8230; J&rsquo;en oublie plein mais ils se reconnaîtrons forcément :D)</p>
<p>A vous tous les utilisateurs de tout ses programmes, ses services, ses aides gratuites, n&rsquo;oubliez jamais que derrière il y a souvent 1 ou quelques personnes qui vous offrent bénévolement de leur temps et souvent de leur argent pour vous rendre la vie agréable, alors un coup de main, même minime, cela donne toujours beaucoup de chaleur et de reconnaissance&#8230;</p>
<p>« La valeur d&rsquo;un homme tient dans sa capacité à donner et non dans sa capacité à recevoir. »  Albert Einstein</p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2015/08/01/lapi-domogeek-clap-de-fin/feed/</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
		<item>
		<title>MQTT, faites communiquer vos objets simplement</title>
		<link>http://blog.guiguiabloc.fr/index.php/2014/11/13/mqtt-faites-communiquer-vos-objets-simplement/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2014/11/13/mqtt-faites-communiquer-vos-objets-simplement/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Thu, 13 Nov 2014 13:58:13 +0000</pubDate>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[domotique]]></category>
		<category><![CDATA[geekerie]]></category>
		<category><![CDATA[mqtt]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1753</guid>

					<description><![CDATA[La communication entre « objets connectés » ou tout simplement dans votre environnement domotique est probablement l&#8217;une des choses essentielles. Dans les protocoles de communication que l&#8217;on retrouve le plus souvent, vous avez bien sûr http (et ses fameuses API Rest (ou &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2014/11/13/mqtt-faites-communiquer-vos-objets-simplement/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/11/mqtt.png"><img loading="lazy" class="aligncenter size-full wp-image-1754" alt="mqtt" src="http://blog.guiguiabloc.fr/wp-content/2014/11/mqtt.png" width="290" height="98" /></a>La communication entre « objets connectés » ou tout simplement dans votre environnement domotique est probablement l&rsquo;une des choses essentielles.</p>
<p>Dans les protocoles de communication que l&rsquo;on retrouve le plus souvent, vous avez bien sûr http (et ses fameuses <a title="http://fr.wikipedia.org/wiki/Representational_State_Transfer" href="http://fr.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">API Rest</a> (ou pas)), <a title="http://xplproject.org.uk/" href="http://xplproject.org.uk/" target="_blank">xPL</a> (dont je vous ai souvent parlé), <a title="http://www.xapautomation.org/index.php?title=xAP_Home_Automation_protocol" href="http://www.xapautomation.org/index.php?title=xAP_Home_Automation_protocol" target="_blank">XAP</a>, <a title="http://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" href="http://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" target="_blank">XMPP</a>, <a title="http://fr.wikipedia.org/wiki/Simple_Network_Management_Protocol" href="http://fr.wikipedia.org/wiki/Simple_Network_Management_Protocol" target="_blank">SNMP</a> (si si je vous assure <a title="https://www.youtube.com/watch?v=gNI9a-K1JoU" href="https://www.youtube.com/watch?v=gNI9a-K1JoU" target="_blank">qu&rsquo;il y en a qui ont essayé</a>&#8230;)  et d&rsquo;autres trucs plus ou moins bien conçus.</p>
<p>Un protocole devrait pourtant tenir rapidement le « haut du pavé » et devenir le standard de l<a title="http://fr.wikipedia.org/wiki/Internet_des_objets" href="http://fr.wikipedia.org/wiki/Internet_des_objets" target="_blank">&lsquo;i.o.t</a> (comprendre l&rsquo;internet des objets (ou « internet of things » pour reprendre le terme officiel) : <a title="http://mqtt.org/" href="http://mqtt.org/" target="_blank">MQTT</a>.</p>
<p>Et pour couronner le tout, <a title="https://www.oasis-open.org/news/announcements/mqtt-version-3-1-1-becomes-an-oasis-standard" href="https://www.oasis-open.org/news/announcements/mqtt-version-3-1-1-becomes-an-oasis-standard" target="_blank">MQTT est devenu depuis quelque jours un standard s&rsquo;échange OASIS</a> (<a title="https://www.oasis-open.org/" href="https://www.oasis-open.org/" target="_blank">OASIS</a> (Organization for the Advancement of Structured Information Standards) est un consortium chargé d&rsquo;aider au développement, à la convergence et l&rsquo;adoption de standards ouverts  pour « la société mondiale de l&rsquo;information » (oui je mets des guillemets&#8230;). On y trouve des références qui ne laissent pas de marbre <a title="https://www.oasis-open.org/member-sections/" href="https://www.oasis-open.org/member-sections/" target="_blank">https://www.oasis-open.org/member-sections/</a> )</p>
<p>C&rsquo;est bien joli tout cela, mais comment ça marche ?</p>
<div id="attachment_1758" style="width: 234px" class="wp-caption aligncenter"><a href="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept.jpg"><img aria-describedby="caption-attachment-1758" loading="lazy" class="size-medium wp-image-1758" alt="mqttconcept" src="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept-224x300.jpg" width="224" height="300" srcset="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept-224x300.jpg 224w, http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept-766x1024.jpg 766w, http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept-900x1201.jpg 900w, http://blog.guiguiabloc.fr/wp-content/2014/11/mqttconcept.jpg 1023w" sizes="(max-width: 224px) 100vw, 224px" /></a><p id="caption-attachment-1758" class="wp-caption-text">(c) David Cuartielles @dcuartielles</p></div>
<p style="text-align: left;">MQTT est un service de messagerie TCP/IP simple et extrêmement léger dans le sens où des messages de toutes sortes (le contenu importe peu du moment que le message n&rsquo;excède pas 256Mo (oui oui, vous pouvez envoyer des photos de la cousine <a title="http://blog.guiguiabloc.fr/tatiana.html" href="http://blog.guiguiabloc.fr/tatiana.html" target="_blank">Tatiana</a> par MQTT&#8230;)) peuvent être transmis.</p>
<p style="text-align: left;">Les messages sont envoyés par des <a title="http://fr.wiktionary.org/wiki/publieur" href="http://fr.wiktionary.org/wiki/publieur" target="_blank">publieurs </a>(les publishers) sur un canal (une chaîne d&rsquo;information si vous voulez) appelé Topic. Ces messages peuvent être lus par les abonnés (les subscribers). Les Topics (ou les canaux d&rsquo;informations) peuvent avoir une hiérarchie qui permet de sélectionner finement les informations que l&rsquo;on désire.</p>
<p style="text-align: left;">Par exemple, le topic /sensor/temperature/salon ne me donnera que les températures du salon si je m&rsquo;y abonne (et ma sonde de température dans le salon publiera sur le topic sa valeur régulièrement).<br />
Je pourrais aussi m&rsquo;abonner au topic /sensor/temperature/# pour avoir toutes les températures, ou au topic /sensor/# pour avoir toutes les remontées des sondes (plus de de détails sur les « wildcards » sur les topics sont disponibles ici <a title="http://mosquitto.org/man/mqtt-7.html" href="http://mosquitto.org/man/mqtt-7.html" target="_blank">http://mosquitto.org/man/mqtt-7.html</a> )</p>
<p style="text-align: left;">Bien sur le topic pourrait aussi être /nagios/serveur/ping <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Afin de préserver un peu de discrétion, vous pouvez bien évidemment définir qui a le droit de publier sur tel ou tel Topic et également qui a le droit de s&rsquo;y abonner.</p>
<p>La sécurité peut se faire au niveau transport en SSL/TLS, et au niveau authentification, par certificats SSL/TLS ou couple user/mot de passe.</p>
<p>Une autre chose importante est la notion de QoS dans les messages qui transitent via MQTT (c&rsquo;est le publieur qui définit la qualité du message).</p>
<ul>
<li>Un message de QoS niveau 0 « At most once » sera délivré tout au plus une fois. C&rsquo;et a dire qu&rsquo;il n&rsquo;est pas stocké et probablement envoyé sans garantie de réception (un peu comme un message UDP xPL par exemple), le broker (le serveur MQTT) n&rsquo;informe pas l&rsquo;expéditeur qu&rsquo;il l&rsquo;a reçu et le message peut être perdu si le client se déconnecte ou si le serveur s&rsquo;arrête.</li>
<li>Un message de QoS niveau 1 « At least once » sera livré au moins une fois. C&rsquo;est à dire que le client le transmettra plusieurs fois s&rsquo;il le faut jusqu&rsquo;à ce que le Broker lui confirme qu&rsquo;il a était transmis sur le réseau (quitte a l&rsquo;envoyer en rafale plusieurs fois).</li>
<li>Un message de QoS niveau 2 « exactly once » sera obligatoirement sauvegardé par l&rsquo;émetteur et le transmettra toujours tant que le récepteur ne confirme pas son envoi sur le réseau. La principale différence étant que l&rsquo;émetteur utilise une phase de reconnaissance plus sophistiquée avec le broker pour éviter une duplication des messages (plus lent mais plus sûr).</li>
</ul>
<p>Je ne vais pas peaufiner les détails du protocole, je vous invite fortement à en lire les spécifications : <a title="http://www.ibm.com/developerworks/library/ws-mqtt/" href="http://www.ibm.com/developerworks/library/ws-mqtt/" target="_blank">http://www.ibm.com/developerworks/library/ws-mqtt/</a> et toute la documentation qui va bien <a title="http://mqtt.org/documentation" href="http://mqtt.org/documentation" target="_blank">http://mqtt.org/documentation</a></p>
<p>Vous trouverez des Brokers et des clients MQTT dans votre langage de prédilection ainsi que des projets bien avancés.<br />
Si vous êtes un adepte de Node JS, je vous invite à regarder le travail de <a title="http://www.matteocollina.com/#biography" href="http://www.matteocollina.com/#biography" target="_blank">Matteo Collina</a> qui est un gros contributeur MQTT (pour ne citer que les plus connus : <a title="https://github.com/mcollina/mosca" href="https://github.com/mcollina/mosca" target="_blank">MOSCA</a>, <a title="http://qest.me/" href="http://qest.me/" target="_blank">QUEST</a> &#8230;)</p>
<p>Maintenant un peu de pratique.</p>
<p>D&rsquo;abord, installons un broker/serveur MQTT. Celui que j&rsquo;affectionne est<a title="http://mosquitto.org/" href="http://mosquitto.org/" target="_blank"> Mosquitto</a>.<br />
Vous trouverez les packages pour différentes distributions GNU/Linux ou *BSD (même pour votre raspberry pi <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ) ou vous pouvez le compiler depuis les sources.</p>
<p>La configuration se fait dans le fichier /etc/mosquitto/mosquitto.conf.<br />
Pour nos tests, nous allons juste réaliser une configuration basique:</p>
<pre lang="text">
log_type debug
allow_anonymous false
password_file /etc/mosquitto/accesslist.txt
</pre>
<p>Nous interdisons l&rsquo;accès en anonyme et nous allons autoriser les connexions uniquement avec un identifiant mot de passe (dont la liste se trouve dans un simple fichier de la forme user:motdepasse (PS: l&rsquo;utilitaire mosquitto_passwd vous aidera à le créer)<br />
Une fois lancé, le serveur écoute sur le port 1883 par défaut.</p>
<p>Un petit script python tout bête pour nous abonner à un topic et afficher les messages (vous trouverez plein d&rsquo;exemples et d&rsquo;articles intéressants sur le site de Jan-Piet Mens : <a title="http://jpmens.net/2013/02/25/lots-of-messages-mqtt-pub-sub-and-the-mosquitto-broker/" href="http://jpmens.net/2013/02/25/lots-of-messages-mqtt-pub-sub-and-the-mosquitto-broker/" target="_blank">http://jpmens.net/2013/02/25/lots-of-messages-mqtt-pub-sub-and-the-mosquitto-broker/</a> )</p>
<pre lang="python">
#!/usr/bin/env python

import mosquitto

def on_message(mosq, obj, msg):
print "%-20s %d %s" % (msg.topic, msg.qos, msg.payload)
mosq.publish('pong', "Thanks", 0)

def on_publish(mosq, obj, mid):
pass

cli = mosquitto.Mosquitto()
cli.on_message = on_message
cli.on_publish = on_publish
cli.username_pw_set("guigui", password="abloc)
cli.connect("broker.guiguiabloc.fr", 1883, 60)
cli.subscribe("/test/#", 0)

while cli.loop() == 0:
pass
</pre>
<p>Lancer le script et vous devriez voir dans les logs (/var/log/syslog par défaut) de votre broker, la connexion se faire :</p>
<pre lang="text">
Nov 13 10:57:17 eos mosquitto[19305]: Sending CONNACK to mosq/69ED9C77592ADC1E7D (0)
Nov 13 10:57:17 eos mosquitto[19305]: Received SUBSCRIBE from mosq/69ED9C77592ADC1E7D
Nov 13 10:57:17 eos mosquitto[19305]: #011/test/# (QoS 0)
Nov 13 10:57:17 eos mosquitto[19305]: Sending SUBACK to mosq/69ED9C77592ADC1E7D
</pre>
<p>Maintenant, publions un message.</p>
<pre lang="text">
mosquitto_pub -h broker.guiguiabloc.fr -u "user" -P "motdepasse -t /test -m "Hello la foule"
</pre>
<p>Le message s&rsquo;affiche dans votre client :</p>
<pre lang="text">
/test                0 Hello la foule
</pre>
<p>et dans les logs :</p>
<pre lang="text">
Nov 13 11:00:42 eos mosquitto[19305]: Received PUBLISH from mosq_pub_21013_eos.sty (d0, q0, r0, m0, '/test', ... (14 bytes))
Nov 13 11:00:42 eos mosquitto[19305]: Sending PUBLISH to mosq/69ED9C77592ADC1E7D (d0, q0, r0, m0, '/test', ... (14 bytes))
Nov 13 11:00:42 eos mosquitto[19305]: Received PUBLISH from mosq/69ED9C77592ADC1E7D (d0, q0, r0, m0, 'pong', ... (6 bytes))
</pre>
<p>Plus drôle, il existe même une application android pour publier et s&rsquo;abonner  à un broker MQTT : <a title="https://play.google.com/store/apps/details?id=at.tripwire.mqtt.client&amp;hl=fr_FR" href="https://play.google.com/store/apps/details?id=at.tripwire.mqtt.client&amp;hl=fr_FR" target="_blank">https://play.google.com/store/apps/details?id=at.tripwire.mqtt.client&amp;hl=fr_FR</a></p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttandroid.png"><img loading="lazy" class="aligncenter size-medium wp-image-1764" alt="mqttandroid" src="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttandroid-300x172.png" width="300" height="172" srcset="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttandroid-300x172.png 300w, http://blog.guiguiabloc.fr/wp-content/2014/11/mqttandroid.png 536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Sachez aussi que vous pouvez, en websocket, pousser directement les messages dans un navigateur web <a title="http://jpmens.net/2014/07/03/the-mosquitto-mqtt-broker-gets-websockets-support/" href="http://jpmens.net/2014/07/03/the-mosquitto-mqtt-broker-gets-websockets-support/" target="_blank">http://jpmens.net/2014/07/03/the-mosquitto-mqtt-broker-gets-websockets-support/</a></p>
<p>Alors c&rsquo;est pas génial ? <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Bien évidemment vous imaginez toutes les possibilités offertes par ce protocole. Certains fous furieux ont déjà commencé à coder en LUA pour la Vera, <a title="http://forum.micasaverde.com/index.php/topic,17432.msg135283.html" href="http://forum.micasaverde.com/index.php/topic,17432.msg135283.html" target="_blank">un client MQTT </a>.</p>
<p>Sachez également qu&rsquo;un projet domotique très prometteur inclus déjà MQTT : <a title="http://www.openhab.org/features-tech.html" href="http://www.openhab.org/features-tech.html" target="_blank">openHAB<br />
</a>Je risque donc de vous en reparler <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Autre chose à souligner, il existe un très bon projet : <a title="https://github.com/jpmens/mqttwarn" href="https://github.com/jpmens/mqttwarn" target="_blank">mqttwarn</a></p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttwarn.png"><img loading="lazy" class="aligncenter size-medium wp-image-1767" alt="mqttwarn" src="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttwarn-300x172.png" width="300" height="172" srcset="http://blog.guiguiabloc.fr/wp-content/2014/11/mqttwarn-300x172.png 300w, http://blog.guiguiabloc.fr/wp-content/2014/11/mqttwarn.png 500w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Ce projet est une sorte de passerelle qui s&rsquo;abonne à « tout » les topics et qui se charge ensuite de les transmettre à divers clients (pushover, mysql, redis, twitter etc&#8230;)</p>
<p>Même votre serveur de téléphonie Asterisk peut « causer MQTT » : <a title="https://github.com/zeha/agi-mqtt" href="https://github.com/zeha/agi-mqtt" target="_blank">https://github.com/zeha/agi-mqtt</a></p>
<p>Maintenant, peut-on considérer que c&rsquo;est la panacée et que cela va supplanter tout ce qui existe.<br />
Oui et non (une bonne réponse comme je les aime).</p>
<p>Oui parce que l&rsquo;on standardise un protocole de transport d&rsquo;information et que les systèmes de messages de type MQ, sont très performant. C&rsquo;est temps réel, ça marche très bien en websocket, c&rsquo;est déjà inclus dans plein de langage, bref, que du bonheur. De plus, l&rsquo;implémentation est facile.</p>
<p>Non parce que l&rsquo;on standardise le transport et pas le message reçu mais cela serai toujours la bête noire (même une API Rest vous retourne un json dans la syntaxe qu&rsquo;il veut, à vous de vous adapter).</p>
<p>Toutefois, je pense sincèrement que MQTT est un protocole terriblement intéressant et qui peut nous rendre grandement service, reste désormais à l&rsquo;intégrer partout.</p>
<p>Amusez-vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2014/11/13/mqtt-faites-communiquer-vos-objets-simplement/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Domotique et Intelligence : la communication</title>
		<link>http://blog.guiguiabloc.fr/index.php/2014/08/13/domotique-et-intelligence-la-communication/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2014/08/13/domotique-et-intelligence-la-communication/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Wed, 13 Aug 2014 10:51:09 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1731</guid>

					<description><![CDATA[Quelques mois plus tôt, j&#8217;avais évoqué la nécessité de la connaissance pour un environnement domotique (cf. http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/) J&#8217;aimerais maintenant aborder avec vous la deuxième partie, la communication. A suivre l&#8217;actualité des constructeurs et les retours ou discussions des utilisateurs de &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2014/08/13/domotique-et-intelligence-la-communication/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/08/lacommunication.png"><img loading="lazy" class="aligncenter size-medium wp-image-1732" alt="lacommunication" src="http://blog.guiguiabloc.fr/wp-content/2014/08/lacommunication-300x190.png" width="300" height="190" srcset="http://blog.guiguiabloc.fr/wp-content/2014/08/lacommunication-300x190.png 300w, http://blog.guiguiabloc.fr/wp-content/2014/08/lacommunication.png 330w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Quelques mois plus tôt, j&rsquo;avais évoqué la nécessité de la connaissance pour un environnement domotique (cf. <a title="http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/" href="http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/" target="_blank">http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/</a>)</p>
<p>J&rsquo;aimerais maintenant aborder avec vous la deuxième partie, la communication.</p>
<p>A suivre l&rsquo;actualité des constructeurs et les retours ou discussions des utilisateurs de domotique sur les blogs ou forums divers, j&rsquo;ai l&rsquo;impression assez désagréable de vivre à nouveau le même scénario qu&rsquo;il y a plusieurs années quand l&rsquo;informatique personnelle s&rsquo;est généralisée auprès du grand public.</p>
<p>Tout le monde y va de son interface, de son protocole de communication, de sa box révolutionnaire, de ses structures http etc.. Bref, « c&rsquo;est moi qui ait la bonne solution et les autres n&rsquo;ont qu&rsquo;a s&rsquo;adapter ».</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/08/king.jpeg"><img loading="lazy" class="aligncenter size-medium wp-image-1733" alt="king" src="http://blog.guiguiabloc.fr/wp-content/2014/08/king-232x300.jpeg" width="232" height="300" srcset="http://blog.guiguiabloc.fr/wp-content/2014/08/king-232x300.jpeg 232w, http://blog.guiguiabloc.fr/wp-content/2014/08/king.jpeg 250w" sizes="(max-width: 232px) 100vw, 232px" /></a></p>
<p>Alors heureusement, un peu d&rsquo;intelligence à effleurer ce microcosme car la plupart des solutions « tout-en-un » intègre des <a title="http://fr.wikipedia.org/wiki/Interface_de_programmation" href="http://fr.wikipedia.org/wiki/Interface_de_programmation" target="_blank">api </a>permettant d&rsquo;interagir via des requêtes http.Ne vous réjouissez tout de même pas trop vite, chaque API est différente (REST (ou pas), SOAP (ou pas), LUA_API_QUEJESUISSEULEACOMPRENDRE(c), etc..)<br />
Parce que s&rsquo;il vous prend l&rsquo;idée saugrenue (ou pas&#8230;) de faire discuter votre <a title="http://www.fibaro.com/fr/syst%C3%A8me-fibaro/home-center-2" href="http://www.fibaro.com/fr/syst%C3%A8me-fibaro/home-center-2" target="_blank">box Fibaro</a> avec un <a title="http://www.rfxcom.com/store/Transceivers/14103" href="http://www.rfxcom.com/store/Transceivers/14103" target="_blank">RFXtrx</a> branché sur votre <a title="http://getvera.com/controllers/veralite/" href="http://getvera.com/controllers/veralite/" target="_blank">VeraLite</a> ou votre PC, vous allez y passer un peu de temps&#8230;</p>
<p>Ne soyez pas médisant, j&rsquo;ai pris la solution la plus simple <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> et ce n&rsquo;est qu&rsquo;un exemple très basique, j&rsquo;aurais pu pousser le concept jusqu&rsquo;à exiger que je puisse communiquer via mon smartphone avec <a title="http://tasker.dinglisch.net/" href="http://tasker.dinglisch.net/" target="_blank">Tasker </a>qui appelle ma centrale <a title="http://www.myfox.fr/" href="http://www.myfox.fr/" target="_blank">MyFox,</a> qui interroge le module fibaro relié à mon <a title="http://www.eedomus.com/fr/" href="http://www.eedomus.com/fr/" target="_blank">eedomus</a> en fonction des sondes de températures dont les données remontent sur mon <a title="http://www.rfxcom.com/store/Transceivers/11201" href="http://www.rfxcom.com/store/Transceivers/11201" target="_blank">RFXCOM Lan</a> en supposant que le module X10 relié à mon <a title="http://www.planete-domotique.com/autres/kits/kit-de-demarrage-x10-ck15.html" href="http://www.planete-domotique.com/autres/kits/kit-de-demarrage-x10-ck15.html" target="_blank">CM15</a> soit « on ».</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/08/why_trollcat.jpg"><img loading="lazy" class="aligncenter size-medium wp-image-1735" alt="why_trollcat" src="http://blog.guiguiabloc.fr/wp-content/2014/08/why_trollcat-300x218.jpg" width="300" height="218" srcset="http://blog.guiguiabloc.fr/wp-content/2014/08/why_trollcat-300x218.jpg 300w, http://blog.guiguiabloc.fr/wp-content/2014/08/why_trollcat.jpg 371w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>C&rsquo;est complètement idiot, j&rsquo;avoue, mais c&rsquo;était un exemple un peu <a title="http://fr.wiktionary.org/wiki/capillotract%C3%A9" href="http://fr.wiktionary.org/wiki/capillotract%C3%A9" target="_blank">capillotracté</a> du travail à fournir pour pouvoir faire discuter tout ses équipements entre eux.</p>
<p>Ne croyez pas que cela se borne à vos box domotiques, tout ceux qui ont un jour ajouter un serveur <a title="http://www.asterisk.org/" href="http://www.asterisk.org/" target="_blank">Asterisk</a> pour gérer leur téléphonie a la maison se sont demandé « et comment que je discute entre ce serveur et ma box ???? »<br />
Car oui mon bon monsieur, c&rsquo;est la génération des objets connectés !!! Connectés, oui, mais à moi tout seul parce que le dialogue avec les autres, très peu pour moi !</p>
<p>Nous sommes tout les jours submergés de ces nouveaux objets qui doivent nous rendrent la vie plus facile, mais ne croyez pas qu&rsquo;il va vous être facile de l&rsquo;intégrer à votre monde, chacun parle sa propre langue et dans le terme « connecté » largement usité par les médias et les constructeurs, on parle rarement de communication, la faute à qui ?&#8230;</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/08/lol-cat.jpg"><img loading="lazy" class="aligncenter size-medium wp-image-1737" alt="lol cat" src="http://blog.guiguiabloc.fr/wp-content/2014/08/lol-cat-254x300.jpg" width="254" height="300" srcset="http://blog.guiguiabloc.fr/wp-content/2014/08/lol-cat-254x300.jpg 254w, http://blog.guiguiabloc.fr/wp-content/2014/08/lol-cat.jpg 271w" sizes="(max-width: 254px) 100vw, 254px" /></a></p>
<p>Pour sauver ce petit monde de passionnés de domotique perdu dans les méandres d&rsquo;un univers sourd et aveugle, il existe quand même des projets qui cherche à unifier ou interagir avec tout cela.</p>
<p>Nul besoin de vous présenter <a title="http://www.imperihome.com/fr/" href="http://www.imperihome.com/fr/" target="_blank">Imperihome </a>qui risque fortement de devenir « LA » solution Android pour faire causer ensemble tout ça.</p>
<p>En protocole « natif », <a title="http://xplproject.org.uk/" href="http://xplproject.org.uk/" target="_blank">xPL</a> (dont je suis un fervent défenseur :p (mais ça vous le savais déjà si vous êtes habitué de ce blog)), a du mal a se faire sa place malgré un concept simple et plutôt efficace.</p>
<p>Plus récemment, <a title="http://recherche.telecom-bretagne.eu/xaal/" href="http://recherche.telecom-bretagne.eu/xaal/" target="_blank">xAAL</a>, prometteur, une grosse évolution de ce que l&rsquo;on peut faire dans la communication des objets connectés et de la domotique en générale (quand on peut parler des copains :p  <a title="https://twitter.com/jkxathome" href="https://twitter.com/jkxathome" target="_blank">@jkxathome )</a></p>
<p>Bref, vous l&rsquo;avez compris, quand on veut discuter simplement avec toutes nos passerelles domotiques ou nos objets connectés, cela devient vite très problématique parce qu&rsquo;il faut tout changer selon avec qui vous souhaitez communiquer.</p>
<p>Dans mon billet précédent de cette « série », j&rsquo;avais évoquer le fait que mon serveur domotique était une sorte de centralisateur des informations remontées par tout ce qui gravitait autout de lui.<br />
Pour la communication, je suis partie du même constat.<br />
Je ne veux pas m&rsquo;adresser dans des langues différentes à chacun des périphériques, mais uniquement à une « porte d&rsquo;entrée » et dans un langage compréhensible.</p>
<p>Un des exemples les plus démonstratifs est <a title="http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/" href="http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/" target="_blank">le dernier projet dont je vous avais fait part</a>, <a title="http://api.domogeek.fr" href="http://api.domogeek.fr" target="_blank">api.domogeek.fr</a>.<br />
Vous envoyez une requête simple pour connaître une information basique et publique sans vous soucier des méthodes différentes d&rsquo;appels uniques à chacune de ses informations (les dates de vacances scolaires, la vigilance météo etc&#8230;).</p>
<p>Dans votre environnement domotique, cela doit être la même chose.<br />
Un point d&rsquo;entrée unique, structuré, défini, qui se chargera de discuter ensuite dans le langage de chaque périphérique.</p>
<p>La meilleure façon de mettre cela en place est une API de type <a title="http://fr.wikipedia.org/wiki/Representational_State_Transfer" href="http://fr.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">REST</a>.</p>
<p>La mise en oeuvre est simple et à la portée de tous (surtout si vous avez décider d&rsquo;utiliser un vrai langage comme python (troll inside).</p>
<p>Une fois déployé, il devient facile pour tout vos scripts, applications smartphones, etc&#8230; de faire appel à cette API pour communiquer avec vos équipements sans vous souciez de vous rappeler comment doit s&rsquo;écrire la requête http vers tel ou tel module.</p>
<p>Prenons l&rsquo;exemple du lancement d&rsquo;une scène sur une VeraLite.</p>
<p>Si je dois interroger directement la VeraLite par http, ma requête ressemblera à cela :</p>
<pre lang="text">
http://vera:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=1
</pre>
<p>(facile à retenir, hein ? :p)</p>
<p>Imaginons maintenant que l&rsquo;on écrive une simple fonction en python pour cela :</p>
<pre lang="python">
def setscene(device):
  url = 'http://vera:3480/data_request?'
  values = {'output_format' : 'text', 'id' : 'lu_action','serviceId': 'urn:micasaverde-com:serviceId:HomeAutomationGateway1', 'action' : 'RunScene', 'SceneNum' : device }
  try:
    data = urllib.urlencode(values)
    req = urllib2.Request(url+data)
    sendrequest = urllib2.urlopen(req)
    responsefromvera = sendrequest.read()
    if responsefromvera != "OK":
      return web.notfound()
      return "200 SUCCESS"
  except Exception, detail:
    print "Error ", detail
</pre>
<p>Maintenant, codons une API Rest toute bête (attention c&rsquo;est du brut de fonderie bien crado) :</p>
<pre lang="python">
#!/usr/bin/python
# Gruik coded by GuiguiAbloc
import urllib, urllib2, web, re
def scenevera(device):
  url = 'http://vera.styx.net:3480/data_request?'
  values = {'output_format' : 'text', 'id' : 'lu_action', 'serviceId' : 'urn:micasaverde-com:serviceId:HomeAutomationGateway1', 'action' : 'RunScene','SceneNum' : device }
  try:
    data = urllib.urlencode(values)
    req = urllib2.Request(url+data)
    sendrequest = urllib2.urlopen(req)
    responsefromvera = sendrequest.read()
    if responsefromvera != "OK":
      return web.notfound()
      return "200 SUCCESS"
  except Exception, detail:
    print "Error ", detail

web.config.debug = False

urls = (
'/scene/(.*)', 'scenes'
)

render = web.template.render('templates/', globals={'re':re})
app = web.application(urls, globals())

class scenes:
  def POST(self,uri):
    request = uri.split('/')
    if request == ['']:
      return web.badrequest()
    if request[0]:
      device = request[0]
      try:
        result = scenevera(device)
        return "200 SUCCESS\n"
      except:
        web.notfound()

if __name__ == '__main__':
app.run()
</pre>
<p>Démarrez votre script (python monscript.py), il écoutera par défaut sur le port 8080 et lancer une requête http de type « POST » (avec surement le meilleur outil sous linux pour contruire des appels http de toutes sortes, <a title="http://curl.haxx.se/" href="http://curl.haxx.se/" target="_blank">cURL</a>) :</p>
<pre lang="text">
curl -XPOST http://localhost:8080/scene/13
</pre>
<p>Et hop, magique, la scène 13 est lancée <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Maintenant, vous avez une base de données MySQL (par exemple) dans laquelle vous stockez amoureusement toutes les valeurs de températures de vos <a title="http://www.planete-domotique.com/meteo/oregon-scientific/sondes.html" href="http://www.planete-domotique.com/meteo/oregon-scientific/sondes.html" target="_blank">sondes Oregon</a>.<br />
Interrogeons simplement la dernière valeur dans votre BDD de la même façon.</p>
<p>D&rsquo;abord la fonction, on va imaginer que votre table « sensor » contient les colonnes « sensorRoom » qui défini le nom de votre sonde et « sensorValue », la valeur enregistrée :</p>
<pre lang="python">
...
import MySQLdb
...
def tempdb(ID):
  try:
    if ID == "salon":
      ID = "TempSalon"
    if ID == "exterieur" or ID == "dehors" or ID == "ext":
      ID = "TempExt"
    conn = MySQLdb.connect('localhost', 'mabase', 'login', 'motdepasse')
    cur = conn.cursor()
    cur.execute("SELECT sensorValue from sensor where sensorRoom='%s' ORDER BY idx DESC limit 1" % ID )
    result = cur.fetchone()
    return result[0]

  except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    return None
  conn.close()
</pre>
<p>On l&rsquo;inclut dans notre API Python et l&rsquo;on rajoute les appels :</p>
<pre lang="python">
...urls = (
'/scene/(.*)', 'scenes',
'/temp/(.*)', 'temp'
)
...
class temp:
  def GET(self,uri):
    request = uri.split('/')
    if request == ['']:
      return web.badrequest()
    if request[0]:
      room = request[0]
      try:
        result = tempdb(room)
        return result
      except:
        web.notfound()
</pre>
<p>On lance le tout et on fait un appel :</p>
<pre lang="text">
curl http://localhost:8080/temp/exterieur
16.5
</pre>
<p>C&rsquo;est quand même plus simple, non ?</p>
<p>Voici 2 exemples basiques qui nous permettent de communiquer simplement via un point d&rsquo;entrée à divers équipements de notre domotique.</p>
<p>Gardez le contrôle, toujours, de votre environnement. Quelque soit les objets, périphériques, modules communicants qui seront et feront la vie de votre domotique, il vous appartient de maîtriser la communication avec eux. Établissez un point d&rsquo;entrée unique dont vous détiendrez la syntaxe et le langage sans devoir dépendre du bon vouloir d&rsquo;un constructeur.<br />
Changer de fournisseur ou de technos ne doit pas être plus dur que modifier quelques lignes de votre interface de communication sans revoir l&rsquo;intégralité de votre interface web ou de votre application smartphone.</p>
<p>Et puisque je suis dans ma période lolcats sur ce billet&#8230;</p>
<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/08/161432646-1161414097812.jpg"><img loading="lazy" class="aligncenter size-full wp-image-1743" alt="161432646-1161414097812" src="http://blog.guiguiabloc.fr/wp-content/2014/08/161432646-1161414097812.jpg" width="250" height="250" srcset="http://blog.guiguiabloc.fr/wp-content/2014/08/161432646-1161414097812.jpg 250w, http://blog.guiguiabloc.fr/wp-content/2014/08/161432646-1161414097812-150x150.jpg 150w, http://blog.guiguiabloc.fr/wp-content/2014/08/161432646-1161414097812-144x144.jpg 144w" sizes="(max-width: 250px) 100vw, 250px" /></a>Amusez vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2014/08/13/domotique-et-intelligence-la-communication/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>DomoGeek, une API simple pour répondre aux questions simples</title>
		<link>http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Thu, 03 Jul 2014 18:57:13 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[domogeek]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1720</guid>

					<description><![CDATA[A force d&#8217;utilisation de scripts et de scénarios domotique, je me suis rendu compte que des questions toutes simples avaient parfois du mal à trouver une réponse. Prenons l&#8217;exemple d&#8217;un jour férié. Aujourd&#8217;hui est-il un jour férié ? Cela peut &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/05/communication.png"><img loading="lazy" class="aligncenter size-medium wp-image-1721" alt="communication" src="http://blog.guiguiabloc.fr/wp-content/2014/05/communication-300x190.png" width="300" height="190" srcset="http://blog.guiguiabloc.fr/wp-content/2014/05/communication-300x190.png 300w, http://blog.guiguiabloc.fr/wp-content/2014/05/communication.png 330w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>A force d&rsquo;utilisation de scripts et de scénarios domotique, je me suis rendu compte que des questions toutes simples avaient parfois du mal à trouver une réponse.</p>
<p>Prenons l&rsquo;exemple d&rsquo;un jour férié. Aujourd&rsquo;hui est-il un jour férié ?</p>
<p>Cela peut paraitre idiot comme question, mais pour avoir la réponse, ce n&rsquo;est pas si évident (en fait, c&rsquo;est quand on travaille pas :p)</p>
<p>Pour un scénario domotique, ce genre d&rsquo;information est importante (rien que pour gérer la surveillance ou le chauffage par exemple), et pour avoir la réponse, la plupart code un bon gros script qiu vas poller un google agenda dans lequel ils ont intégré le calendrier des jours fériés.</p>
<p>Maintenant, de quelle couleur est le jour TEMPO EDF ?</p>
<p>Pareil, on va coder des dizaines de lignes pour aller parser le site EDF et en ressortir la valeur.</p>
<p>Etc&#8230;</p>
<p>Bref, vous l&rsquo;avez compris, à chaque fois, on doit, individuellement, écrire des scripts pour avoir des réponses à des questions toutes simples qui relève de l&rsquo;information publique.</p>
<p>Et la je me suis dit, pourquoi ne pas offrir une simple API qui répond à ce genre de questions ?</p>
<p>J&rsquo;ai soumis la question sur le <a title="http://www.touteladomotique.com/forum/viewtopic.php?f=18&amp;t=14699" href="http://www.touteladomotique.com/forum/viewtopic.php?f=18&amp;t=14699" target="_blank">forum de Toute la Domotique</a> et les retours étant plutôt positif, je tente un petit POC pour voir si cela intéresse les gens.</p>
<p>Lancement donc de <a title="http://api.domogeek.fr" href="http://api.domogeek.fr" target="_blank">api.domogeek.fr</a> <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Pour le moment c&rsquo;est pas du tout sec, ça ne répond qu&rsquo;à 2 questions, jour férié et couleur Tempo, mais au fil du temps, je rajouterais d&rsquo;autres fonctions (surtout si la demande se fait sentir :))</p>
<p>Voilà l&rsquo;idée que je pose là. Vous en faites ce que vous voulez (le code source est même disponible sur mon <a title="https://github.com/guiguiabloc/api-domogeek" href="https://github.com/guiguiabloc/api-domogeek" target="_blank">Github</a> si vous voulez l&rsquo;héberger sur votre RaspBerry par exemple), vous me dites si ça peut vous servir et surtout,</p>
<p>Amusez vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2014/07/03/domogeek-une-api-simple-pour-repondre-aux-questions-simples/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Domotique : Valoriser et exploiter les données</title>
		<link>http://blog.guiguiabloc.fr/index.php/2014/02/17/domotique-valoriser-et-exploiter-les-donnees/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2014/02/17/domotique-valoriser-et-exploiter-les-donnees/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Mon, 17 Feb 2014 10:30:59 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<category><![CDATA[cityzendata]]></category>
		<category><![CDATA[cityzensciences]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1700</guid>

					<description><![CDATA[Ce n&#8217;est pas faute de vous le répéter, les données sont un des éléments essentiels de la domotique (et par nécessité, de l&#8217;informatique également). Après quelques jours/mois/années d&#8217;utilisation de votre environnement domotique, vous vous êtes sûrement rendu compte de la &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2014/02/17/domotique-valoriser-et-exploiter-les-donnees/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.guiguiabloc.fr/wp-content/2014/02/domomoney.png"><img loading="lazy" class="aligncenter size-medium wp-image-1701" alt="domomoney" src="http://blog.guiguiabloc.fr/wp-content/2014/02/domomoney-300x180.png" width="300" height="180" srcset="http://blog.guiguiabloc.fr/wp-content/2014/02/domomoney-300x180.png 300w, http://blog.guiguiabloc.fr/wp-content/2014/02/domomoney.png 330w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Ce n&rsquo;est pas faute de vous le répéter, les données sont un des éléments essentiels de la domotique (et par nécessité, de l&rsquo;informatique également).</p>
<p>Après quelques jours/mois/années d&rsquo;utilisation de votre environnement domotique, vous vous êtes sûrement rendu compte de la quantité de données dont vous disposez et que, probablement, vous n&rsquo;avez que faire ou que vous exploitez faiblement.</p>
<p>Cette quantité de données peut aussi devenir problématique à stocker et traiter au fil du temps, et vous avez fait le choix sage et délibéré d&rsquo;en omettre une bonne partie (par exemple, le nombre de fois où l&rsquo;interrupteur des toilettes est passé de ON à OFF).</p>
<p>Vous êtes un producteur de données diverses et variées, qui vont des valeurs des sondes de températures et d&rsquo;hygrométrie de votre domicile et de son extérieur, de la vitesse du vent, de la consommation d&rsquo;eau, d&rsquo;électricité, de fioul, de gaz, de la valeur de Co2 dans les pièces, du nombre de fois ou un module s&rsquo;est activé etc&#8230; Bref, vous disposez d&rsquo;un nombre conséquent de valeurs.</p>
<p>Vous, vous êtes industriel, vous concevez et vendez des modules à greffer derrière les interrupteurs et cela vous intéressez sûrement de savoir combien de fois votre module est activé dans une journée et combien de temps il dure. Ou vous êtes constructeur de maison BBC et après les examens concluants, vous seriez intéressé de connaitre le ratio température intérieure/extérieure/consommation énergétique de cette (ces) maison(s) au fil des années.</p>
<p>Bref, vous vous rendez bien compte qu&rsquo;il existe un chemin de rencontre entre les producteurs de données et les consommateurs de ses données.</p>
<p>Ce point de rencontre, il prend désormais forme par l&rsquo;entremise de <a title="http://www.cityzendata.com/" href="http://www.cityzendata.com/" target="_blank">CityzenData</a>, la division « données » du groupe <a title="http://www.cityzensciences.fr/" href="http://www.cityzensciences.fr/" target="_blank">Cityzen Sciences.</a> Il était destiné initialement à répondre aux besoins du consortium <a title="http://www.smartsensing.fr/" href="http://www.smartsensing.fr/" target="_blank">SmartSensing</a> pour la gestion des données produites par des capteurs insérés dans des vêtements.</p>
<p>Je vous en avez déjà parlé il y a quelques mois (twitter, <a title="http://blog.guiguiabloc.fr/index.php/2013/06/19/domotique-le-choix-dune-vulgarisation-erronee/" href="http://blog.guiguiabloc.fr/index.php/2013/06/19/domotique-le-choix-dune-vulgarisation-erronee/" target="_blank">blog</a>, forums) en vous interpellant sur le fait de garder un oeil dessus.</p>
<p>Le CTO de CityzenData ne doit pas vous être inconnu si vous suivez l&rsquo;actualité informatique puisqu&rsquo;il s&rsquo;agit de <a title="https://twitter.com/herberts" href="https://twitter.com/herberts" target="_blank">Mathias Herberts</a>, un des pionniers du BigData en France, mais aussi un copain et ancien collègue de travail.<br />
Et quand Mathias m&rsquo;a proposé de faire « joujou » avec leur plateforme, bien évidemment j&rsquo;ai répondu présent (même si je suis plus scripteur que développeur, c&rsquo;est toujours agréable :D)</p>
<p>Une fois enregistré sur la plateforme Cityzendata, vous disposez de 3 tokens.</p>
<p>&#8211; Un token « écriture » vous permet de pousser des données<br />
&#8211; Un token « lecture » vous permet de lire uniquement les données liées à votre application<br />
&#8211; Un token « lecture générale » peut lire toutes les données que vous avez produites indépendamment de l&rsquo;application.</p>
<p>A cela est communiqué une url d&rsquo;API endpoint pour pousser vos données, une autre pour les exploiter (ou pour que d&rsquo;autres les exploitent).</p>
<ul>
<li>Envoyer vos données</li>
</ul>
<p>Basiquement, avant d&rsquo;écrire votre propre code, cela fonctionne par un simple POST HTTP :</p>
<p>curl -i -H « Le_Header_Token: votre_token_ecriture » -H « Content-Type: text/plain » -d &lsquo;// temperature{piece=tempsalon} 20&rsquo; http://url_endpoint</p>
<p>Et voila, vous venez d&rsquo;intégrer une valeur comportant un timestamp (une valeur de temps) en microsecondes dans votre « application », sous la classe Temperature avec comme dénomination pièce est égale à tempsalon et la valeur est de 20.</p>
<p>C&rsquo;est bien évidemment l&rsquo;insertion la plus simple, vous pouvez y mettre votre propre timestamp, la latitude, la longitude et l&rsquo;élévation en plus si vous le souhaitez. Car les données ont aussi la faculté d&rsquo;être géo-temporelles.</p>
<p>Un peu de code plus tard, et je me suis écrit mon client xPL pour pousser automatiquement les données sur la plateforme de CityzenData.<br />
En résumé, toutes les trames de mes sondes (température, hygrométrie, consommation électrique) qui transitent par mon bus xPL sont automatiquement transmises sur la plateforme.</p>
<p>Ce client, vous le trouverez sur mon github :</p>
<p><a title="https://github.com/guiguiabloc/xPL-PyHAL/blob/master/tools/xPL-CityzenData.py" href="https://github.com/guiguiabloc/xPL-PyHAL/blob/master/tools/xPL-CityzenData.py" target="_blank">https://github.com/guiguiabloc/xPL-PyHAL/blob/master/tools/xPL-CityzenData.py</a></p>
<p>(ce client a besoin d&rsquo;un fichier de paramètres, config.sonde (présent dans le dépôt github),qui fait le lien entre le code ID du module et le nom que vous souhaitez donné aux labels).</p>
<ul>
<li>Traiter vos données</li>
</ul>
<p>Pour récupérer, manipuler et traiter les données présentes sur la plateforme, CityzenData a développé un langage appelé Einstein. C&rsquo;est un<a title="http://en.wikipedia.org/wiki/Stack-oriented_programming_language" href="http://en.wikipedia.org/wiki/Stack-oriented_programming_language" target="_blank"> langage de programmation orienté pile</a>, un peu comme le<a title="http://en.wikipedia.org/wiki/Forth_%28programming_language%29" href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29" target="_blank"> Forth</a>.<br />
Voici par exemple mon script einstein qui me permet de récuperer toutes les valeurs consommation électrique :</p>
<pre lang="text">
'Votre_token_lecture'
'=energy'
0 ->MAP
'2014-02-08T00:00:00.000000Z'
'2015-01-01T00:00:00.000000Z'
5 ->LIST
FETCH
</pre>
<p>Ou uniquement les valeurs de températures à l&rsquo;extérieur depuis le 09 février.</p>
<pre lang="text">
'votre_token_lecture'
'=temperature'
'room'
'=exterieur'
2 ->MAP
'2014-02-09T10:00:00.000000Z'
'2015-01-01T00:00:00.000000Z'
5 ->LIST
FETCH
</pre>
<p>Comme pour l&rsquo;insertion de données, une requête http exécute einstein sur la plateforme</p>
<p>curl &#8211;data-binary @guigui.einstein http://api_einstein</p>
<p>Le résultat est au format json :</p>
<pre lang="text">
[[{"c":"temperature","l":{".app":"domotique.guigui","room":"exterieur"},"a":{},"v":[[1391940411191000,7.1],[1391940368152000,7.1],[1391940325145000,7.1],[1391940282146000,7.1],[1391940239143000,7.2],[1391940196144000,7.2],[1391940153143000,7.2],[1391940024140000,7.2]]}]]
</pre>
<p>Pour gérer tout cela en Python :</p>
<pre lang="python">
import urllib
import urllib2
import sys
import json

einstein = open('energy2.einstein', 'r')
data = einstein.read()
url =  'http://api_einstein'
req = urllib2.Request(url, data, {'Content-Type': 'application/octet-stream'})
dataeinstein = json.load(urllib2.urlopen(req))

map = {}
for item in dataeinstein[0][0]['v']:
map[item[0]] = item[1]
print map

# si cherche une valeur pour un timestamp donné
data = {}
data = map
temp = data[1391931523551000]
print temp
</pre>
<p>Il y a bien entendu beaucoup de fonctions incluses dans einstein que ce simple exemple et ce billet ne suffirait pas à toutes les expliquer.</p>
<p>Maintenant que je vous ai présenté tout cela, en quoi cela vous concerne ?</p>
<p>Vous êtes producteur de données, outre le fait de disposer d&rsquo;une plateforme de stockage et de traitement hors normes, vous pouvez mettre à disposition des consommateurs des données qui peuvent les intéresser, et être rémunéré en conséquence.</p>
<p>Vous êtes consommateur, vous disposez de sources de données multiples et variées sur lesquelles vous pouvez appliquer des modèles de calculs et de traitement.</p>
<p>Je vous laisse visiter leur site pour plus d&rsquo;explications et la façon de les contacter si vous êtes intéressé.</p>
<p>J&rsquo;imagine déjà certains d&rsquo;entre vous agiter fièrement le drapeau de la protection de ses données personnelles et du grand méchant cloud, mais il va falloir rapidement que vous rationalisiez tout cela.<br />
Tout d&rsquo;abord, c&rsquo;est vous qui décidez des données que vous mettez à disposition et si le température de votre salon vous semble être une notion totalement privée, alors oui, ce billet ne vous concerne pas.</p>
<p>Ensuite, c&rsquo;est par le partage que l&rsquo;on fait avancer les choses. Si je peux donner à Fibaro (pour en citer un au hasard), la durée de vie de son module (qui tombe en panne par exemple après 67789 utilisations), et qu&rsquo;il revoit sa copie, alors oui ça m&rsquo;intéresse.</p>
<p>En espérant vous avoir ouvert les yeux sur la façon dont on peut valoriser et exploiter des données de domotique,</p>
<p>Amusez vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2014/02/17/domotique-valoriser-et-exploiter-les-donnees/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Domotique et Intelligence : la connaissance</title>
		<link>http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Sat, 04 Jan 2014 18:55:48 +0000</pubDate>
				<category><![CDATA[domotique]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1639</guid>

					<description><![CDATA[Ce qui rend une installation domotique digne de ce nom, c&#8217;est la capacité qu&#8217;a ce système à interagir avec votre environnement mais surtout,  je pense,  a connaître ce qui l&#8217;entoure et de disposer d&#8217;informations lui permettant d&#8217;offrir une réaction ou &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.guiguiabloc.fr/wp-content/2013/12/connaissance.png"><img loading="lazy" class="aligncenter size-full wp-image-1640" alt="connaissance" src="http://blog.guiguiabloc.fr/wp-content/2013/12/connaissance.png" width="221" height="281" /></a></p>
<p style="text-align: left;">Ce qui rend une installation domotique digne de ce nom, c&rsquo;est la capacité qu&rsquo;a ce système à interagir avec votre environnement mais surtout,  je pense,  a connaître ce qui l&rsquo;entoure et de disposer d&rsquo;informations lui permettant d&rsquo;offrir une réaction ou une proposition en corrélation avec votre besoin de l&rsquo;instant présent.</p>
<p style="text-align: left;">Quand <a title="http://blog.guiguiabloc.fr/index.php/2010/02/04/just-what-do-you-think-youre-doing-dave/" href="http://blog.guiguiabloc.fr/index.php/2010/02/04/just-what-do-you-think-youre-doing-dave/" target="_blank">j&rsquo;ai abordé la domotique</a>, j&rsquo;en avais eu plus une vision d&rsquo;intelligence artificielle à mon service que d&rsquo;un simple concept d&rsquo;électronique/informatique appliqué aux objets.<br />
Sûrement parce que les gens de ma génération ont (re)découvert « 2001, L&rsquo;odyssée de l&rsquo;espace » et surtout <a title="http://fr.wikipedia.org/wiki/HAL_9000" href="http://fr.wikipedia.org/wiki/HAL_9000" target="_blank">HAL 9000</a> et s&rsquo;en sont fait un Graal de ce qu&rsquo;aller devenir l&rsquo;informatique dans le futur.</p>
<p style="text-align: left;">Prendre cette voie a profondément modifié ma perception de ce que devait  être mon système domotique mais surtout sa construction et son déploiement.<br />
Je n&rsquo;ai pas eu l&rsquo;approche conceptuelle qui était de rendre mon environnement « contrôlable » mais d&rsquo;intégrer une nouvelle entité virtuelle en son sein.<br />
Cette démarche, que j&rsquo;espère vous présentez au fil de quelques billets au gré de mon humeur et de ma motivation <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> , donne à la domotique un nouveau sens qui, bien que cela demande plus de travail, apporte un oeil différent de cette « maison de demain » si chère à nos fournisseurs/intégrateurs/revendeurs.</p>
<p style="text-align: left;">Le terme « intelligence artificielle » me semble beaucoup trop présomptueux et souvent galvaudé pour l&rsquo;utiliser,  je parlerais donc surtout d&rsquo; « intelligence » au sens large du terme et d&rsquo;entité pour tenter de vous présenter mon approche.</p>
<p style="text-align: left;"><a href="http://blog.guiguiabloc.fr/wp-content/2014/01/alixearticle.png"><img loading="lazy" class="aligncenter size-full wp-image-1649" alt="alixearticle" src="http://blog.guiguiabloc.fr/wp-content/2014/01/alixearticle.png" width="174" height="185" /></a>Le système mis en place chez moi s&rsquo;appelle A.L.I.X.E (<strong>A</strong>utomation <strong>L</strong>ayer for <strong>I</strong>nteract and e<strong>X</strong>changing with <strong>E</strong>nvironment).</p>
<p style="text-align: left;"><em>(pour l&rsquo;anecdote (oui je sais que vous en êtes friand), quand j&rsquo;attendais mon enfant, je souhaitais une fille, et j&rsquo;avais déjà prévu de la prénommer Alixe. J&rsquo;ai eu un garçon (rassurez-vous je n&rsquo;ai pas de regret <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ), mais le prénom est resté dans mon subconscient et c&rsquo;est l&rsquo;entité de la maison qui en a hérité (oui c&rsquo;est obsessionnel un geek <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> )</em></p>
<p style="text-align: left;">C&rsquo;est un serveur dédié a cela. Quand j&rsquo;utilise le terme « serveur » c&rsquo;est uniquement pour avoir une vue « physique » de la chose. C&rsquo;est un système d&rsquo;exploitation, basé sur <a title="http://www.debian.org/index.fr.html" href="http://www.debian.org/index.fr.html" target="_blank">Debian</a>, peaufiné et modifié pour répondre aux besoins (kernel, sécurité, stack reseau, file descriptor , executables, etc&#8230;, bref tout ce qui fait que vous optimisez votre serveur pour un rôle précis), disposant de son propre shell (sa ligne de commande) que j&rsquo;ai développé au fil du temps avec un mélange de <a title="http://fr.wikipedia.org/wiki/Python_(langage)" href="http://fr.wikipedia.org/wiki/Python_(langage)" target="_blank">python</a> et d&rsquo;<a title="http://fr.wikipedia.org/wiki/Erlang_(langage)" href="http://fr.wikipedia.org/wiki/Erlang_(langage)" target="_blank">erlang</a>, de son centralisateur d&rsquo;évènements (dont j&rsquo;ai sorti un version plus légère pour tous, <a title="http://blog.guiguiabloc.fr/index.php/tag/xpl-pyhal/" href="http://blog.guiguiabloc.fr/index.php/tag/xpl-pyhal/" target="_blank">xPL-PyHAL</a>), d&rsquo;un <a title="http://en.wikipedia.org/wiki/Procedural_Reasoning_System" href="http://en.wikipedia.org/wiki/Procedural_Reasoning_System" target="_blank">système de procédure de raisonnement</a>, mais aussi de sa possibilité d&rsquo;agréger des sources d&rsquo;informations diverses et variées et d&rsquo;en tirer sa quintessence pour les exploiter.<br />
Un coeur de l&rsquo;entité reproductible car c&rsquo;est une simple image disque, autonome et déployable en quelques minutes si elle devait se déplacer.<br />
Elle dispose de rôles et de prérogatives clairement définis que, dès le début, j&rsquo;ai tenté de consigner dans un cahier des charges et d&rsquo;explications, qui fait aujourd&rsquo;hui plus de 200 pages&#8230; et qui, je pense, ne sera (re)lu que par moi mais qui m&rsquo;ont forcé dès le début à rester au plus près de la voie que je m&rsquo;étais fixé.</p>
<p style="text-align: left;">La conception habituelle de la domotique est d&rsquo;avoir, dans la majorité la plus répandue des cas, une box domotique sur laquelle on contrôle ses périphériques (interrupteurs, capteurs etc&#8230;) et auxquels on applique des scénarios (« s&rsquo;il fait nuit et qu&rsquo;il y a un mouvement dans la cage d&rsquo;escalier, allume la lumière du couloir du haut et du bas », pour les plus simples).<br />
C&rsquo;est un fonctionnement abordable par tous, simple (si on maitrise un tant soit peu les nouvelles technologies), immédiatement opérationnel (après avoir connecté tout ses modules) et donnant des résultats plus que satisfaisant.</p>
<p style="text-align: left;">Toute cette très longue introduction pour aborder la notion de connaissance dans votre environnement domotique.</p>
<p style="text-align: left;"><a href="http://blog.guiguiabloc.fr/wp-content/2014/01/connaissance2.png"><img loading="lazy" class="aligncenter size-full wp-image-1661" alt="connaissance2" src="http://blog.guiguiabloc.fr/wp-content/2014/01/connaissance2.png" width="280" height="280" srcset="http://blog.guiguiabloc.fr/wp-content/2014/01/connaissance2.png 280w, http://blog.guiguiabloc.fr/wp-content/2014/01/connaissance2-150x150.png 150w" sizes="(max-width: 280px) 100vw, 280px" /></a>Une des choses les plus importantes, que ce soit en informatique ou en domotique, c&rsquo;est la donnée.</p>
<p style="text-align: left;">A ce sujet, je vous invite grandement, avant tout,  à regarder la keynote de Mathias Herberts à l&rsquo;IFREMER (avec qui j&rsquo;ai eu le plaisir de travailler et qui m&rsquo;apporte, encore,  des vues et des échanges plus qu&rsquo;intéressants) dans laquelle il aborde, simplement, le rôle de ses données :</p>
<p><iframe width="640" height="360" src="//www.youtube.com/embed/YPVan6ohMfY?feature=player_detailpage" frameborder="0" allowfullscreen></iframe></p>
<p>Votre système domotique ne peut être performant que si ces données sont importantes, pertinentes et variées mais surtout, s&rsquo;il en a l&rsquo;accès et la connaissance.</p>
<p style="text-align: left;">Lors de la rédaction de mon suivi de déploiement, il m&rsquo;a semblé nécessaire d&rsquo;y inclure une partie « connaissance », que l&rsquo;on pourrait résumer simplement par « Ce que je sais ».</p>
<p style="text-align: left;">Que « sait » votre système domotique à l&rsquo;instant T ? Quelles connaissances a t&rsquo;il de son environnement au moment où vous le solliciter ? Bref, que connais l&rsquo;entité pour apporter la réponse qui vous satisfait le mieux ?</p>
<p style="text-align: left;">La connaissance, aujourd&rsquo;hui, est, du moins par chance dans notre pays, accessible à tous. Quelle que soit la question que vous vous posez, un moteur de recherche internet vous donnera une multitude de sources d&rsquo;informations vous permettant d&rsquo;acquérir cette connaissance (à vous bien sûr d&rsquo;être assez objectif pour faire le tri de ce flot d&rsquo;informations), et surtout de savoir rapidement se cantonner a sa demande <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (tout le monde a eu cette bizarre expérience de chercher une information sur quelque chose et de se retrouver à lire d&rsquo;autres articles très éloignés du sujet principal (va savoir pourquoi aujourd&rsquo;hui je lisais avec intérêt la définition du <a title="http://fr.wikipedia.org/wiki/Diazote" href="http://fr.wikipedia.org/wiki/Diazote" target="_blank">dizaote</a> alors qu&rsquo;à la base je cherchais une information sur un réalisateur de cinéma&#8230;)</p>
<p style="text-align: left;">Cette connaissance, c&rsquo;est à vous de l&rsquo;apporter a votre système et de savoir s&rsquo;il y en a suffisamment pour que sa réaction soit la même que vous auriez eu.</p>
<p style="text-align: left;">Un des tests les plus simples à faire (et que je fais souvent avec ALIXE) est « Que sais-tu ? »</p>
<p style="text-align: left;">Voici par exemple un extrait d&rsquo;une simple réponse donnée à l&rsquo;écriture de ce billet :</p>
<pre lang="text">DANS L'ENSEMBLE, JE SAIS QUE :
Il fait nuit , et nous  sommes en week-end
Aucun mouvement exterieur détecté depuis plus de 1 heure
Le dernier appel téléphonique reçu était le 0298  à 16h32
Tu es présent dans la maison ainsi que Madame et Junior
Tu n'es pas dans ta voiture et pas au travail
Tu n'es pas en RTT, ni Madame
Parmi les parents, personne n'est en congés ou en RTT 
Junior est en vacances scolaires
Nous consommons actuellement 1341 Watts 
Aujourd'hui, nous avons consommé 423 Litres d'eau
Et depuis le dernier relevé, nous avons consommé 34266 Litres d'eau
L'alarme est désactivée
DANS LE SALON
Dans le salon, il y a quelqu'un
Cette personne est Madame
L'halogène du salon est allumé ainsi que la télévision
Les fenêtres sont fermées
Il y fait 20 degrés 
DANS LE BUREAU
Dans le bureau, il n'y a personne
La fenêtre est fermée
Il y fait 19.8 degrés 
L'onduleur est sur secteur et consomme 507 Watts 
L'accès à internet est opérationnel</pre>
<p>C&rsquo;est une très petite extraction de ce qu&rsquo;ALIXE peut ressortir de ses connaissances de l&rsquo;instant T.</p>
<p>Elle est rendu possible parce qu&rsquo;elle dispose de nombreuses sources d&rsquo;informations qui ensuite sont ingérées par le système.<br />
La box domotique Zwave (une VeraLite) est une de ses sources (et n&rsquo;est pas considéré comme le contrôleur principal mais comme un fournisseur de flux), les sondes de températures, une autre, nos agendas gmail, les tags NFC, les smartphones, le récepteur RFXCOM 433 Mhz, les capteurs de mouvements, d&rsquo;ouvertures, les caméras de surveillances, les bornes wifi, etc&#8230;</p>
<p>Tout est source d&rsquo;informations et est envoyée ou reçue par ALIXE.</p>
<p>Ces données informatives sont ou durables dans le temps  par nécessité d&rsquo;exploitation future (les valeurs des sondes de températures et d&rsquo;hygrométrie par exemple) et sont stockées dans une base de données, ou purement volatiles (l&rsquo;état d&rsquo;une lumière ou si je suis dans la voiture par exemple) et là elle sont stockées dans un <a title="http://fr.wikipedia.org/wiki/Memcached" href="http://fr.wikipedia.org/wiki/Memcached" target="_blank">Memcached</a> en tant que clé/valeur (clé:guiguienvoiture valeur:non).</p>
<p>ALIXE ne fait qu&rsquo;interroger ses données pour mettre à jour ses connaissances à l&rsquo;instant T.</p>
<p>Vous utilisez Memcached, vous avez un simple serveur http apache avec php, une page toute bête du genre</p>
<pre lang="php">
<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Connexion impossible");
$get_halogenesalon = $memcache->get('halogenesalon');
if ($get_halogenesalon=="on")
$halogenesalon="allumé";
else
$halogenesalon="éteint";
$memcache->close();
?>

DANS LE SALON :
L'halogène du salon est <?php echo $halogenesalon ; ?> 
</pre>
<p>Et vous avez une idée des connaissances de votre système domotique.</p>
<p>En ne considérant que tout les équipements domotiques de la maison n&rsquo;étaient que des extensions de l&rsquo;entité (les box/contrôleurs compris), cela a profondément modifié la façon d&rsquo;interagir avec l&rsquo;environnement mais surtout de simplifier l&rsquo;interaction et les connaissances qu&rsquo;elle pouvait avoir.</p>
<p>Aujourd&rsquo;hui, je ne suis pas dépendant d&rsquo;une technologie, d&rsquo;une box, ou d&rsquo;un protocole parce que tout cela n&rsquo;est qu&rsquo;un élément, une main d&rsquo;ALIXE.<br />
Tout son « réseau » de données lui donne les connaissances nécessaires pour savoir, quand c&rsquo;est le moment, l&rsquo;état presque complet de son environnement.</p>
<p>Si vous décidez de pousser plus loin le concept de votre domotique personnelle (ou même dans l&rsquo;état actuel de votre installation), prenez à coeur d&rsquo;essayer de recenser les connaissances qu&rsquo;à votre système de votre environnement. Cet état de connaissance poussera beaucoup plus loin les possibilités de scénarios que vous pourriez demander à votre système et pourra même vous suprendre par les lacunes qu&rsquo;il peut avoir.</p>
<p>Quand l&rsquo;état de connaissance de l&rsquo;environnement s&rsquo;approchera très fortement (voir le dépassera dans la plupart des cas, sinon à quoi servirait la domotique <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ), de ce que VOUS savez, la phase d&rsquo;interaction n&rsquo;en sera que plus perspicace et efficace.</p>
<p>Mais ça, c&rsquo;est pour un prochain billet <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2014/01/04/domotique-et-intelligence-la-connaissance/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>Mise en oeuvre d’un serveur d’authentification SSO avec CAS et Memcached</title>
		<link>http://blog.guiguiabloc.fr/index.php/2013/11/11/mise-en-oeuvre-dun-serveur-dauthentification-sso-avec-cas-et-memcached/</link>
					<comments>http://blog.guiguiabloc.fr/index.php/2013/11/11/mise-en-oeuvre-dun-serveur-dauthentification-sso-avec-cas-et-memcached/#comments</comments>
		
		<dc:creator><![CDATA[guiguiabloc]]></dc:creator>
		<pubDate>Mon, 11 Nov 2013 17:15:50 +0000</pubDate>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[cas]]></category>
		<category><![CDATA[sso]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">http://blog.guiguiabloc.fr/?p=1405</guid>

					<description><![CDATA[Après ce billet où j&#8217;ai détaillé la mise en place d&#8217;un load-balancing/failover a base de cascade de NS, nous allons passer aujourd&#8217;hui à la deuxième partie. Et surtout, au but dont je voulais vous parler dans ce petit challenge technique &#8230; <a href="http://blog.guiguiabloc.fr/index.php/2013/11/11/mise-en-oeuvre-dun-serveur-dauthentification-sso-avec-cas-et-memcached/">Read More <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.guiguiabloc.fr/wp-content/2013/11/sso.png"><img loading="lazy" class="aligncenter size-full wp-image-1621" alt="sso" src="http://blog.guiguiabloc.fr/wp-content/2013/11/sso.png" width="299" height="220" /></a></p>
<p>Après <a title="http://blog.guiguiabloc.fr/index.php/2013/02/04/haute-disponibilite-et-load-balancing-par-cascade-de-ns/" href="http://blog.guiguiabloc.fr/index.php/2013/02/04/haute-disponibilite-et-load-balancing-par-cascade-de-ns/" target="_blank">ce billet où j&rsquo;ai détaillé la mise en place d&rsquo;un load-balancing/failover a base de cascade de NS</a>, nous allons passer aujourd&rsquo;hui à la deuxième partie. Et surtout, au but dont je voulais vous parler dans ce petit challenge technique que mon ami <a title="http://www.lostinbrittany.org/blog/" href="http://www.lostinbrittany.org/blog/" target="_blank">Horacio</a> m&rsquo;a doucement poussé à réaliser (bien malgré lui <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> c&rsquo;était plutôt un défi personnel que j&rsquo;avais envie aussi de concevoir).</p>
<p>Au fil de plusieurs discussions techniques enjouées (avec <a title="http://www.lostinbrittany.org/blog/" href="http://www.lostinbrittany.org/blog/" target="_blank">Horacio</a>, le terme enjouée prend rapidement des allures de trolldi <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (private joke)), un système CAS a peuplé nos échanges et je vous en livre ici une explication dans le texte.</p>
<p><a title="http://fr.wikipedia.org/wiki/Central_Authentication_Service" href="http://fr.wikipedia.org/wiki/Central_Authentication_Service" target="_blank">CAS (Central Authentication Service)</a> est un système d&rsquo;authentification unique basé sur une gestion de ticket provisoire.</p>
<p>Il permet à un utilisateur de ne s&rsquo;authentifier qu&rsquo;une fois sur un portail web pour avoir accès à diverses ressources (sites web différents la plupart du temps) qui se base également sur ce système d&rsquo;authentification.<br />
C&rsquo;est le fameux <a title="http://fr.wikipedia.org/wiki/Authentification_unique" href="http://fr.wikipedia.org/wiki/Authentification_unique" target="_blank">SSO (Single Sign-On)</a> dont vous avez peut-être entendu parlé.</p>
<p>Le challenge que je me suis donné est bien entendu de rendre cette solution hautement disponible. Si votre serveur CAS est inaccessible, c&rsquo;est un lot non négligeable d&rsquo;utilisateurs qui ne pourront plus s&rsquo;authentifier, avec les désagréments qui vont avec (des gens en cravate partout dans votre bureau ou par dessus votre épaule pour savoir quand cela remarchera).</p>
<p>Quelques années en arrière, je vous avais parlé de <a title="http://blog.guiguiabloc.fr/index.php/2009/09/08/replication-de-serveurs-memcached/" href="http://blog.guiguiabloc.fr/index.php/2009/09/08/replication-de-serveurs-memcached/" target="_blank">Memcached et de la façon de le faire fonctionner en mode sécurisé</a>. Et ça tombe bien, CAS supporte memcached <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Nous allons considérer que vous avez vos deux serveurs en place, loadbalancés par une technique quelconque (avec <a title="http://blog.guiguiabloc.fr/index.php/2008/07/04/haute-disponibilite-de-fermes-apache-et-tomcat/" href="http://blog.guiguiabloc.fr/index.php/2008/07/04/haute-disponibilite-de-fermes-apache-et-tomcat/" target="_blank">PF sous OpenBSD</a>, avec <a title="http://blog.guiguiabloc.fr/index.php/2013/02/04/haute-disponibilite-et-load-balancing-par-cascade-de-ns/" href="http://blog.guiguiabloc.fr/index.php/2013/02/04/haute-disponibilite-et-load-balancing-par-cascade-de-ns/" target="_blank">une cascade de NS</a>, avec <a title="http://arnofear.free.fr/linux/template.php?tuto=25&amp;page=1" href="http://arnofear.free.fr/linux/template.php?tuto=25&amp;page=1" target="_blank">LVS sous Linux,</a> une appliance propriétaire ou <a title="http://blog.guiguiabloc.fr/index.php/2008/10/17/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec/" href="http://blog.guiguiabloc.fr/index.php/2008/10/17/cluster-haute-disponibilite-chez-ovh-avec-ipfailover-heartbeat-et-drbd-via-ipsec/" target="_blank">une IP FailOver</a>, bref ce que vous voulez).</p>
<p>Première étape, déployer sur le deux serveurs, un memcached répliqué. Rien de bien compliqué si vous avez lu <a title="http://blog.guiguiabloc.fr/index.php/2009/09/08/replication-de-serveurs-memcached/" href="http://blog.guiguiabloc.fr/index.php/2009/09/08/replication-de-serveurs-memcached/" target="_blank">ce billet</a> (je vous laisse bien évidemment validé que vos clés/valeurs se répliquent correctement).</p>
<p>Déployer un serveur <a title="http://tomcat.apache.org/" href="http://tomcat.apache.org/" target="_blank">Tomcat</a> sur chacune de vos machines (Tomcat 6 ou 7 à votre convenance, prenez le Core) avec un java 1.6 minimum.<br />
Wget, puis tar xzvf apache-tomcat-x.x.x.tar.gz etc&#8230; Rien de transcendant.</p>
<p><strong>&#8211; Génération du certificat SSL</strong></p>
<p>CAS exige une connexion https, donc nous allons générer un certificat pour nos tomcats.</p>
<pre lang="text">serveur:/opt/tomcat7# keytool -genkey -alias tomcat -keyalg RSA -validity 365
Tapez le mot de passe du Keystore :
Quels sont vos prénom et nom ?
[Unknown] :  cas.guiguiabloc.fr
Quel est le nom de votre unité organisationnelle ?
[Unknown] :  guiguiabloc
Quelle est le nom de votre organisation ?
[Unknown] :  guiguiabloc
Quel est le nom de votre ville de résidence ?
[Unknown] :  Brest
Quel est le nom de votre état ou province ?
[Unknown] :  Bretagne
Quel est le code de pays à deux lettres pour cette unité ?
[Unknown] :  FR
Est-ce CN=cas.guiguiabloc.fr, OU=guiguiabloc, O=guiguiabloc, L=Brest, ST=Bretagne, C=FR ?
[non] :  oui

Spécifiez le mot de passe de la clé pour tomcat
(appuyez sur Entrée s'il s'agit du mot de passe du Keystore) :</pre>
<p><strong>ATTENTION :</strong> spéficiez bien le nom « loadbalancé » DNS de votre CAS (le nom utilisé pour joindre les deux instances dans le champ « Quels sont vos prénom et nom ? »</p>
<p>Décommentez la partie SSL dans le fichier server.xml de votre Tomcat (/TOMCAT_HOME/conf/server/xml)</p>
<pre lang="text">
<!--
   <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
   maxThreads="150" scheme="https" secure="true"                clientAuth="false" sslProtocol="TLS" />
-->
(Enlevez les <!-- et -->)</pre>
<p>Exporter le certificat pour l&rsquo;installer sur votre autre Tomcat</p>
<pre lang="text">keytool -export -alias tomcat -file servercas.crt</pre>
<p>Sur le deuxième serveur :</p>
<pre lang="text">keytool -import -file servercas.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -alias tomcat</pre>
<p>Démarrer les tomcats (bin/startup.sh) et vérifier qu&rsquo;ils sont bien accessibles sur le port 8443 en https.</p>
<p><strong>&#8211; Installer Maven 2</strong><br />
Rendez vous sur le site du projet Maven et téléchargez la version 2.2.1 (la version 3 n&rsquo;est pas encore recommandé pour CAS)</p>
<pre lang="bash">wget http://mirrors.ircam.fr/pub/apache/maven/maven-2/2.2.1/binaries/apache-maven-2.2.1-bin.tar.gz
tar xzvf apache-maven-2.2.1-bin.tar.gz
ln -s apache-maven-2.2.1 maven2</pre>
<p>Ajouter l&#8217;emplacement des binaires Maven2 à votre PATH (et votre JAVA_HOME si cela n&rsquo;a pas déjà été fait)</p>
<pre lang="bash"># export PATH=/opt/maven2/bin:$PATH
#export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26/jre</pre>
<p>(OUI ! je sais, j&rsquo;ai une vieille version de JAVA toute pourrie sur mes serveurs de tests <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> donc je vous laisse mettre à jour la votre)</p>
<p>Vérifier que Maven est opérationnel :</p>
<pre lang="bash"># mvn --version
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_26
Java home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre
Default locale: fr_FR, platform encoding: ISO-8859-15
OS name: "linux" version: "2.6.26-2-686" arch: "i386" Family: "unix"</pre>
<p>(OUI ! Je sais, j&rsquo;ai un kernel tout moisi. Ca suffit à la fin !)</p>
<p><strong>&#8211; Installer CAS</strong></p>
<p>Nous allons utiliser la version communautaire de CAS, conçu par l&rsquo;université de Yale et maintenu désormais par le projet Jasig qui réunit diverses écoles.<br />
Téléchargez la dernière version a ce jour (3.5.2) :<br />
<a title="http://www.jasig.org/cas/download" href="http://www.jasig.org/cas/download" target="_blank">http://www.jasig.org/cas/download</a><br />
Une fois le fichier détarré/dégzippé, créer votre propre environnement de travail :</p>
<pre lang="bash">cd /opt/cas-server-3.5.2
mkdir cas-guiguiabloc
cd cas-guiguiabloc</pre>
<p>Dans le répertoire de votre projet, nous allons créer le fichier « de configuration » de CAS. Il contient les appels vers les différentes dépendances disponibles.<br />
Ce fichier s&rsquo;appelle pom.xml</p>
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.guiguiabloc.cas</groupId>
    <artifactId>cas-guiguiabloc</artifactId>
    <packaging>war</packaging>
    <version>1.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                 <artifactId>maven-war-plugin</artifactId>
                             <configuration>
                                 <warName>cas</warName>
                             </configuration>
                        </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-webapp</artifactId>
            <version>${cas.version}</version>
            <type>war</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-support-generic</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-integration-memcached</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
        </dependency>
    </dependencies>

    <properties>
        <cas.version>3.5.2</cas.version>
    </properties>

        <repositories>
             <repository>
                  <id>ja-sig</id>
                  <url>http://oss.sonatype.org/content/repositories/releases/ </url>
             </repository>
        </repositories>
</project>

</pre>
<p>Je ne détaillerais pas tout, la documentation de CAS est assez explicite, mais dans notre exemple, nous allons utiliser une webapp générique, avec le support memcached et que Maven2 puisse utiliser les dépots publics de Jasig.</p>
<p>C&rsquo;est parti pour une première compilation !</p>
<pre lang="bash">cd /opt/cas-server-3.5.2/cas-guiguiabloc
mvn clean package</pre>
<p>Laisser le temps a Maven de télécharger Internet et le résultat devrait apparaitre</p>
<pre lang="text">[INFO] [war:war {execution: default-war}]
[INFO] Packaging webapp
[INFO] Assembling webapp[cas-guiguiabloc] in [/opt/cas-server-3.5.2/cas-guiguiabloc/target/cas-guiguiabloc-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Processing overlay[ id org.jasig.cas:cas-server-webapp]
[INFO] Webapp assembled in[4636 msecs]
[INFO] Building war: /opt/cas-server-3.5.2/cas-guiguiabloc/target/cas.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 minutes 36 seconds
[INFO] Finished at: Mon Nov 11 00:42:10 CET 2013
[INFO] Final Memory: 18M/44M
[INFO] ------------------------------------------------------------------------</pre>
<p>En l&rsquo;état, vous avez donc maintenant un joli cas.war dans le répertoire target de votre projet que vous pouvez déposer dans votre tomcat/webapps/.<br />
Cela vous permet déjà de vérifier que tout fonctionne comme il se doit sur https://serveur:8443/cas</p>
<p>Maintenant, peaufinons tout cela :</p>
<pre lang="bash">serveur:/opt/cas-server-3.5.2/cas-guiguiabloc# mkdir -p src/main/webapp/WEB-INF</pre>
<p>Dans ce répertoire WEB-INF, nous allons y copier le fichier :<br />
/opt/cas-server-3.5.2/cas-guiguiabloc/target/cas-guiguiabloc-1.0-SNAPSHOT/WEB-INF/deployerConfigContext.xml<br />
et le modifier pour inclure :<br />
&#8211; l&rsquo;authentification locale par un user/mot de passe<br />
&#8211; le support de memcached</p>
<p>Pour l&rsquo;authentification locale, ajouter la section suivante :</p>
<pre lang="xml">
<bean class="org.jasig.cas.adaptors.generic.AcceptUsersAuthenticationHandler">
 <property name="users">
   <map>
   <entry>
   <key>
                                                                <value>guiguiabloc</value>
   </key>
                                                                <value>1234</value>
   </entry>
   </map>
   </property>
   </bean>

</pre>
<p>&nbsp;</p>
<p>Ici nous créons un simple utilisateur « guiguiabloc » avec le mot de passe 1234.<br />
En prod, vous pourrez utiliser un autre système d&rsquo;authentification bien sur (LDAP etc&#8230;)</p>
<p>Pour le support memcached, voici la section a ajouter :</p>
<pre lang="xml">
bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.MemCacheTicketRegistry">
  <constructor-arg index="0" ref="memcachedClient" />
  <constructor-arg index="1" value="21600" />
  <constructor-arg index="2" value="300" />
</bean>
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean"
      p:servers="127.0.0.1:11211"
      p:protocol="TEXT"
      p:locatorType="ARRAY_MOD"
      p:failureMode="Cancel"
      p:transcoder-ref="kryoTranscoder">
</bean>
<bean id="kryoTranscoder"
      class="org.jasig.cas.ticket.registry.support.kryo.KryoTranscoder"
      init-method="initialize">
  <constructor-arg index="0" value="8192" />
</bean>


</pre>
<p>Bien sur je ne peux que vous invitez a lire la documentation officielle <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
<a title="https://wiki.jasig.org/display/CASUM/MemcacheTicketRegistry" href="https://wiki.jasig.org/display/CASUM/MemcacheTicketRegistry" target="_blank">https://wiki.jasig.org/display/CASUM/MemcacheTicketRegistry</a></p>
<p>A toute fin utile, vous trouverez <a title="http://blog.guiguiabloc.fr/deployerConfigContext.xml" href="http://blog.guiguiabloc.fr/deployerConfigContext.xml" target="_blank">ICI</a> le fichier deployerConfigContext.xml que j&rsquo;ai utilisé.</p>
<p>On recompile le WAR dans cas-guiguiabloc (mvn clean package) et on le copie dans nos webapps Tomcat (après avoir supprimé l&rsquo;ancien répertoire cas)</p>
<p>Démarrez vos Tomcat et authentifiez vous sur la mire CAS, Tadam !<br />
Si tout se passe bien, la connexion réussi et vous devez avoir un cookie CAS :</p>
<pre lang="text">Name	CASTGC
Value	TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org
Domaine (host)	cas.guiguiabloc.fr
Chemin d'accès (path)	/cas/
Sécurisé	oui
Expire le	À la fin de la session</pre>
<p>Et magie, sur vos deux memcached, vous allez retrouver votre ticket en recherchant la valeur du cookie en tant que clé :</p>
<pre lang="text">Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org
VALUE TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org 0 386
BH .
guiguiablocuiduidgroupMembershipgroupMembershipeduPersonAffiliationeduPersonAffiliationauthenticationMethod?org.jasig.cas.adaptors.generic.AcceptUsersAuthenticationHandlerÞÉP!Ð»ôîJTGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.orgäÉPÞÉP+ST-6-iHWaAvdowI0WGE1du76P-cas01.example.org
END</pre>
<p>Vos deux serveurs CAS se partagent la même source d&rsquo;information de tickets valides <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>J&rsquo;espère que cette petite approche de CAS vous aura émoustillé. Bien entendu, il existe plein d&rsquo;options de compilation et de configuration qui vous permettrons d&rsquo;avoir un/des serveur(s) CAS aux petits oignons.</p>
<p>Si vous souhaitez maintenant intégrer votre serveur web à CAS (avec Apache par exemple), vous trouverez un très bon tuto ici :<br />
<a title="https://ucdavis.jira.com/wiki/display/IETP/mod_auth_cas" href="https://ucdavis.jira.com/wiki/display/IETP/mod_auth_cas" target="_blank">https://ucdavis.jira.com/wiki/display/IETP/mod_auth_cas</a><br />
Pour info, la méthode la plus facile pour compiler le mod_auth_cas avec apxs2 est :</p>
<pre lang="bash">apxs2 -i -lssl -lcurl -c mod_auth_cas.c cas_saml_attr.c</pre>
<p>Amusez-vous bien <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>http://blog.guiguiabloc.fr/index.php/2013/11/11/mise-en-oeuvre-dun-serveur-dauthentification-sso-avec-cas-et-memcached/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>