" /> Informatique - Mon para-monde
Flux RSS

dimanche 5 février 2012

ELV Max! Contenu de la config (ligne C:)

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.

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

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 en soulignées, le reste est en hexadécimal) :

ED 007EAD 00 09 01 00 IEQ0112240 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 http://www.max-portal.elv.de:80/cube 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 CET 00 00 0A 00 03 00 00 0E 10 CEST 00 03 00 00 00 00 1C 20

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

Intéressons-nous plutôt aux thermostats. 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 :

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 (valeur de 'off')
19             1 octet  = Température minimal de réglage (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             3 bits   = durée du Boost 
               5 bits   = valeur de valve du Boost
24             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)
26             1 octet  = position de départ de la valve (0)
27             début des programmes journaliers (7 groupes = 1 par jour)

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

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

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

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

Idem pour le détartrage : Jour = (Valeur & 0xE0)>>5 et Heure = (Valeur & 0x1F)

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és 2 grandeurs : la température de consigne et l'heure de fin.

0TTTTTTH.HHHHHHHH

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

Donc partant du principe qu'on lit les octets un par un, on a :

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

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

samedi 28 janvier 2012

J'ai découvert une commande de plus sur ELV Max!, ben j'aurais préféré m'en passer... :)

Alors que je bidouillais le Cube via netcat, j'ai lancé quelques commandes de la forme <lettre><:><cr><lf>

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 petits caractères suffisent à ramener le cube dans un état immaculé :

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

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...

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 ?)

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

On peut noter au passage que le champ 6 de H: a changé (00 -> 04) mais je ne sais pas pourquoi..

vendredi 27 janvier 2012

ELV MAX! Lignes Host (H:) et Maison (M:)

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 return/line feed)

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

H:

Contient des données très basiques sur le système : Les champs du contenu sont séparés par des virgules

H:IEQ0112240,007ead,0109,00000000,35e2322f,00,32,0c011b,0909

que l'on peut découper en :

  • IEQ0112240 = numéro de série du Cube (invariant dans la même installation, il est imprimé sous le cube), format alphanumérique
  • 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
  • 0109 = la version du microcode embarqué a priori (le code a changé après une mise à jour)
  • 00000000 = euh comment dire... des zéros ?
  • 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)
  • 00 = encore des 0... impossible d'en savoir la signification
  • 32 = toujours 32 là aussi... impossible d'en tirer une conclusion
  • 0c011b = là aussi un invariant
  • 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

M:

M:00,01,VgIHAQdDdWlzaW5lAP4uAgtTYWxsZSBkJ2VhdQD99QMNQ2hhbWJyZSBMdWNhcwCWrAQTQ2hhbWJyZSBGcmVkIExvdWxvdQCZbwUGQnVyZWF1APttBg1TYWxsZSBkZSBiYWluAPx4BwVTYWxsZQCWkgcBAP4uSUVRMDE4NDgxMgdDdWlzaW5lAQEA/fVJRVEwMTg0NzQ0C1NhbGxlIGQnZWF1AgEAlqxJRVEwMTg2MTYyDUNoYW1icmUgTHVjYXMDAQCZb0lFUTAxODMzMTcTQ2hhbWJyZSBGcmVkIExvdWxvdQQBAPttSUVRMDE4NDk5OQZCdXJlYXUFAQD8eElFUTAxODUxNjYNU2FsbGUgZGUgYmFpbgYBAJaSSUVRMDE4NjExNw9TYWxsZSDDoCBtYW5nZXIHAQ==

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 base64

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) :

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(...)

Dans ce contenu binaire on peut retrouver une certaine organisation : Il y a 3 sous-ensembles.


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

Format de la liste des pièces

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

  • Nombre de caratères du nom de la pièce (1 octet)
  • Nom de la pièce (X octets cf supra)
  • ID de la pièce (1 octet)
  • 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)

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.

Format de la liste des périphériques

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

