mercredi 29 septembre 2010

Plugwise on Linux !

Introduction :

Plugwise utilise un logiciel, pour installer et utilises ses prises, qui fonctionne uniquement sous windows. Pourtant, une version open-source a été réalisée sous Linux pour commander ses prises. Voici l'auteur de ce travail : http://www.maartendamen.com/category/pol-plugwise-on-linux/

Cependant, cette version demande encore l'usage de Windows pour l'installation : appairer le stick USB avec la prise maître et la prise maître avec les prises esclave. Je vais donc m'aider du code de Maarten Damen et tenter de réaliser l'appairage sous Linux.

1ère étape :


D'après la documentation technique de Maarten Damen, il y a un jeu de questions-réponses entre les prises et le stick USB. Ainsi dés lors ou on envoi un message on a une réponse. Ce message est en fait une trame codée toujours de la même façon.

Cette trame se constitue de la manière suivante :
\x05\x05\x03\x030017000D6F000037B1E5007BAA\x0d\x0a
soit décomposée \x05\x05\x03\x03 0017 000D6F000037B1E5 00 7BAA \x0d\x0a

Voici à quoi correspond chaque paquets :
\x05\x05\x03\x03 : correspond à l'entête de la trame
0017 : correspond au mode de l'ordre (ON-OFF ou Conso) ici mode ON-OFF
000D6F000037B1E5 : adresse MAC de la prise
00 : valeur du mode 00 = OFF et 01 = ON
7BAA : valeur du CRC16
\x0d\x0a : correspond à la fin de la trame

Je vais donc essayer dans un premier temps d'obtenir ce type de trame. Pour cela, je vais utiliser un sniffeur ZigBee. C'est le protocole de communication qu'utilisent les prises Plugwise. Ce sniffeur est, en fait, une carte electronique constitué d'un récepteur ZigBee. Cette carte est reliée à un ordinateur qui enregistre (avec un logiciel spécifique) les données reçues par le récepteur. 


Sniffeur ZigBee


2ème étape :

Les résultats ne sont pas satisfaisant :-(
J'arrive à voir les messages du stick USB et des prises, seulement, les trames semblent être codées d'une autre manière.

C'est peut-être la couche ZigBee qui transforme la trame avant de l'envoyer. Je pense donc qu'il faut que je sniffe la trame bien avant l'envoi. Je vais donc essayer de lire directement sur le port série.
Après plusieurs recherches il existe divers logiciels qui permettent de faire cela, je vais me tourner vers "portmon" qui est gratuit et qui  peut accepter deux connexions à la fois sur le port serie :

http://www.toocharger.com/telecharger/windows/portmon/16073.htm


3ème étape :

Bonne nouvelle ! j'obtiens les bonnes trames !


Je peux à présent m'occuper des trames lors de l'appairage. Pour ce faire, je vais réaliser un appairage avec le logiciel Plugwise et regarder ce qui se passe durant l'installation dans portmon.

4ème étape :


Constat :


- Plusieurs trames sont envoyées durant chaque appairage et dans un ordre précis.
- Il existe deux types d'appairage :
- L'appairage entre le stick USB et le Circle+ qui contient 5 trames :
   0001CAAB
   000AB43C
   000400010000000000000000000D6F00003 + adresse MAC
   000401010000000000000000000D6F00003 + adresse MAC
   0023000D6F00003
- L'appairage entre le Circle+ et les prises esclaves qui contient 4 trames :
   0008014068
   000701000D6F00003
   0023000D6F00003
   0018000D6F00003 + adresse MAC + X où X va de 01 à 3F. Autrement dit de 1 à 63, étant donné que l'on peut avoir 63 prises branchées sur le même réseau.

Il ne me reste plus qu'à me lancer dans le code !

5ème étape :

Voici une première version bêta. Pour l'instant, cette version n'appaire que les prises ayant pour identité "000D6F00003" et fonctionne sur les firmwares 2008-03-10 pour le Circle + et 2008-08-26 pour le stick USB. Je n'ai pas encore testé sur d'autres firmwares.

version v1 : http://github.com/hackstuces/PlugwiseOnLinux



Mode d'emploi :

Installer la librairie python-serial (apt-get install python-serial).
Mettre tous les fichiers dans le même dossier.
Puis ouvrir une console, se rendre dans le dossier ou se trouvent les fichiers et taper : python pair_pol_v1.py.
Vous pouvez à présent appairer vos prises sous linux.
L'appairage se fait uniquement si les prises sont initialisées. (voir ci-dessous pour initialiser)


Pour initialiser vos prises (sortie d'usine) :
Brancher vos prises pendant 3 secondes puis débrancher les pendant 3 secondes. Faire cette manipulation 3 fois de suite.

Vous pouvez me contacter sur hackstuces@gmail.com



3 commentaires:

  1. hi there,

    first off, congratulations on your work, i think your pairing commands should be integrated to the original pol. Well done sniffing those commands.

    I didn't run your script (i'd rather write another one with these commands) but i can see that you explicitly have all MACs start with
    000D6F00003 while 000D6F0000 only is common among circles. E.g. mine start with 000D6F00009.

    Even some ppls circle could have even more digits different so maybe you should consider the user entering one-digit-longer mac.

    Cheers,
    Thanos

    P.S. too bad your blog is in french but google 's doing a good job.

    RépondreSupprimer
  2. Hi,

    Thanks for your congratulations !
    I'm going to integrated it to the original pol.
    Yes you're right 000D6F0000 is common among circles but how do you know the last digit ? You have to use Plugwise on Windows to know this digit ?

    Bye,

    Hackstuces

    RépondreSupprimer
  3. Did some tsts with pairing a circle+ to a stick too. Me results are almost the same. I have newer firmware in use, that could explain the differences. see my blog here : http://roheve.wordpress.com/2011/05/15/plugwise-protocol-analysis-part-4-create-network/
    Did not have time to code something in linux, but will be.

    RépondreSupprimer