<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://blog.frederic.senis.org/index.php/">
  <title>Mon para-monde</title>
  <description><![CDATA[tout ce qui n'a pas d'importance impose d'être publié]]></description>
  <link>http://blog.frederic.senis.org/index.php/</link>
  <dc:language>fr</dc:language>
  <dc:creator />
  <dc:rights />
  <dc:date>2012-02-05T14:29:05+01:00</dc:date>
  <admin:generatorAgent rdf:resource="http://www.dotclear.net/" />
  
  <sy:updatePeriod>daily</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
  <sy:updateBase>2012-02-05T14:29:05+01:00</sy:updateBase>
  
  <items>
  <rdf:Seq>
    <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/02/05/79-elv-max-contenu-de-la-ligne-l-ive" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/02/05/78-elv-max-contenu-de-la-config" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/01/28/77-j-ai-decouvert-une-commande-de-plus-sur-elv-max-ben-j-aurais-prefere-m-en-passer-" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/01/27/76-elv-max-lignes-host-h-et-maison-m-" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/01/25/75-elv-max-debut-d-exploration" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/01/24/74-domotiqueuh-tiqueuh-tiqueh-thermostats-elv-max" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2012/01/16/73-rechute-de-geek-arduino" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2011/03/03/72-presenter-proprement-la-playlist-tv-de-free-pour-regarder-la-tv-sur-un-ipad" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2010/01/15/71-les-temps-changent-on-se-degeekifie" />
  <rdf:li rdf:resource="http://blog.frederic.senis.org/index.php/2009/12/12/70-les-petits-clics-c-est-pas-automatique" />
  </rdf:Seq>
  </items>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rdf+xml" href="http://feeds.feedburner.com/senis/PgLT" /><feedburner:info uri="senis/pglt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /></channel>

<item rdf:about="http://blog.frederic.senis.org/index.php/2012/02/05/79-elv-max-contenu-de-la-ligne-l-ive">
  <title>ELV Max! Contenu de la ligne L:ive</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/bt76_JMp9os/79-elv-max-contenu-de-la-ligne-l-ive</link>
  <dc:date>2012-02-05T14:29:05+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>A la différence des lignes de C:onfig qui sont aussi nombreuses qu'il y a de périphériques branchés, la ligne L:ive est unique. Tous les périphériques sont regroupés en une seule ligne.


Par ailleurs il n'y a pas d'information sur le cube dans la ligne L:


Interogation du cube


On peut...</description>
  <content:encoded><![CDATA[ <p>A la différence des lignes de C:onfig qui sont aussi nombreuses qu'il y a de périphériques branchés, la ligne L:ive est unique. Tous les périphériques sont regroupés en une seule ligne.</p>


<p>Par ailleurs il n'y a pas d'information sur le cube dans la ligne L:</p>


<p><strong>Interogation du cube</strong></p>


<p>On peut demander une nouvelle ligne L:ive mise à jour par l'envoi de "l:" (L minuscule) suivi de CR+LF
Le cube répond alors par une ligne L: contenant les dernières données dont il dispose.</p>


<p><strong>Structure générale d'une ligne L:</strong></p>


<p>La ligne L: ne possède qu'un champ encodé en Base64</p>


<pre>par exemple :
L:CwD7bQASGEcpAAAA</pre>


<p><strong>Contenu du champ</strong></p>


<p>L'exemple ci-dessus se décode en&nbsp;:</p>


<pre>0b 00 fb 6d 00 12 18 47 29 00 00 00</pre>


<p>On repère tout de suite les octets 2,3,4 "00fb6d" correspondant à une adresse.
Par ailleurs, le premier octet contient 0x0b correspondant au nombre d'octets qui suivent (lorsqu'il y a plusieurs périphériques connectés, on retrouve à nouveau cette même structure &lt;longueur&gt;&lt;contenu&gt; répétée autant de fois qu'il y a de périphériques.</p>


<p>On remarque aussi, pas mal d'octets à 0x00, ca va pas nous aider à dépiauter la bêêête mais ça s'arrange après avoir modifier des éléments de config :) .</p>


<pre>Position     Champ
0              1 octet  = longueur du morceau de réponse suivant (je n'ai rencontré que des enregistrements de 11 caractères : 0x0b)
1              3 octets = Adresse
4              1 octet  = ? 
5              1 octet  = ? 
6              1 octet  = ? 
                  bits 1-2 = ?
                  bit 3    = Verrouillage clavier
                  bits 4-6 = ?
                  bits 7-8 = Mode
7              1 octet  = Position de la valve (0-100)
8              1 octet  = Température de consigne réglée sur la tête
9-10           2 octets = Date de fin
11             1 octet  = Heure de fin</pre>


<p>Les octets 4-6 ne sont pas souvent modifiés par des actions par la webapp ou par modification des réglages de la tête, les seuls bits modifiés de façon synchrone sont sur l'octet 6 (bits 7 et 8) et correspondent au mode (0b00&nbsp;: mode auto, 0b01&nbsp;: mode manu, 0b10&nbsp;: mode temporaire, 0b11&nbsp;: mode Boost)</p>


<p>Date et heure ne sont valides que lorsqu'on est en mode "temporaire".</p>
<p><a href="http://feedads.g.doubleclick.net/~a/VelI5dGMDr-3-jDpoadGtbhQc-o/0/da"><img src="http://feedads.g.doubleclick.net/~a/VelI5dGMDr-3-jDpoadGtbhQc-o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VelI5dGMDr-3-jDpoadGtbhQc-o/1/da"><img src="http://feedads.g.doubleclick.net/~a/VelI5dGMDr-3-jDpoadGtbhQc-o/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/02/05/79-elv-max-contenu-de-la-ligne-l-ive</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/02/05/78-elv-max-contenu-de-la-config">
  <title>ELV Max! Contenu de la config (ligne C:)</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/qXChVvBnhf4/78-elv-max-contenu-de-la-config</link>
  <dc:date>2012-02-05T11:44:52+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>La ligne C: se décompose en 2 champs principaux. Outre l'entête "C:", on retrouve le code d'adressage en hexadécimal sur 6 caractères (donc une fois retransformé, sur 24bits) suivi d'une virgule et à nouveau un contenu encodé en Base64....</description>
  <content:encoded><![CDATA[ <p>La ligne C: se décompose en 2 champs principaux. Outre l'entête "C:", on retrouve le code d'adressage en hexadécimal sur 6 caractères (donc une fois retransformé, sur 24bits) suivi d'une virgule et à nouveau un contenu encodé en Base64.</p>



<pre>C:007ead,7QB+rQAJAQBJRVEwMTEyMjQwAAsABEAAAAAAAAAAAP///////////////////////////wsABEAAAAAAAAAAQf///////////////////////////2h0dHA6Ly93d3cubWF4LXBvcnRhbC5lbHYuZGU6ODAvY3ViZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADAAAOEENFU1QAAwAAAAAcIA==</pre>



<p>Voici donc la ligne correspondant au périphérique 007ead. Dans le cas présent, il s'agit du cube lui-même et je n'en étudierai pas la config tout de suite car peu intéressante, pour le plaisir voici le décodage (les données alphanumériques sont soulignées, le reste est en hexadécimal)&nbsp;:</p>



<p>ED <strong>007EAD</strong> 00 09 01 00 <ins>IEQ0112240</ins> 00 0B 00 04 40 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0B 00 04 40 00 00 00 00 00 00 00 41 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <ins>http://www.max-portal.elv.de:80/cube</ins> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <ins>CET</ins> 00 00 0A 00 03 00 00 0E 10 <ins>CEST</ins> 00 03 00 00 00 00 1C 20</p>



<p>On y découvre entre autre l'URL du backend du portail web (l'adresse du frontend est à http://www.max-portal.elv.de/ ).</p>



<p><strong>Intéressons-nous plutôt aux thermostats.</strong></p>


<p>La config est là-aussi contenue dans un champ encodé en base64. Celle-ci étant particulièrement longue, je vous en fait grâce et je vais me contenter d'en faire le détail&nbsp;:</p>



<pre>Position     Champ
0              1 octet  = ?
1              3 octets = Adresse
4              1 octet  = Type de périphérique (0=Cube?, 1=Thermostat)
5              1 octet  = ?
6              10 octets= Numéro de série (IEQXXXXXXX)
16             1 octet  = Température de confort (*)
17             1 octet  = Température Eco (*)
18             1 octet  = Température maximale de réglage (4.5° soit 0x09 = valeur de 'off')
19             1 octet  = Température minimal de réglage (30.5° soit 0x3d = valeur de 'on')
20             1 octet  = Décalage de réglage température (*)
21             1 octet  = Température en cas d'ouverture de fenêtre (*)
22             1 octet  = Durée de changement de consigne en cas d'ouverture de fenêtre (*)
23             1 octet  = bitfield de 8 bits
                3 bits   = durée du Boost (*)
                 5 bits   = valeur de valve du Boost (*)
24             1 octet  = bitfield de 8 bits
                3 bits   = Jour du cycle de détartrage de la valve (*)
                 5 bits   = heure de détartrage de la valve (*)
25             1 octet  = position maximum de la valve ? (255) peut-être dépendant du réglage initial de course
26             1 octet  = position de départ de la valve ? (0) peut-être dépendant du réglage initial de course
27             début des programmes journaliers (7 groupes = 1 par jour) (*)
(*) les valeurs sont modifiables depuis la webapp</pre>


<p>Les températures sont exprimées en multiples de 0,5° (Température = Valeur/2)</p>


<p>La liste des jours commence le Samedi(=0 ???) jusqu'au Vendredi (=7)</p>


<p>Le décalage de température est exprimé en multiples de 0,5° à ajouter à  -3,5° (Décalage = Valeur/2 - 3.5)</p>


<p>La durée du boost se calcule donc par Durée = (Valeur &amp; 0xE0)&gt;&gt;5 et la valeur de valve par Valve = (Valeur &amp; 0x1F)</p>


<p>Idem pour le détartrage&nbsp;: Jour = (Valeur &amp; 0xE0)&gt;&gt;5 et Heure = (Valeur &amp; 0x1F)</p>



<p>Un programme journalier est constitué de 26 octets, 13 blocs de 2 octets pour être plus précis soit 13 paliers programmables par jour.
Sur ses 16bits (composant les 2 octets MSB et LSB), sont encodées 2 grandeurs&nbsp;: la température de consigne et l'heure de fin.</p>

<pre>0TTTTTTH.HHHHHHHH</pre>



<p>La Température est à nouveau exprimée en multiple de 0,5 tandis que l'heure est exprimée en multiple de 5 minutes</p>



<p>Donc partant du principe qu'on lit les octets un par un, on a&nbsp;:</p>

<pre>Température = ((MSB &amp; 0x7E)&gt;&gt;1)/2
Heure de fin = ((MSB &amp; 0x01)*256+LSB)*0.5</pre>



<p>Il me reste donc 2 champs dont je n'arrive pas à comprendre la signification (0 et 5).</p>


<p><strong>Demander une ligne de C:onfig</strong></p>


<p>Il est possible de demander la ligne de configuration d'un périphérique spécifique si on connait son adresse.</p>


<p>Pour cela il faut envoyer la commande "c:" suivie de l'adresse en hexadécimal par exemple (terminer par CR+LF)&nbsp;:</p>


<pre>c:007ead
C:007ead,&lt;........................&gt;</pre>

<p>Le résultat est la ligne C: telle qu'on peut la voir en haut de l'article. Si l'adresse est inconnue, il n'y a pas de réponse.</p>


<p><strong>Méthodologie</strong></p>


<p>La méthode pour repérer tout cela est principalement de lancer depuis l'interface web des commandes unitaires puis de récupérer la configuration immédiatement après afin d'isoler les différences et d'en tirer une signification.</p>


<p>Pour les champs non modifiables (température maxi ou min), il faut faire des essais ("si c'était une température, si je divise par 2 est-ce que ca donne une valeur qui a du sens ?") éventuellement avec le manuel pas loin</p>
<p><a href="http://feedads.g.doubleclick.net/~a/nkMVh2EMYGHqI9lQYSrVIQgff1w/0/da"><img src="http://feedads.g.doubleclick.net/~a/nkMVh2EMYGHqI9lQYSrVIQgff1w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nkMVh2EMYGHqI9lQYSrVIQgff1w/1/da"><img src="http://feedads.g.doubleclick.net/~a/nkMVh2EMYGHqI9lQYSrVIQgff1w/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/02/05/78-elv-max-contenu-de-la-config</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/01/28/77-j-ai-decouvert-une-commande-de-plus-sur-elv-max-ben-j-aurais-prefere-m-en-passer-">
  <title>J'ai découvert une commande de plus sur ELV Max!, ben j'aurais préféré m'en passer... :)</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/f0RMcfAHtrs/77-j-ai-decouvert-une-commande-de-plus-sur-elv-max-ben-j-aurais-prefere-m-en-passer-</link>
  <dc:date>2012-01-28T13:05:03+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>Alors que je bidouillais le Cube via netcat, j'ai lancé quelques commandes de la forme &lt;lettre&gt;&lt;:&gt;&lt;cr&gt;&lt;lf&gt;


Et bien, ca m'a permis de découvrir à mon corps défendant la commande "a:" que l'on peut désormais surnommer "Reset sauvage de toute les métadonnées".


4...</description>
  <content:encoded><![CDATA[ <p>Alors que je bidouillais le Cube via netcat, j'ai lancé quelques commandes de la forme &lt;lettre&gt;&lt;:&gt;&lt;cr&gt;&lt;lf&gt;</p>


<p>Et bien, ca m'a permis de découvrir à mon corps défendant la commande "a:" que l'on peut désormais surnommer "Reset sauvage de toute les métadonnées".</p>


<p>4 petits caractères suffisent à ramener le cube dans un état immaculé&nbsp;:</p>


<pre>H:IEQ0112240,007ead,0109,00000000,2ee8c053,00,32,0c011c,0c2b
M:
C:007ead,7QB+rQAJAQBJRVEwMTEyMjQwAAsABEAAAAAAAAAAAP///////////////////////////wsABEAAAAAAAAAAQf///////////////////////////2h0dHA6Ly93d3cubWF4LXBvcnRhbC5lbHYuZGU6ODAvY3ViZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADAAAOEENFU1QAAwAAAAAcIA==
L:</pre>


<p>On voit le champ M: vide, l'absence de données L:ive et une seule ligne de config pour le Cube lui-même...</p>


<p>La bonne nouvelle, c'est qu'après avoir fait le réapprentissage d'un thermostat, il semble que la config soit retrouvée (retéléchargée du la tête ?)</p>


<pre>H:IEQ0112240,007ead,0109,00000000,233903cd,04,32,0c011c,0d04
M:00,01,VgIBAQZCdXJlYXUA+20BAQD7bUlFUTAxODQ5OTkHQnVyZWF1MQEB
C:007ead,7QB+rQAJAQBJRVEwMTEyMjQwAAsABEAAAAAAAAAAAP///////////////////////////wsABEAAAAAAAAAAQf///////////////////////////2h0dHA6Ly93d3cubWF4LXBvcnRhbC5lbHYuZGU6ODAvY3ViZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADAAAOEENFU1QAAwAAAAAcIA==
C:00fb6d,0gD7bQEBFP9JRVEwMTg0OTk5KiI9CQcYAzAM/wBESFUIRSBFIEUgRSBFIEUgRSBFIEUgRSBFIERIVQhFIEUgRSBFIEUgRSBFIEUgRSBFIEUgREhUbETMVRRFIEUgRSBFIEUgRSBFIEUgRSBESFRsRMxVFEUgRSBFIEUgRSBFIEUgRSBFIERIVGxEzFUURSBFIEUgRSBFIEUgRSBFIEUgREhUbETMVRRFIEUgRSBFIEUgRSBFIEUgRSBESFRsRMxVFEUgRSBFIEUgRSBFIEUgRSBFIA==
L:CwD7bQASGEcpAAAA</pre>


<p>On peut noter au passage que le champ 6 de H: a changé (00 -&gt; 04) mais je ne sais pas pourquoi..</p>
<p><a href="http://feedads.g.doubleclick.net/~a/U_g1Z-FO9hMTiGMAeNNO7RRcCRA/0/da"><img src="http://feedads.g.doubleclick.net/~a/U_g1Z-FO9hMTiGMAeNNO7RRcCRA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/U_g1Z-FO9hMTiGMAeNNO7RRcCRA/1/da"><img src="http://feedads.g.doubleclick.net/~a/U_g1Z-FO9hMTiGMAeNNO7RRcCRA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/01/28/77-j-ai-decouvert-une-commande-de-plus-sur-elv-max-ben-j-aurais-prefere-m-en-passer-</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/01/27/76-elv-max-lignes-host-h-et-maison-m-">
  <title>ELV MAX! Lignes Host (H:) et Maison (M:)</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/zMqvpwgFAUo/76-elv-max-lignes-host-h-et-maison-m-</link>
  <dc:date>2012-01-27T10:24:11+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>Revenons à l'étude de la réponse initiale du Cube Max!


Le format le plus global est :

un ensemble de lignes commençant toutes par une lettre suivie d'un "deux points" lui même suivi d'un contenu
chaque ligne est terminée par un marqueur assez classique : cr/lf (carriage...</description>
  <content:encoded><![CDATA[ <p>Revenons à l'étude de la réponse initiale du Cube Max!</p>


<p>Le format le plus global est&nbsp;:</p>
<ul>
<li>un ensemble de lignes commençant toutes par une lettre suivie d'un "deux points" lui même suivi d'un contenu</li>
<li>chaque ligne est terminée par un marqueur assez classique&nbsp;: cr/lf (carriage return/line feed)</li>
</ul>

<p>Voici ce que j'ai pu tirer pour l'instant des lignes H et M</p>


<p><ins><strong>H:</strong></ins></p>


<p>Contient des données très basiques sur le système&nbsp;:
Les champs du contenu sont séparés par des virgules</p>


<pre>H:IEQ0112240,007ead,0109,00000000,35e2322f,00,32,0c011b,0909</pre>


<p>que l'on peut découper en&nbsp;:</p>

<ul>
<li>IEQ0112240 = numéro de série du Cube (invariant dans la même installation, il est imprimé sous le cube), format alphanumérique</li>
<li>007ead = nombre constant (on le retrouve ailleurs sur la première ligne C:, on le verra plus tard), c'est donc d'une certaine manière un moyen d'adressage, format hexadécimal sur 3 octets</li>
<li>0109 = la version du microcode embarqué a priori (le code a changé après une mise à jour)</li>
<li>00000000 = euh comment dire... des zéros&nbsp;?</li>
<li>35e2322f = un nombre variant totalement à chaque connexion, probablement un identifiant de connexion mais on ne le retrouve nulle par ailleurs, format hexadécimal sur un long (32bits)</li>
<li>00 = encore des 0... impossible d'en savoir la signification</li>
<li>32 = toujours 32 là aussi... impossible d'en tirer une conclusion</li>
<li>0c011b = là aussi un invariant</li>
<li>0909 = Est-ce que ca ne serait pas 9 heures 09 (si c'est le cas, le cube n'est pas à l'heure :) ), à voir lorsqu'on passera</li>
</ul>

<p><ins><strong>M:</strong></ins></p>


<pre>M:00,01,VgIHAQdDdWlzaW5lAP4uAgtTYWxsZSBkJ2VhdQD99QMNQ2hhbWJyZSBMdWNhcwCWrAQTQ2hhbWJyZSBGcmVkIExvdWxvdQCZbwUGQnVyZWF1APttBg1TYWxsZSBkZSBiYWluAPx4BwVTYWxsZQCWkgcBAP4uSUVRMDE4NDgxMgdDdWlzaW5lAQEA/fVJRVEwMTg0NzQ0C1NhbGxlIGQnZWF1AgEAlqxJRVEwMTg2MTYyDUNoYW1icmUgTHVjYXMDAQCZb0lFUTAxODMzMTcTQ2hhbWJyZSBGcmVkIExvdWxvdQQBAPttSUVRMDE4NDk5OQZCdXJlYXUFAQD8eElFUTAxODUxNjYNU2FsbGUgZGUgYmFpbgYBAJaSSUVRMDE4NjExNw9TYWxsZSDDoCBtYW5nZXIHAQ==</pre>


<p>La ligne M: là aussi contient des champs séparés par des virgules. Et là aussi les 2 premiers sont invariants d'une connexion à l'autre (toujours 00 et 01)
Suit un champ beaucoup plus long qui semble codé mais on note qu'on a affaire à des caractères tous "imprimables" et qu'en fin de ligne on retrouve des "=" typiques du remplissage final en <a href="http://fr.wikipedia.org/wiki/Base64" hreflang="fr">base64</a></p>


<p>Si on décode ce 3ème champ comme du base64 on récupère en effet un contenu contenant des éléments reconnaissables et cohérents (les caractères non imprimables ont été supprimés)&nbsp;:</p>


<pre>V(...)Cuisine(...)Salle d'eau(...)Chambre Lucas(...)Chambre Fred Loulou(...)Bureau(...)Salle de bain(...)Salle(...)IEQ0184812 Cuisine(...)IEQ0184744 Salle d'eau(...)IEQ0186162 Chambre Lucas(...)IEQ0183317 Chambre Fred Loulou(...)IEQ0184999 Bureau(...)IEQ0185166 Salle de bain(...)IEQ0186117 Salle Ã  manger(...)</pre>


<p>Dans ce contenu binaire on peut retrouver une certaine organisation&nbsp;: Il y a 3 sous-ensembles.</p>


<p><br />** un préambule de 2 octets au contenu inconnu
<br />** une structure décrivant les pièces (organisation logique)
<br />** une structure décrivant les périphériques (organisation physique)</p>


<p><ins>Format de la liste des pièces</ins></p>


<p>Le premier octet contient le nombre de pièces définies (roomCount).
A sa suite, on retrouve répétée <em>roomCount</em> fois une structure définissant une pièce&nbsp;:</p>

<ul>
<li>Nombre de caratères du nom de la pièce (1 octet)</li>
<li>Nom de la pièce (X octets cf supra)</li>
<li>ID de la pièce (1 octet)</li>
<li>3 octets dont le contenu ressemble au champ qualifié d'adressage sur la ligne H:, mais il ne semble pas utilisé (ID est utilisé ensuite)</li>
</ul>

<p>Immédiatement après la liste des pièces on attaque la liste des périphériques (thermostats)
Le principe est le même que la liste des pièces.</p>


<p><ins>Format de la liste des périphériques</ins></p>


<p>Le premier octet contient le nombre de périphériques définis (devCount).</p>


<p>La aussi on retrouve <em>devCount</em> fois une structure de périphérique&nbsp;:</p>

<ul>
<li>Type de périphérique (1 octet) 0=Cube, 1=Tête thermostatique, peut-être y en a t'il d'autres pour par exemple le thermostat mural (mais je n'en ai pas)</li>
<li>3 octets "d'adressage", le contenu de ce champ se retrouve comme premier champ des lignes C: suivantes permettant de les rattacher à un périphérique</li>
<li>10 octets de numéro de série</li>
<li>1 octet de nombre de caractères du nom du périphérique</li>
<li>Nom du périphérique (X octets ci-dessus)</li>
<li>ID de la pièce de rattachement (1 octet)</li>
</ul>

<p>Voilà, avec la ligne M: on peut construire la structure de notre maison.</p>


<p>La prochaine fois, je m'attaque à la ligne C: qui donne la config courante d'un périphérique.</p>
<p><a href="http://feedads.g.doubleclick.net/~a/g6sTRWiVxsFFQP34xTohBdNHgk0/0/da"><img src="http://feedads.g.doubleclick.net/~a/g6sTRWiVxsFFQP34xTohBdNHgk0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/g6sTRWiVxsFFQP34xTohBdNHgk0/1/da"><img src="http://feedads.g.doubleclick.net/~a/g6sTRWiVxsFFQP34xTohBdNHgk0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/01/27/76-elv-max-lignes-host-h-et-maison-m-</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/01/25/75-elv-max-debut-d-exploration">
  <title>ELV MAX! Début d'exploration</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/CkSXwnO45DM/75-elv-max-debut-d-exploration</link>
  <dc:date>2012-01-25T20:29:04+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>General</dc:subject>
  <description>Je vais vous épargner le détail de la méthodologie mais pour faire simple. Il faut sniffer le réseau entre l'appli java qui réside sur l'ordinateur et le boîtier. Pour cela, j'ai fait brutal (parce que bien sur l'appli ne marche que sous Windows) : j'ai intercalé un ordi entre les 2, mis...</description>
  <content:encoded><![CDATA[ <p>Je vais vous épargner le détail de la méthodologie mais pour faire simple. Il faut sniffer le réseau entre l'appli java qui réside sur l'ordinateur et le boîtier. Pour cela, j'ai fait brutal (parce que bien sur l'appli ne marche que sous Windows)&nbsp;: j'ai intercalé un ordi entre les 2, mis en place l'IP forwarding et lancé mon fidèle wireshark (un logiciel de capture de trame réseau et d'analyse). On peut aussi bien sur capturer directement sur l'ordinateur "source".</p>


<p>Voici les premiers constats&nbsp;:</p>
<ul>
<li>l'appli se connecte à son lancement au cube sur le port 80, on se dit alors <em>Chouette il y a un serveur web embarqué</em>. Hélas on déchante vite car une fois l'appli connectée, impossible d'initier une autre connexion TCP/IP vers le port 80. Le cube ne supporte qu'un seul logiciel de commande à la fois...</li>
<li>il ne s'agit pas de HTTP non plus. En effet, toute connexion même sans envoi de requête génère une réponse du cube. Voici un exemple de réponse à l'ouverture d'une connexion (sans rien envoyer)&nbsp;:</li>
</ul>

<pre>H:IEQ0112240,007ead,0109,00000000,673a0152,00,32,0c0110,1306

M:00,01,VgIHAQdDdWlzaW5lAP4uAgtTYWxsZSBkJ2VhdQD99QMNQ2hhbWJyZSBMdWNhcwCWrAQTQ2hhbWJyZSBGcmVkIExvdWxvdQCZbwUGQnVyZWF1APttBg1TYWxsZSBkZSBiYWluAPx4BwVTYWxsZQCWkgcBAP4uSUVRMDE4NDgxMgdDdWlzaW5lAQEA/fVJRVEwMTg0NzQ0C1NhbGxlIGQnZWF1AgEAlqxJRVEwMTg2MTYyDUNoYW1icmUgTHVjYXMDAQCZb0lFUTAxODMzMTcTQ2hhbWJyZSBGcmVkIExvdWxvdQQBAPttSUVRMDE4NDk5OQZCdXJlYXUFAQD8eElFUTAxODUxNjYNU2FsbGUgZGUgYmFpbgYBAJaSSUVRMDE4NjExNw9TYWxsZSDDoCBtYW5nZXIHAQ==

C:007ead,7QB+rQAJAf9JRVEwMTEyMjQwAAsABEAAAAAAAAAAAP///////////////////////////wsABEAAAAAAAAAAQf///////////////////////////2h0dHA6Ly93d3cubWF4LXBvcnRhbC5lbHYuZGU6ODAvY3ViZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADAAAOEENFU1QAAwACAAAcIA==

C:00fdf5,0gD99QECFP9JRVEwMTg0NzQ0KCA9CQcYAzAM/wBESFiFRNhY8FEDRSBFIEUgRSBFIEUgRSBFIERIWIZE2VEDRSBFIEUgRSBFIEUgRSBFIEUgREhYbETeWORRAkUgRSBFIEUgRSBFIEUgRSBESFhsRN5Y5FD3RSBFIEUgRSBFIEUgRSBFIERIWGxE2VEDRSBFIEUgRSBFIEUgRSBFIEUgREhYbETeWORRAkUgRSBFIEUgRSBFIEUgRSBESFhsRNhRFUUgRSBFIEUgRSBFIEUgRSBFIA==

C:0096ac,0gCWrAEDFP9JRVEwMTg2MTYyKCA9CQcYAzAM/wBEYFD+RSBFIEUgRSBFIEUgRSBFIEUgRSBFIERgUP5FIEUgRSBFIEUgRSBFIEUgRSBFIEUgQElUYkDTUQVBIEEgQSBFIEUgRSBFIEUgRSBASVRiQNNRBUEgQSBBIEUgRSBFIEUgRSBFIERgUP5FIEUgRSBFIEUgRSBFIEUgRSBFIEUgQElUYkDTUQVBIEEgQSBFIEUgRSBFIEUgRSBASVRiQNNRBUEgQSBBIEUgRSBFIEUgRSBFIA==

C:00fb6d,0gD7bQEFFP9JRVEwMTg0OTk5KCA9CQcYAzAM/wBEVFEKRSBFIEUgRSBFIEUgRSBFIEUgRSBFIERUUQpFIEUgRSBFIEUgRSBFIEUgRSBFIEUgRFRRCkUgRSBFIEUgRSBFIEUgRSBFIEUgRSBEVFEKRSBFIEUgRSBFIEUgRSBFIEUgRSBFIERUUQpFIEUgRSBFIEUgRSBFIEUgRSBFIEUgRFRRCkUgRSBFIEUgRSBFIEUgRSBFIEUgRSBEVFEKRSBFIEUgRSBFIEUgRSBFIEUgRSBFIA==

C:00fc78,0gD8eAEGFP9JRVEwMTg1MTY2KCA9CQcYAzAM/wBFIEUgRSBFIEUgRSBFIEUgRSBFIEUgRSBFIETRVPBFIEUgRSBFIEUgRSBFIEUgRSBFIEUgPSA9ID0gPSA9ID0gPSBFIEUgRSBFIEUgRSA9ID0gPSA9ID0gPSA9IEUgRSBFIEUgRSBFID0gPSA9ID0gPSA9ID0gRSBFIEUgRSBFIEUgPSA9ID0gPSA9ID0gPSBFIEUgRSBFIEUgRSA9ID0gPSA9ID0gPSA9IEUgRSBFIEUgRSBFIA==

C:00996f,0gCZbwEEFP9JRVEwMTgzMzE3KCA9CQcYAzAM/wBEYFR0ROpRFEUgRSBFIEUgRSBFIEUgRSBFIERgVHRE6lEURSBFIEUgRSBFIEUgRSBFIEUgREhUYkTSVQNFIEUgRSBFIEUgRSBFIEUgRSBESFRiRNJVA0UgRSBFIEUgRSBFIEUgRSBFIERgVHRE6lEURSBFIEUgRSBFIEUgRSBFIEUgREhUYkTSVQNFIEUgRSBFIEUgRSBFIEUgRSBESFRiRNJVA0UgRSBFIEUgRSBFIEUgRSBFIA==

C:00fe2e,0gD+LgEBFP9JRVEwMTg0ODEyKCA9CQcYAzAM/wBEVFR4UMBU8EUgRSBFIEUgRSBFIEUgRSBFIERUVHhQwFTwRSBFIEUgRSBFIEUgRSBFIEUgRE9UbUzbVPBFIEUgRSBFIEUgRSBFIEUgRSBET1RtTNtU8EUgRSBFIEUgRSBFIEUgRSBFIERPVG1M21TwRSBFIEUgRSBFIEUgRSBFIEUgRE9UbUzbVPBFIEUgRSBFIEUgRSBFIEUgRSBET1RtTNtU8EUgRSBFIEUgRSBFIEUgRSBFIA==

C:009692,0gCWkgEHFP9JRVEwMTg2MTE3KCA9CQcYAzAM/wBEVFUJRSBFIEUgRSBFIEUgRSBFIEUgRSBFIERUVQlFIEUgRSBFIEUgRSBFIEUgRSBFIEUgRFRVCUUgRSBFIEUgRSBFIEUgRSBFIEUgRSBEVFUJRSBFIEUgRSBFIEUgRSBFIEUgRSBFIERUVQlFIEUgRSBFIEUgRSBFIEUgRSBFIEUgRFRVCUUgRSBFIEUgRSBFIEUgRSBFIEUgRSBEVFUJRSBFIEUgRSBFIEUgRSBFIEUgRSBFIA==

L:CwD99QkSGA0oAN0ACwCWrAkSGAAoAN8ACwD7bQkSGAAnANcACwD8eAkSGAAeAKkACwCZbwkSGAAqAP8ACwD+LgkSGC8qAM8ACwCWkgkSGGQqAMsA</pre>

<ul>
<li>Les paramètres comme on peut le voir ne sont pas très intuitifs, il va falloir creuser.</li>
<li>Certains éléments sont invariants et permettent d'avoir quelques indices&nbsp;: Le premier champ de la ligne H: reprend exactement le numéro de série situé sous le Cube. Je l'appelle ligne "Hôte" ("Host" en anglais)</li>
<li>L’enchaînement de ces lignes est immuable mais certains éléments varient beaucoup (par exemple le 5ème champ de la ligne H: différent à chaque reconnexion et ne semblant suivre aucune logique de progression) ou peu (Le contenu de la ligne L: )</li>
<li>Les données situées après la virgule des lignes C: sont probablement des données spécifiques à chaque élément du système (1 ligne par élément) car on trouve 8 lignes dans 2 formats (1 ligne dans 1 format et 7 dans un autre) et j'ai 7 thermostats et 1 cube. De plus la ligne H: qui contient le n° de série du Cube possède en champ 2 "007ead" présent en entête de la ligne C: dont le format diffère des autres. A priori ces données ne varient pas si on ne dérègle rien dans l'appli, j'imagine que ce sont les lignes de configuration. Petit nom, "Config".</li>
</ul>

<p>Il va falloir décoder ces lignes maintenant.</p>


<p>Si on continue de suivre le fil des événements réseaux, l'appli envoie des commandes "l:" qui entraînent la réémission d'une ligne "L:" qui au bout d'un certain temps peut discrètement varier. J'imagine qu'il s'agit des données "live", zou voila le nom trouvé.
La ligne M... faut voir...</p>


<p>Au final on se sent revenu au bon vieux temps où la place disque/réseau/ram était chère. On va pouvoir s'amuser&nbsp;! :)</p>
<p><a href="http://feedads.g.doubleclick.net/~a/w83YG5xdQHuYg3udaLifvwRTo6E/0/da"><img src="http://feedads.g.doubleclick.net/~a/w83YG5xdQHuYg3udaLifvwRTo6E/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/w83YG5xdQHuYg3udaLifvwRTo6E/1/da"><img src="http://feedads.g.doubleclick.net/~a/w83YG5xdQHuYg3udaLifvwRTo6E/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/01/25/75-elv-max-debut-d-exploration</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/01/24/74-domotiqueuh-tiqueuh-tiqueh-thermostats-elv-max">
  <title>Domotiqueuh tiqueuh tiqueh</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/RBR4yI8CgOU/74-domotiqueuh-tiqueuh-tiqueh-thermostats-elv-max</link>
  <dc:date>2012-01-24T10:07:52+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>Non, je ne me transforme pas en Soeur sourire
mais depuis quelques mois j'avais mis en place des corps thermostatiques sur certains des radiateurs de la maison et en ce début d'année, j'y ai installé les têtes thermostatisques adaptées</description>
  <content:encoded><![CDATA[<p>Non, je ne me transforme pas en <a href="http://fr.wikipedia.org/wiki/Dominique_%28chanson%29" hreflang="fr">Soeur sourire</a>
mais depuis quelques mois j'avais mis en place des corps thermostatiques sur certains des radiateurs de la maison et en ce début d'année, j'y ai installé les têtes thermostatisques adaptées</p> <p>Il s'agit de têtes allemandes ("made in china" rassurez-vous et oui, je suis à l'origine AUSSI du déséquilibre de la balance du commerce extérieur de la France en achetant des produits allemands. La principale raison étant que les français sont infoutus de produire et vendre ce type de produits à un prix autre que "premium" (à moins de 100€ quoi l'unité) alors là je les ai payé un peu moins de 30€) de la marque ELV/Eq-3 Max! achetable <a href="http://www.elv.de/MAX!-Heizkouml;rperthermostat/x.aspx/cid_74/detail_10/detail2_32394/CRID_" hreflang="de">par correspondance sur le site</a></p>


<p><img src="http://www.elv-downloads.de/bilder/Artikel/Produkte/9/990/99017/Internet//gross/99017_w01_thermo.jpg" alt="" /></p>


<p><strong>Les caractéristiques :</strong></p>
<ul>
<li>Il s'agit de têtes programmables à 13 paliers par jour et 7 configs par semaine avec réglage par pas de température de 0,5 degrés (entre 4.5° et 30.5°) et par pas horaire de 5 minutes.</li>
<li>Il est possible de modifier la température de consigne en tournant le volant sur le front de la tête, en mode auto la température est modifiée jusqu'au palier suivant</li>
<li>Le tout est totalement débrayage en passant en mode manuel (un bouton auto/manu sur la tête), la température ne bouge plus en fonction de l'heure</li>
<li>2 températures par défaut sont réglées et accessibles par la touche (☾/☀)</li>
<li>un boost, ouvrant la valve à 80% quelque soit la température réglée pour une poignée de minutes, est activable par la touche... "BOOST" (CQFD).</li>
</ul>

<p><strong>Mais vous vous demandez pourquoi&nbsp;? pourquoi celles-ci plutôt que d'autres modèles quasiment au même prix et parfois moins chers (et souvent plus pour moins bien) que l'on peut même trouver chez le bricolo du coin ?</strong></p>


<p>Et bien en bon geek de base, celles-ci sont **communicantes** (çà ça existe déjà chez Pearl.fr ou Conrad.fr, sociétés transfrontalières s'il en est) et aussi **bidirectionnelles**. Cela veut dire que l'on a accès en quasi temps réel aux paramètres de réglages (et en particulier savoir à quel pourcentage la valve est ouverte et quelle est la température de consigne actuelle).</p>


<p>En fait, elles ne sont pas programmables comme la plupart des autres directement sur la tête en tournant la molette comme un volant de coffre fort. Non celles-ci se programment sur l'ordinateur via un boîtier connecté au réseau Ethernet et une petite appli java résidente à laquelle on accède via le navigateur web (dans le plus pur style AJAXien).</p>


<p><img src="http://www.elv-downloads.de/bilder/Artikel/Produkte/9/990/99004/Internet//gross/99004_w01_max.jpg" alt="" /></p>


<p>Il existe même une application Android (qui ne marche pas :) probablement parce qu'elle n'est pas prévue pour parler français) et un portail déporté (payant après 1 an de gratuit donc... non sans façon).</p>


<p><strong>C'est tout ?</strong></p>


<p>Héhé, vous commencez à me connaître, ca semble beau comme ça mais il y a des trucs qui clochent genre JAVA / Portail payant etc... c'est pas mon genre tout ça&nbsp;!</p>


<p>Et vous avez raison&nbsp;! L'intérêt est aussi la bidouille. La communication avec le boîtier est en cours de reverse engineering et la communication RF suivra peut-être. Cela fait donc que je m'attelle à la réécriture de l'appli en php dans un premier temps et peut-être en autre chose ensuite. Mais pour cela il va falloir être patient, je commence juste.</p>
<p><a href="http://feedads.g.doubleclick.net/~a/5rEYvrci0QvmfcDRAUkZsZV82i0/0/da"><img src="http://feedads.g.doubleclick.net/~a/5rEYvrci0QvmfcDRAUkZsZV82i0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5rEYvrci0QvmfcDRAUkZsZV82i0/1/da"><img src="http://feedads.g.doubleclick.net/~a/5rEYvrci0QvmfcDRAUkZsZV82i0/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/01/24/74-domotiqueuh-tiqueuh-tiqueh-thermostats-elv-max</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2012/01/16/73-rechute-de-geek-arduino">
  <title>Rechute de geek : Arduino</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/SIjoLzBxxd8/73-rechute-de-geek-arduino</link>
  <dc:date>2012-01-16T12:33:04+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>Ca y est j'ai fait une rechute...





Pour mon anniv, je me suis fait payer un Arduino.


Pour ceux qui ne savent pas ce que c'est c'est un petit "ordinateur" minimaliste prévu pour l'interfaçage avec le monde extérieur via un peu d'électronique.





Le modèle que j'ai pris est un Arduino...</description>
  <content:encoded><![CDATA[ <p>Ca y est j'ai fait une rechute...</p>


<p><img src="/images/Arduino-logo.png" alt="" /></p>


<p>Pour mon anniv, je me suis fait payer un Arduino.</p>


<p>Pour ceux qui ne savent pas ce que c'est c'est un petit "ordinateur" minimaliste prévu pour l'interfaçage avec le monde extérieur via un peu d'électronique.</p>


<p><img src="http://arduino.cc/en/uploads/Main/ArduinoEthernetFront450px.jpg" alt="" /></p>


<p>Le modèle que j'ai pris est un Arduino Ethernet. De taille réduite -qu'on pourrait en tenir 2 côte à côte dans la main- il embarque tout de même 1 port Ethernet, 1 lecteur de microSD/Transflash et une petite seizaine de ports d'entrée sortie digitaux et analogiques.</p>


<p>A moi tout plein d'expérimentations et d'heures perdues :)&nbsp;!</p>
<p><a href="http://feedads.g.doubleclick.net/~a/EvD2BBEt5pHO5hu1AUg_cpUqdns/0/da"><img src="http://feedads.g.doubleclick.net/~a/EvD2BBEt5pHO5hu1AUg_cpUqdns/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/EvD2BBEt5pHO5hu1AUg_cpUqdns/1/da"><img src="http://feedads.g.doubleclick.net/~a/EvD2BBEt5pHO5hu1AUg_cpUqdns/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2012/01/16/73-rechute-de-geek-arduino</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2011/03/03/72-presenter-proprement-la-playlist-tv-de-free-pour-regarder-la-tv-sur-un-ipad">
  <title>Présenter proprement la playlist TV de Free pour regarder la TV sur un iPad</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/czQwodbZt-Q/72-presenter-proprement-la-playlist-tv-de-free-pour-regarder-la-tv-sur-un-ipad</link>
  <dc:date>2011-03-03T09:24:54+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Informatique</dc:subject>
  <description>Ma femme a un iPad depuis quelques temps qui a été jailbreaké dans la foulée de l'achat.


Cela a permis d'installer VLC afin de passer outre aux limitations intrinsèques du player Apple.


Or VLC sur iPad c'est un peu pas facile à utiliser, il n'y a pas d'interface pour saisir un chemin...</description>
  <content:encoded><![CDATA[ <p>Ma femme a un iPad depuis quelques temps qui a été jailbreaké dans la foulée de l'achat.</p>


<p>Cela a permis d'installer VLC afin de passer outre aux limitations intrinsèques du player Apple.</p>


<p>Or VLC sur iPad c'est un peu pas facile à utiliser, il n'y a pas d'interface pour saisir un chemin réseau et il faut déposer à la mimine en SFTP les fichiers au bon endroit.</p>


<p>Alors de là à pouvoir rentrer un lien RTSP voire pire le sélectionner dans une liste M3U autant ne pas y penser (rah zut, j'y ai pensé).</p>


<p>Mais ne voulant pas m'avouer vaincu vu que j'avais lu que les formats et transports présents dans le VLC "ordi" étaient présent dans le VLC "iPad", j'ai bidouillé un petit script PHP pour transformer à la volée le liste de lecture de la friboite (récupérable à http://212.27.40.238/pub/playlist.m3u depuis tout poste interne d'un réseau free).</p>

<p>Grosso modo, le principe du script c'est on lit ligne par ligne le contenu de la playlist, on traite la ligne #EXTINF puis la ligne d'URL (qui commence par rtsp://), tout le reste est ignoré.<p>
<p>L'iPad n'arrive pas à traiter les flux HD donc je les filtre</p>
<p>Voici le script brut de décoffrage, le but étant que ca marche au mépris total de la mise en page et de la présentation.</p>

<code><span style="color: #000000"> 
&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=UTF-8"&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;h1&gt;Chaines&nbsp;FBX&lt;/h1&gt;<br />&lt;ul&gt;<br /><span style="color: #0000BB">&lt;?php<br />$browser</span><span style="color: #007700">=</span><span style="color: #0000BB">get_browser</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"HTTP_USER_AGENT"</span><span style="color: #007700">],</span><span style="color: #0000BB">true</span><span style="color: #007700">);&nbsp;<br /><br /></span><span style="color: #0000BB">$m3u</span><span style="color: #007700">=</span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">"http://212.27.40.238/pub/playlist.m3u"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$m3ulines</span><span style="color: #007700">=</span><span style="color: #0000BB">explode</span><span style="color: #007700">(</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">,</span><span style="color: #0000BB">$m3u</span><span style="color: #007700">);<br /><br />foreach&nbsp;(</span><span style="color: #0000BB">$m3ulines&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$l</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/(#EXTINF:)(.*),(.*)\s-\s(.*)/"</span><span style="color: #007700">,</span><span style="color: #0000BB">$l</span><span style="color: #007700">,</span><span style="color: #0000BB">$res</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"EXTINF&nbsp;trouvé&lt;br/&gt;\n"&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$domain</span><span style="color: #007700">=</span><span style="color: #0000BB">$res</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$chaine</span><span style="color: #007700">=</span><span style="color: #0000BB">$res</span><span style="color: #007700">[</span><span style="color: #0000BB">3</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$desc</span><span style="color: #007700">=</span><span style="color: #0000BB">$res</span><span style="color: #007700">[</span><span style="color: #0000BB">4</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/(rtsp:\/\/.*)$/"</span><span style="color: #007700">,</span><span style="color: #0000BB">$l</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(</span><span style="color: #0000BB">strstr</span><span style="color: #007700">(</span><span style="color: #0000BB">$l</span><span style="color: #007700">,</span><span style="color: #DD0000">"flavour=hd"</span><span style="color: #007700">))&nbsp;&amp;&amp;&nbsp;(</span><span style="color: #0000BB">$browser</span><span style="color: #007700">[</span><span style="color: #DD0000">"parent"</span><span style="color: #007700">]==</span><span style="color: #DD0000">"iPad"</span><span style="color: #007700">)&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"&lt;li&gt;[</span><span style="color: #0000BB">$domain</span><span style="color: #DD0000">&nbsp;-&nbsp;</span><span style="color: #0000BB">$chaine</span><span style="color: #DD0000">]&nbsp;</span><span style="color: #0000BB">$desc</span><span style="color: #DD0000">&lt;/li&gt;"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"&lt;li&gt;[</span><span style="color: #0000BB">$domain</span><span style="color: #DD0000">&nbsp;-&nbsp;</span><span style="color: #0000BB">$chaine</span><span style="color: #DD0000">]&nbsp;&lt;a&nbsp;href=\"</span><span style="color: #0000BB">$l</span><span style="color: #DD0000">\"&gt;</span><span style="color: #0000BB">$desc</span><span style="color: #DD0000">&lt;/a&gt;&lt;/li&gt;&nbsp;"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;/ul&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></span> 

</code>

<p>Voilà, un peu moins de 10 lignes.</p>

<p>Il n'y a plus qu'à pointer Safari sur le lieu où vous avez déposé le fichier</p>

<p>Pour tester, vous pouvez voir le résultat à <a href="http://maison.senis.org/~fs/fbx.php">http://maison.senis.org/~fs/fbx.php</a>.</p>
<p><a href="http://feedads.g.doubleclick.net/~a/a9SdLMThaPSd3HBlwAqed8Hy19I/0/da"><img src="http://feedads.g.doubleclick.net/~a/a9SdLMThaPSd3HBlwAqed8Hy19I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/a9SdLMThaPSd3HBlwAqed8Hy19I/1/da"><img src="http://feedads.g.doubleclick.net/~a/a9SdLMThaPSd3HBlwAqed8Hy19I/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2011/03/03/72-presenter-proprement-la-playlist-tv-de-free-pour-regarder-la-tv-sur-un-ipad</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2010/01/15/71-les-temps-changent-on-se-degeekifie">
  <title>Les temps changent... On se dégeekifie doucement</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/UZg0e91Akns/71-les-temps-changent-on-se-degeekifie</link>
  <dc:date>2010-01-15T21:43:41+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Perte de temps garantie</dc:subject>
  <description>J'ai retrouvé dans un vieux fichier, mon geekcode de 1996.


1996, c'est loin, alors voyons un peu comment j'ai évolué...


Geekcode 1996


------BEGIN GEEK CODE BLOCK------
Version: 3.1
GMD d- s++: a- C++ UL P++ L+ E W++ N++ o K? w++
O+ M-- V? PS PE Y+ PGP-- t+ 5+ X++ R+&gt; tv- b DI D+
G e++ h!...</description>
  <content:encoded><![CDATA[ <p>J'ai retrouvé dans un vieux fichier, mon geekcode de 1996.</p>


<p>1996, c'est loin, alors voyons un peu comment j'ai évolué...</p>


<p>Geekcode 1996</p>


<pre>------BEGIN GEEK CODE BLOCK------
Version: 3.1
GMD d- s++: a- C++ UL P++ L+ E W++ N++ o K? w++
O+ M-- V? PS PE Y+ PGP-- t+ 5+ X++ R+&gt; tv- b DI D+
G e++ h! r z+
------END GEEK CODE BLOCK------</pre>


<pre></pre>

<p>Geekcode 2010</p>


<pre>------BEGIN GEEK CODE BLOCK------
Version: 3.12
GMD d- s++:+ a C++(+) UL+++ P+++&gt;++ L+++ E--- W+++ N+ o+++++&gt; K w--
O- M-- V- PS PE Y+ PGP+ t+ 5++ X R+&gt; tv- b+ DI+ D+
G++ e++++ h(----) r+++ y+++
------END GEEK CODE BLOCK------</pre>


<p>Les changements&nbsp;:</p>

<ul>
<li>Je me suis épaissi (de s++: je suis passé à <strong>s++:+</strong>)</li>
<li>J'ai vieilli (a- à <strong>a</strong>)</li>
<li>Je ne programme plus exceptionnellement en C (C++ à <strong>C++(+)</strong> )</li>
<li>Je ne suis plus que sous Linux (<strong>3 plus tout de même</strong>&nbsp;! :) )</li>
<li>Je me suis amélioré en Perl (<strong>1 plus de +</strong>) mais je n'ai plus trop le temps de programmer donc je perds la main (<strong>&gt;++</strong>)</li>
<li>Linux est devenu mon seul système et je le maitrise (<strong>L+++</strong>)</li>
<li>Alors que j'utilisais plutôt Emacs, je suis repassé à l'essentiel&nbsp;: Vi&nbsp;!</li>
<li>Je rentre maintenant dans la catégorie Webmaster/Administrateur de dédié</li>
<li>Usenet ne devient plus que très largement marginal</li>
<li>Dans l'intervalle, je n'ai pas été Steve Kinzler, mais l'administrateur/grand prêtre du Grand Oracle Francophone (fr.rec.oracle) mais j'ai arrêté il y a déjà quelques années, le forum est mort désormais...</li>
<li>Pour Windows, c'est persona non grata, point barre</li>
<li>OS/2, ca existe encore&nbsp;? et VMS&nbsp;? ;)</li>
<li>Apple me sort désormais autant par les yeux que Microsoft; la faute principalement aux énormes erreurs stratégiques de iPhone (ouverture et multitâche)</li>
<li>J'utilise désormais des signatures et le cryptage en cas de besoin</li>
<li>Je suis complètement revenu de X-files, ils ont trop tiré sur la corde...</li>
<li>Je continue à me désengager du jeu de rôle</li>
<li>Maintenant, j'ai appris à apprécier Dilbert et je le lis tous les jours</li>
<li>Je continue à apprécier le Geekcode même si il est un peu suranné...</li>
<li>Depuis 96, j'ai eu mon doctorat en médecine</li>
<li>Pour le logement c'est plus compliqué, je reste un geek de base mais simultanément, je suis marié avec enfant... (d'où le r+++ et z+++ :) ) comme quoi...</li>
</ul>


<p>Allez, on verra dans 10 ans...</p>
<p><a href="http://feedads.g.doubleclick.net/~a/8sVNc7ML-2AXoosw0dpRh8IUKKg/0/da"><img src="http://feedads.g.doubleclick.net/~a/8sVNc7ML-2AXoosw0dpRh8IUKKg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8sVNc7ML-2AXoosw0dpRh8IUKKg/1/da"><img src="http://feedads.g.doubleclick.net/~a/8sVNc7ML-2AXoosw0dpRh8IUKKg/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2010/01/15/71-les-temps-changent-on-se-degeekifie</feedburner:origLink></item>
<item rdf:about="http://blog.frederic.senis.org/index.php/2009/12/12/70-les-petits-clics-c-est-pas-automatique">
  <title>Les petits clics c'est pas automatique</title>
  <link>http://feedproxy.google.com/~r/senis/PgLT/~3/Nka5EQnq60Q/70-les-petits-clics-c-est-pas-automatique</link>
  <dc:date>2009-12-12T08:23:57+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Fred Senis</dc:creator>
  <dc:subject>Médecine</dc:subject>
  <description>Je viens de recevoir dans mon courrier pro une série de fiches de synthèse envoyées par HAS sur les principaux examens radiologiques souvent faits à titre systématiques.


J'étais heureux de voir que dans ma pratique courante, je colle déjà bien à ces recommandations... petite gloire...</description>
  <content:encoded><![CDATA[ <p>Je viens de recevoir dans mon courrier pro une série de fiches de synthèse envoyées par HAS sur les principaux examens radiologiques souvent faits à titre systématiques.</p>


<p>J'étais heureux de voir que dans ma pratique courante, je colle déjà bien à ces recommandations... petite gloire personnelle.</p>


<p>Cependant, j'aurais bien deux regrets&nbsp;:</p>


<p>- il manque un feuillet à mon avis pertinent sur <ins>l'inutilité très fréquente de la radiographie de genou</ins>.</p>


<p>Dans bien des cas, l'examen de choix est plutôt l'<strong>IRM</strong> ou par défaut le <strong>scanner</strong> ou l'<strong>arthroscanner</strong>. Toutes les "entorses" a fortiori sans baillement articulaire, contusions et suite de chutes simples (ou la personne marche en boitant en arrivant) n'ont aucun intérêt d'avoir une RX qui va au mieux faussement rassurer les patients de l'absence de lésion <em>osseuse</em> et passant totalement sous silence les lésions des tissus mous (principalement ménisques et ligaments).</p>


<p>Ma conduite personnelle est, après examen clinique évocateur&nbsp;:</p>
<ul>
<li>radiographie de genou sur les doutes de fracture de rotule&nbsp;: on voit bien, c'est rapide et peu irradiant</li>
<li>pour tous les autres traumatismes à forte énergie avec suspicion de fracture&nbsp;: scanner</li>
<li>pour toutes les "entorses", atteintes ligamentaires et contusions sans impotance fonctionnelle totale&nbsp;: <strong>pas de radiographie</strong>, attelle de genou et IRM dans la semaine qui suit soit en systématique si l'examen clinique fait suspecter une rupture ligamentaire ou une atteinte méniscale, soit en cas de persistence dans les autres cas (pour justement ne pas négliger ces étiologies).</li>
</ul>

<p>Outre l'oubli de l'enterrement de cet examen, l'autre point que je regrette est l'absence de relais vers les patients&nbsp;:</p>


<p>Pour les antibiotiques, on a des pubs (plus ou moins adaptées) très régulièrement qui soutiennent par l'éducation des patients l'effort similaire des médecins.
Pour les génériques, idem, il n'est pas un jour sans qu'on en entende parler dans les médias, des règles de remboursement différentes sont mises en place pour les favoriser etc.
Là, aucune aide à l'éducation du patient qui pourtant depuis des dizaines d'années à la suite de la scientifisation de la médecine et de l'augmentation de sa technicité pronait le diagnostic précis (et qu'y a t'il de plus précis à l'oeil du profane que de <strong>voir</strong> la lésion...).
De plus tous nous avons (et les patients aussi) des histoires de chasse d'explorations radiographiques non faites en toute bonne foi puis faites par un médecin plus complaisant et qui au final retrouve une lésion à prendre en charge.</p>


<blockquote><p>Dernière en date&nbsp;:
Trauma cranien chez un enfant, transféré au CHU par les pompiers, selon le protocole, surveillance pas de scanner d'emblée et sortie le lendemain. Une semaine après, il persiste une légère céphalée et un hématome pariétal, le médecin traitant prescrit une radiographie du crâne (???) qui au final retrouve une fracture longitudinale du pariétal qui découle sur un scanner qui retrouve un sous-dural... et... rien... à 10 jours, on se contente de toute façon d'une surveillance clinique.
Au final toute cette irradiation n'a permis que de faire de jolies images sans aucun gain en terme de santé. Mais la famille du patient était bien remontée contre le CHU...</p></blockquote>


<p>De mon point de vue, il faut un relais vers les patients pour rendre crédible l'inutilité de ces explorations car indubitablement il y a une demande forte d'imagerie de leur part.</p>
<p><a href="http://feedads.g.doubleclick.net/~a/IvZDmzR-2XK68cXEBmGbYzQnPk4/0/da"><img src="http://feedads.g.doubleclick.net/~a/IvZDmzR-2XK68cXEBmGbYzQnPk4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/IvZDmzR-2XK68cXEBmGbYzQnPk4/1/da"><img src="http://feedads.g.doubleclick.net/~a/IvZDmzR-2XK68cXEBmGbYzQnPk4/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
<feedburner:origLink>http://blog.frederic.senis.org/index.php/2009/12/12/70-les-petits-clics-c-est-pas-automatique</feedburner:origLink></item>

</rdf:RDF>