La aussi on retrouve devCount fois une structure de périphérique :

  • 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)
  • 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
  • 10 octets de numéro de série
  • 1 octet de nombre de caractères du nom du périphérique
  • Nom du périphérique (X octets ci-dessus)
  • ID de la pièce de rattachement (1 octet)

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

La prochaine fois, je m'attaque à la ligne C: qui donne la config courante d'un périphérique.

mardi 24 janvier 2012

Domotiqueuh tiqueuh tiqueh

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

lundi 16 janvier 2012

Rechute de geek : Arduino

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 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.

A moi tout plein d'expérimentations et d'heures perdues :) !

jeudi 3 mars 2011

Présenter proprement la playlist TV de Free pour regarder la TV sur un iPad

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 réseau et il faut déposer à la mimine en SFTP les fichiers au bon endroit.

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é).

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).

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é.

L'iPad n'arrive pas à traiter les flux HD donc je les filtre

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.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Chaines FBX</h1>
<ul>
<?php
$browser
=get_browser($_SERVER["HTTP_USER_AGENT"],true); 

$m3u=file_get_contents("http://212.27.40.238/pub/playlist.m3u");
$m3ulines=explode("\n",$m3u);

foreach (
$m3ulines as $l) {
    if (
preg_match("/(#EXTINF:)(.*),(.*)\s-\s(.*)/",$l,$res)) {
    
//    echo "EXTINF trouvé<br/>\n" ;
        
$domain=$res[2];
        
$chaine=$res[3];
        
$desc=$res[4];
    } elseif (
preg_match("/(rtsp:\/\/.*)$/",$l)) {
        if ( (
strstr($l,"flavour=hd")) && ($browser["parent"]=="iPad") ) {
            echo 
"<li>[$domain - $chaine$desc</li>";
        } else {
            echo 
"<li>[$domain - $chaine] <a href=\"$l\">$desc</a></li> ";
        }

    }
}

?>
</ul>
</body>
</html>

Voilà, un peu moins de 10 lignes.

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

Pour tester, vous pouvez voir le résultat à http://maison.senis.org/~fs/fbx.php.

mercredi 26 novembre 2008

Réparer sa connexion wifi sur Ubuntu 8.10 et MSI Wind U100-241 (Carte Ralink RT2700E) lorsqu'elle a sauté lors d'un changement de noyau

Si comme moi en ce jour maussade :

  • vous avez voulu faire une mise-à-jour de votre Ubuntu,
  • que vous aviez précédemment ajouté le module pour RT2860 (rt2860-source) en provenance du dépot lauchpad (ppa),
  • que ca vous a mis à jour le noyau
  • et qu'au redémarrage vous n'aviez plus de réseau (ra0 inexistent).

La solution est simple comme dpkg ! :)

Ouvrez un terminal et tapez :

sudo dpkg-reconfigure rt2860-source

Patientez le temps de la recompilation.... (c'est long, l'Atom est pas fait pour ca :) ).... et automagiquement, la connexion devrait redémarrer !

En fait par cette simple ligne de commande, vous avez recompilé le module pour le noyau courant et l'avez inséré.

On dit merci qui ? Merci Debian et son gestionnaire de package bien fichu !

mardi 21 octobre 2008

Suspend/Hibernate sur MSI Wind (U100-241/251) sous Ubuntu Intrepid

Attention, s'il y a bien une chose que j'ai pu voir à travers mon utilisation de Linux sur portable c'est que l'ACPI, la veille et l'hibernation sont des domaines assez pifométriques. Les infos données ci-dessous marchent pour moi dans ma configuration si elle le font pour vous tant mieux mais en tout état de cause, elles sont à suivre à vos risques et périls...

lundi 20 octobre 2008

