Disclaimer
Ce travail est un ébauche technologique et je ne suis pas affilié à la compagnie Geroco.
N’hésitez pas à me contacter si des choses ne marchent pas chez vous ou si vous passez du temps à trouver/comprendre une information, j’ai peut-être oublié des étapes et je mettrais ce document à jour.
C’est un “travail en cours”, ce document va pas mal évoluer ces prochains temps.
EcoWizz c’est quoi?
EcoWizz est une “prise intelligente”, c’est à dire qu’on a la possibilité de connaître la consommation actuelle d’un ou plusieurs appareils, on a aussi la possibilité d’activer ou désactiver cette prise à distance (en théorie). C’est un produit qui est compatible actuellement avec les prises Suisses.
Plus d’information sur http://www.geroco.ch/
Prérequis
Une machine installé avec linux. J’utilise la distribution “Ubuntu 11.04”.
Une clef USB EcoWizz avec quelques prises.
VirtualBox avec Windows d’installé et le support de l’USB. (Plus d’informations)
But
Le but de cet article est de mieux comprendre comment marche le produit EcoWizz de la société Geroco.
Cela vous permet d’ acquérir les compétences et compréhensions suivantes
- ZigBee: Mieux comprendre comment ce protocole utilisé dans la domotique marche.
- FT232: C’est quoi et comment ça marche (port série sur le port USB).
- USB: Comment monitorer votre port USB (Linux), et mieux comprendre le protocole par un exemple concret.
- Port série et Java: Comment utiliser un port série sur Linux avec le langage de programmation Java.
Mon but technologique est de pouvoir utiliser la solution d’EcoWizz dans mon environnement local, ceci en tant qu’ajout à ma solution de domotique – donc possibilité d’allumer et éteindre les prises, et de récupérer des informations de ces mêmes prises. Pour cela j’ai besoin de pouvoir interagir avec leur produit au travers d’une solution tournant sur Linux.
Le première étape consiste à en savoir plus sur le produit EcoWizz, et quels sont les composants hardware de cette solution.
En allant sur “http://www.geroco.ch/ecowizz.html”, on va découvrir que le protocole de communication qu’ils utilisent est ZigBee.
En insérant la clef USB sur un environnement linux et grâce aux commandes “usb-devices”, “lsusb”
On peut découvrir que cette clef utilise un “chip série” (uart) pour communiquer entre l’ordinateur et le “chip ZigBee”.
Bus 003 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
T: Bus=03 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0403 ProdID=6001 Rev=06.00
S: Manufacturer=FTDI
S: Product=FT232R USB UART
S: SerialNumber=A700fjni
C: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=90mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
En cherchant a l’aide d’un éditeur hexadécimal dans leur code installé sur la version Windows, on peut voir la chaîne de caractères: CC2480. Il s’agit du contrôleur ZigBee qu’ils utilisent. On peut probablement arriver à cette même conclusion en ouvrant leur clef USB, mais c’est quelque chose que je voulais éviter.
Quelques autres points intéressants à relever: Ils utilisent QT, SQLite format 3 (donc possibilité d’aller lire la base de donnée locale), WebnergyClient.dll
Pour résumer
- ZigBee
- Chip série (ftdi_sio) FT232R USB UART
- CC2480 (Contrôleur ZigBee)
VirtualBox, Windows et espionner le port USB
=> Configurer VirtualBox et Windows
Le but de cette partie est de pouvoir “espionner” les messages qui sont envoyés à la clef EcoWizz, à la fin nous seront capable d’envoyer un premier message à la clef et de recevoir la première réponse.
Installez le produit VirtualBox qui vous permet de faire tourner Windows par dessus Linux. Nous auront besoin de la version avec le support de l’USB. (Plus d’informations, ou problèmes). WMWare marche aussi.
Installez le programme EcoWizz et assignez la clef à votre instance Windows. (Devices -> USB Devices -> FTDI …), essayez de rajouter des prises.
Vous devez être capable d’utiliser le clef sous votre environnement virtuel Windows.
=> Support de Wireshark et possibilité “d’espionner” ce qui se passe sur un port USB.
En “root”, installez wireshark. (Sur debian/ubuntu, sudo apt-get install wireshark). Ce programme permet d’espionner ce qui se passe entre
Vous devez activer quelques modules sous linux pour être capable de le faire. (Plus d’informations)
Lancez Wireshark en root (sudo wireshark), vous devriez avoir quelque chose qui s’affiche s’appelant “usbmon{id} USB bus number {id}”, si ce n’est pas le cas, le module de “debuggage” de l’USB n’est pas actif. Je vous conseil de mettre votre module EcoWizz sur un bus différent de la souris (sinon vous avez trop d’informations.).
Vous pouvez savoir sur quel port se trouve votre clef grâce à la commande "lsusb"
Bus 003 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Vous commencez à avoir des lignes qui s’affichent ressemblant à: 4 0.001532 host 3.0 USB “GET DESCRIPTOR”, “URB_CONTROL”.
Analyser le protocole USB
Commencez par lire le code source du drivers du FT232: ftdi_sio.c et lancez WireShark: “su wireshark”.
Utilisez 1-2 minutes votre clef EcoWizz sur votre instance windows, vous devriez voir défiler les messages TRES rapidement. Enlevez votre clef.
Il y a 3 types de messages qui nous intéressent
GET DESCRIPTOR: Décrit le type de device.
Qui nous donne par exemple
0040 20 03 46 00 54 00 32 00 33 00 32 00 52 00 20 00 .F.T.2. 3.2.R. .
0050 55 00 53 00 42 00 20 00 55 00 41 00 52 00 54 00 U.S.B. . U.A.R.T.
URB_CONTROL out: Contrôle les propriétés du device
Dans notre cas ce qui nous intéresse particulièrement, c’est de mettre ce filtre: “usb.setup.bRequest == 3”. Ce filtre va nous sortir tous les paquets responsables de configurer la vitesse du port série (baudrate).
Le paquet qui nous intéresse est
URB.bmRequestType: 0x40
URB.bRequest: 3
URB.wValue: 0x001a ( = 115’200)
Ce que l’on apprend de ce paquet est la vitesse de connexion du port serie EcoWizz: 115’200
On peut trouver les autres informations de configuration par introspection.
URB_BULK out: Envoi et réception des messages qui seront envoyés au module ZigBee.
Il y a beaucoup de message qui passent et ne sont pas très utiles. Ce qui nous intéresse vraiment sont les messages avec ce filtre: “usb.transfer_type == 0x03 && usb.data_len >2”
On a deux types de messages qui nous intéressent
Le message: Host -> x.2
0000 80 67 eb 6a 00 88 ff ff 53 03 02 03 03 00 2d 00 .g.j.... S.....-.
0010 fd fb 2e 4e 00 00 00 00 62 8c 01 00 8d ff ff ff ...N.... b.......
0020 06 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 ........ ........
0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
0040 fe 01 26 06 01 20 ....
Et la réponse: x.2 -> Host
0000 c0 63 eb 6a 00 88 ff ff 43 03 81 03 03 00 2d 00 .c.j.... C.....-.
0010 fd fb 2e 4e 00 00 00 00 ce c2 01 00 00 00 00 00 ...N.... ........
0020 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 ........ ........
0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 ........ ........
0040 11 60 fe 09 66 06 01 a5 03 82 00 00 4b 12 00 15 .`..f... ....K...
La partie nous intéressant particulièrement commence à partir de l’adresse 0040.
Message envoyé au port série: fe 01 26 06 01 20
Réponse: 11 60 fe 09 66 06 01 a5 03 82 00 00 4b 12 00 15
On va analyser plus loin le contenu de ces messages. C’est intéressant de remarquer qu’un message envoyé du host au device commence toujours par “fe”, un message envoyé du device au host par “11 60 fe”.
Résumé:
- Nom du port /dev/ttyUSB0
- Vitesse du port 115’200
- SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, SerialPort.FLOWCONTROL_NONE
- Un message envoyé du host au device est du style: fe xx xx xx …
- Un message envoyé du device au host est du style: 11 60 fe xx xx xx …
Protocole de communication avec le contrôleur ZigBee CC2480
Le but de cette partie est de mieux comprendre comment votre ordinateur “discute” avec la clef ZigBee.
Comme nous l’avons vu, le contrôleur est un CC2480. Comme nous avons de la chance, quelqu’un a crée un code que nous pouvons utiliser ici: “http://zb4osgi.aaloa.org“.
J’ai récupéré le code de svn (svn checkout https://svn.aaloa.org/projects/zb4osgi/trunk zb4osgi-trunk)
Pour installer svn: “sudo apt-get install subversion”
En analysant le code, on comprend mieux comment les messages sont construits.
Du host au device:
fe {size(data)} {Message Type #1} {Message Type #2} {data}* {checksum}
Exemple: [fe] [01] [26 06] [01] [20]
=> Message type : 0x2606
=> Data : 01, de taille 01
=> Checksum : 20
Du device au host
11 60 fe {site(data)} {Message Type #1} {Message Type #2} {data}* {checksum}
Exemple: [11 60 fe] [09] [66 06] [01 a5 03 82 00 00 4b 12 00] [15]
=> Message type : 0x6606 (Réponse au message 2606…)
=> Data : 01 a5 03 82 00 00 4b 12 00, de taille 09
=> Checksum : 15
Le fichier ZToolCMD.java vous énumère les différents types de messages supportés.
Vous pouvez aussi charger cette documentation : ZigBee API
Envoyer notre premier message
Je suis capable d’envoyer des messages à la clef EcoWizz/ZigBee
Vous avez toutes les informations pour le faire (au travers d’un terminal)
- Nom du port /dev/ttyUSB0
- Vitesse du port 115’200
- SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, SerialPort.FLOWCONTROL_NONE
Vous pouvez par exemple envoyer en hexadécimal: fe 00 21 02 23 ..!.#
Vous allez recevoir normalement: 11 60 fe 05 61 02 02 01 01 00 00 64 .`..a… …d
Plus d’informations avec éventuellement du code quand j’aurais avancé dans cette partie.