Linux sur MSI Wind (la suite : install en partition propre, protéger le HD d'une vie trop brêve)

Après avoir testé la stabilité du Wind sous Ubuntu via une installation Wubi, il était temps de se lancer dans le grand bain.

La procédure suivie est à peu près la même que celle décrite sur blogeee, je vous en fait donc grâce ici.

Une fois fait, vous noterez peut-être un cliquetis venant du disque dur, ce sont les têtes qui passent leur temps à se parker/déparker, et ca c'est MAL (un peu comme croiser les faisceaux) car cela limite la durée de vie du disque (c'est que c'est fragile ces petites bêtes-là).

Alors ni une ni deux, il faut désactiver le mode économie du disque (de toute façon il ne consomme pas beaucoup) via un

 hdparm -B255 /dev/sda

Ainsi, les têtes ne se parkerons plus, c'est un pis-allé mais en attendant une solution plus propre à ce problème récurrent au moins le HD ne sera pas à changer dans 2 mois.

Malheureusement cette modif n'est pas définitive, au prochain redémarrage, ce sera modifié...

il faut donc mettre 255 dans les fichiers :

 /etc/hdparm.conf en bas du fichier
 et en ligne 31 dans : 
 /etc/acpi/ac.d/90-hdparm.sh
 /etc/acpi/battery.d/90-hdparm.sh
 /etc/acpi/resume.d/90-hdparm.sh
 /etc/acpi/resume.d/90-thinkpad-unstandby-led.sh
 /etc/acpi/resume.d/90-xscreensaver.sh
 /etc/acpi/start.d/90-hdparm.sh
 /etc/acpi/suspend.d/90-framebuffer-stop.sh

Allez, je ne me suis pas encore occupé de la webcam mais ca arrivera peut-être un jour... quand j'en aurai besoin ! ;)

jeudi 9 octobre 2008

Linux sur MSI Wind (version U100-241, U100-251, U100-220)

Ayant reçu hier mon tout joli tout beau MSI Wind Blanc 160Go, la mission était de rendre inutile l'OS du mal qui était livré avec pour mettre comme sur toutes mes autres machines un Linux saveur Ubuntu.

mercredi 8 octobre 2008

Nouveau joujou : déballage de mon MSI Wind

Et oui, j'ai craqué ! Dès que le MSI Wind livré d'origine en 6 cellules a montré le bout de son nez, j'en ai acheté un... non en fait deux. Un pour ma femme et un pour moi !

Page suivante : petites photos du déballage... A part une très discrète surélévation de l'arrière, c'est pareil que les précédents !

Mission suivante, virer XP pour installer Ubuntu (on se refait pas)

jeudi 21 août 2008

A chaque année son Software Freedom Day

En 2008, ce sera le 20 Septembre.

Soyez nombreux à célébrer le logiciel libre et encore plus nombreux à vous laisser tenter par un essai !

Malheureusement, comme l'année dernière, la France semble encore bien mal représentée sur la carte des manifestations...

mardi 6 mai 2008

Que signifie le contenu de /proc/loadavg

Petit article en forme de pense-bête, pour pouvoir y rediriger les personnes qui me posent la question :

# cat /proc/loadavg

permet de lister la charge système (load average).

Le format de ce fichier est :

loadavg1 loadavg5 loadavg15 taches_actives/total_taches PID

où :

  • loadavg1 contient la charge système de la dernière minute écoulée
  • loadavg5 celle des 5 dernières minutes
  • loadavg15 celle des 15 dernières minutes
  • taches_actives contient le nombre de tâches dans un statut RUNNING
  • total_taches est le nombre total de tâches lancées sur le système.
  • PID est l'identifiant du dernier processus lancé.

Il est assez courant de dire qu'un système est en très bonne santé tant que le loadavg est inférieur au nombre de processeur dans la machine.

samedi 27 octobre 2007

Ubuntu - Demandez l'authentique (c'est marqué dessus)

Technorati Profile

dimanche 9 septembre 2007

15 septembre : C'est bientôt le moment de passer au libre !

Malheureusement, il ne semble pas qu'il y ait beaucoup d'investissements personnels en France sur le sujet... Dommage.