{"id":141,"date":"2012-08-07T16:42:15","date_gmt":"2012-08-07T14:42:15","guid":{"rendered":"http:\/\/www.nuage.ch\/site\/?p=141"},"modified":"2012-08-07T16:45:25","modified_gmt":"2012-08-07T14:45:25","slug":"geroco-et-zigbee","status":"publish","type":"post","link":"https:\/\/nuage.ch\/site\/geroco-et-zigbee\/","title":{"rendered":"Geroco et ZigBee"},"content":{"rendered":"<p><strong>Disclaimer <\/strong><\/p>\n<p>Ce travail est un \u00e9bauche technologique et je ne suis pas affili\u00e9 \u00e0 la compagnie Geroco.<\/p>\n<p>N&#8217;h\u00e9sitez pas \u00e0 me contacter si des choses ne marchent pas chez vous ou si vous passez du temps \u00e0 trouver\/comprendre une information, j&#8217;ai peut-\u00eatre oubli\u00e9 des \u00e9tapes et je mettrais ce document \u00e0 jour.<\/p>\n<p>C&#8217;est un &#8220;travail en cours&#8221;, ce document va pas mal \u00e9voluer ces prochains temps.<\/p>\n<p><strong>EcoWizz c&#8217;est quoi?<\/strong><\/p>\n<p>EcoWizz est une &#8220;prise intelligente&#8221;, c&#8217;est \u00e0 dire qu&#8217;on a la possibilit\u00e9 de conna\u00eetre la consommation actuelle d&#8217;un ou plusieurs appareils, on a aussi la possibilit\u00e9 d&#8217;activer ou d\u00e9sactiver cette prise \u00e0 distance (en th\u00e9orie). C&#8217;est un produit qui est compatible actuellement avec les prises Suisses.<\/p>\n<p>Plus d&#8217;information sur <a title=\"http:\/\/www.geroco.ch\/\" href=\"http:\/\/www.geroco.ch\/\" target=\"_blank\">http:\/\/www.geroco.ch\/<\/a><\/p>\n<p><strong>Pr\u00e9requis<\/strong><\/p>\n<p>Une machine install\u00e9 avec linux. J&#8217;utilise la distribution &#8220;Ubuntu 11.04&#8221;.<\/p>\n<p>Une clef USB EcoWizz avec quelques prises.<\/p>\n<p>VirtualBox avec Windows d&#8217;install\u00e9 et le support de l&#8217;USB. (<a title=\"Plus d'informations\" href=\"http:\/\/www.howtogeek.com\/howto\/31726\/mount-usb-devices-in-virtualbox-with-ubuntu\/\" target=\"_blank\">Plus d&#8217;informations<\/a>)<\/p>\n<p><strong>But<\/strong><\/p>\n<p>Le but de cet article est de mieux comprendre comment marche le produit EcoWizz de la soci\u00e9t\u00e9 Geroco.<\/p>\n<p>Cela vous permet d&#8217; acqu\u00e9rir les comp\u00e9tences et compr\u00e9hensions suivantes<\/p>\n<ul>\n<li>ZigBee: Mieux comprendre comment ce protocole utilis\u00e9 dans la domotique marche.<\/li>\n<li>FT232: C&#8217;est quoi et comment \u00e7a marche (port s\u00e9rie sur le port USB).<\/li>\n<li>USB: Comment monitorer votre port USB (Linux), et mieux comprendre le protocole par un exemple concret.<\/li>\n<li>Port s\u00e9rie et Java: Comment utiliser un port s\u00e9rie sur Linux avec le langage de programmation Java.<\/li>\n<\/ul>\n<p>Mon but technologique est de pouvoir utiliser la solution d&#8217;EcoWizz dans mon environnement local, ceci en tant qu&#8217;ajout \u00e0 ma solution de domotique &#8211; donc possibilit\u00e9 d&#8217;allumer et \u00e9teindre les prises, et de r\u00e9cup\u00e9rer des informations de ces m\u00eames prises. Pour cela j&#8217;ai besoin de pouvoir interagir avec leur produit au travers d&#8217;une solution tournant sur Linux.<\/p>\n<p>Le premi\u00e8re \u00e9tape consiste \u00e0 en savoir plus sur le produit EcoWizz, et quels sont les composants hardware de cette solution.<\/p>\n<p>En allant sur &#8220;http:\/\/www.geroco.ch\/ecowizz.html&#8221;, on va d\u00e9couvrir que le protocole de communication qu&#8217;ils utilisent est <strong>ZigBee<\/strong>.<\/p>\n<p>En ins\u00e9rant la clef USB sur un environnement linux et gr\u00e2ce aux commandes &#8220;usb-devices&#8221;, &#8220;lsusb&#8221;<\/p>\n<p>On peut d\u00e9couvrir que cette clef utilise un &#8220;chip s\u00e9rie&#8221; (uart) pour communiquer entre l&#8217;ordinateur et le &#8220;chip ZigBee&#8221;.<\/p>\n<p><code>Bus 003 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC<\/code><\/p>\n<p>&nbsp;<\/p>\n<p><code>T: <strong>Bus=03<\/strong> Lev=01 Prnt=01 Port=03 Cnt=01 Dev#= 3 Spd=12 MxCh= 0<br \/>\nD: Ver= 2.00 Cls=00(&gt;ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1<br \/>\nP: Vendor=0403 ProdID=6001 Rev=06.00<br \/>\nS: Manufacturer=FTDI<br \/>\nS: Product=<strong>FT232R USB UART<\/strong><br \/>\nS: SerialNumber=A700fjni<br \/>\nC: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=90mA<br \/>\nI: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff <strong>Driver=ftdi_sio<\/strong><br \/>\n<\/code><\/p>\n<p>En cherchant a l&#8217;aide d&#8217;un \u00e9diteur hexad\u00e9cimal dans leur code install\u00e9 sur la version Windows, on peut voir la cha\u00eene de caract\u00e8res: CC2480. Il s&#8217;agit du contr\u00f4leur ZigBee qu&#8217;ils utilisent. On peut probablement arriver \u00e0 cette m\u00eame conclusion en ouvrant leur clef USB, mais c&#8217;est quelque chose que je voulais \u00e9viter.<\/p>\n<p>Quelques autres points int\u00e9ressants \u00e0 relever: Ils utilisent QT, SQLite format 3 (donc possibilit\u00e9 d&#8217;aller lire la base de donn\u00e9e locale), WebnergyClient.dll<\/p>\n<p>Pour r\u00e9sumer<\/p>\n<ul>\n<li>ZigBee<\/li>\n<li>Chip s\u00e9rie (ftdi_sio) FT232R USB UART<\/li>\n<li>CC2480 (Contr\u00f4leur ZigBee)<\/li>\n<\/ul>\n<p><strong>VirtualBox, Windows et espionner le port USB<\/strong><\/p>\n<p>=&gt; Configurer VirtualBox et Windows<\/p>\n<p>Le but de cette partie est de pouvoir &#8220;espionner&#8221; les messages qui sont envoy\u00e9s \u00e0 la clef EcoWizz, \u00e0 la fin nous seront capable d&#8217;envoyer un premier message \u00e0 la clef et de recevoir la premi\u00e8re r\u00e9ponse.<\/p>\n<p>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&#8217;USB. (<a title=\"Plus d'informations\" href=\"http:\/\/www.howtogeek.com\/howto\/31726\/mount-usb-devices-in-virtualbox-with-ubuntu\/\" target=\"_blank\">Plus d&#8217;informations<\/a>, ou <a title=\"probl\u00e8mes\" href=\"http:\/\/www.virtualbox.org\/manual\/ch12.html#usb_linux\" target=\"_blank\">probl\u00e8mes<\/a>). WMWare marche aussi.<br \/>\nInstallez le programme EcoWizz et assignez la clef \u00e0 votre instance Windows. (Devices -&gt; USB Devices -&gt; FTDI &#8230;), essayez de rajouter des prises.<\/p>\n<p><em>Vous devez \u00eatre capable d&#8217;utiliser le clef sous votre environnement virtuel Windows.<\/em><\/p>\n<p>=&gt; Support de Wireshark et possibilit\u00e9 &#8220;d&#8217;espionner&#8221; ce qui se passe sur un port USB.<\/p>\n<p>En &#8220;root&#8221;, installez wireshark. (Sur debian\/ubuntu, <em>sudo apt-get install wireshark<\/em>). Ce programme permet d&#8217;espionner ce qui se passe entre<\/p>\n<p>Vous devez activer quelques modules sous linux pour \u00eatre capable de le faire.  (<a title=\"Plus d'informations\" href=\"http:\/\/wiki.wireshark.org\/CaptureSetup\/USB\" target=\"_blank\">Plus d&#8217;informations<\/a>)<\/p>\n<p>Lancez Wireshark en root (sudo wireshark), vous devriez avoir quelque chose qui s&#8217;affiche s&#8217;appelant &#8220;usbmon{id} USB bus number {id}&#8221;, si ce n&#8217;est pas le cas, le module de &#8220;debuggage&#8221; de l&#8217;USB n&#8217;est pas actif. Je vous conseil de mettre votre module EcoWizz sur un bus diff\u00e9rent de la souris (sinon vous avez trop d&#8217;informations.).<\/p>\n<p>Vous pouvez savoir<code> sur quel port se trouve votre clef gr\u00e2ce \u00e0 la commande \"lsusb\"<br \/>\n<em><strong>Bus 003<\/strong> Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC<\/em><\/code><\/p>\n<p>Vous commencez \u00e0 avoir des lignes qui s&#8217;affichent ressemblant \u00e0: 4 0.001532 host 3.0 USB &#8220;GET DESCRIPTOR&#8221;, &#8220;URB_CONTROL&#8221;.<\/p>\n<p><strong>Analyser le protocole USB<\/strong><\/p>\n<p>Commencez par lire le code source du drivers du FT232: <a title=\"ftdi_sio.c\" href=\"http:\/\/lxr.free-electrons.com\/source\/drivers\/usb\/serial\/ftdi_sio.c\" target=\"_blank\">ftdi_sio.c<\/a> et lancez WireShark: &#8220;su wireshark&#8221;.<br \/>\nUtilisez 1-2 minutes votre clef EcoWizz sur votre instance windows, vous devriez voir d\u00e9filer les messages TRES rapidement. Enlevez votre clef.<\/p>\n<p>Il y a 3 types de messages qui nous int\u00e9ressent<\/p>\n<p>GET DESCRIPTOR: D\u00e9crit le type de device.<br \/>\nQui nous donne par exemple<br \/>\n<code>0040  20 03 46 00 54 00 32 00  33 00 32 00 52 00 20 00    .F.T.2. 3.2.R. .<br \/>\n0050  55 00 53 00 42 00 20 00  55 00 41 00 52 00 54 00   U.S.B. . U.A.R.T.<\/code><\/p>\n<p>URB_CONTROL out: Contr\u00f4le les propri\u00e9t\u00e9s du device<br \/>\nDans notre cas ce qui nous int\u00e9resse particuli\u00e8rement, c&#8217;est de mettre ce filtre: &#8220;usb.setup.bRequest == 3&#8221;. Ce filtre va nous sortir tous les paquets responsables de configurer la vitesse du port s\u00e9rie (baudrate).<\/p>\n<p>Le paquet qui nous int\u00e9resse est<br \/>\nURB.bmRequestType: 0x40<br \/>\nURB.bRequest: 3<br \/>\nURB.wValue: 0x001a ( = 115&#8217;200)<\/p>\n<p>Ce que l&#8217;on apprend de ce paquet est la vitesse de connexion du port serie EcoWizz: 115&#8217;200<br \/>\nOn peut trouver les autres informations de configuration par introspection.<\/p>\n<p>URB_BULK out: Envoi et r\u00e9ception des messages qui seront envoy\u00e9s au module ZigBee.<\/p>\n<p>Il y a beaucoup de message qui passent et ne sont pas tr\u00e8s utiles. Ce qui nous int\u00e9resse vraiment sont les messages avec ce filtre: &#8220;usb.transfer_type == 0x03 &amp;&amp; usb.data_len &gt;2&#8221;<\/p>\n<p>On a deux types de messages qui nous int\u00e9ressent<\/p>\n<p><code>Le message: Host -&gt; x.2<br \/>\n0000  80 67 eb 6a 00 88 ff ff  53 03 02 03 03 00 2d 00   .g.j.... S.....-.<br \/>\n0010  fd fb 2e 4e 00 00 00 00  62 8c 01 00 8d ff ff ff   ...N.... b.......<br \/>\n0020  06 00 00 00 06 00 00 00  00 00 00 00 00 00 00 00   ........ ........<br \/>\n0030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ........ ........<br \/>\n<strong>0040  fe 01 26 06 01 20<\/strong> ....<\/code><\/p>\n<p><code>Et la r\u00e9ponse: x.2 -&gt; Host<br \/>\n0000  c0 63 eb 6a 00 88 ff ff  43 03 81 03 03 00 2d 00   .c.j.... C.....-.<br \/>\n0010  fd fb 2e 4e 00 00 00 00  ce c2 01 00 00 00 00 00   ...N.... ........<br \/>\n0020  10 00 00 00 10 00 00 00  00 00 00 00 00 00 00 00   ........ ........<br \/>\n0030  00 00 00 00 00 00 00 00  00 02 00 00 00 00 00 00   ........ ........<br \/>\n<strong>0040  11 60 fe 09 66 06 01 a5  03 82 00 00 4b 12 00 15<\/strong> .`..f... ....K...<\/code><\/p>\n<p>La partie nous int\u00e9ressant particuli\u00e8rement commence \u00e0 partir de l&#8217;adresse 0040.<br \/>\n<code>Message envoy\u00e9 au port s\u00e9rie: fe 01 26 06 01 20<\/code><br \/>\n<code>R\u00e9ponse: 11 60 fe 09 66 06 01 a5  03 82 00 00 4b 12 00 15<\/code><\/p>\n<p>On va analyser plus loin le contenu de ces messages. C&#8217;est int\u00e9ressant de remarquer qu&#8217;un message envoy\u00e9 du host au device commence toujours par &#8220;fe&#8221;, un message envoy\u00e9 du device au host par &#8220;11 60 fe&#8221;.<\/p>\n<p>R\u00e9sum\u00e9:<\/p>\n<ul>\n<li>Nom du port \/dev\/ttyUSB0<\/li>\n<li>Vitesse du port 115&#8217;200<\/li>\n<li>SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, SerialPort.FLOWCONTROL_NONE<\/li>\n<li>Un message envoy\u00e9 du host au device est du style: fe xx xx xx &#8230;<\/li>\n<li>Un message envoy\u00e9 du device au host est du style: 11 60 fe xx xx xx &#8230;<\/li>\n<\/ul>\n<p><strong>Protocole de communication avec le contr\u00f4leur ZigBee CC2480<\/strong><\/p>\n<p>Le but de cette partie est de mieux comprendre comment votre ordinateur &#8220;discute&#8221; avec la clef ZigBee.<\/p>\n<p>Comme nous l&#8217;avons vu, le contr\u00f4leur est un CC2480. Comme nous avons de la chance, quelqu&#8217;un a cr\u00e9e un code que nous pouvons utiliser ici: &#8220;<a title=\"http:\/\/zb4osgi.aaloa.org\" href=\"http:\/\/zb4osgi.aaloa.org\/\" target=\"_blank\">http:\/\/zb4osgi.aaloa.org<\/a>&#8220;.<\/p>\n<p>J&#8217;ai r\u00e9cup\u00e9r\u00e9 le code de svn (<em>svn checkout https:\/\/svn.aaloa.org\/projects\/zb4osgi\/trunk zb4osgi-trunk<\/em>)<br \/>\nPour installer svn: &#8220;sudo apt-get install subversion&#8221;<\/p>\n<p>En analysant le code, on comprend mieux comment les messages sont construits.<\/p>\n<p>Du host au device:<br \/>\nfe {size(data)} {Message Type #1} <code> {Message Type #2} {data}* {checksum}<\/code><br \/>\nExemple: [fe] [01] [26 06] [01] [20]<br \/>\n=&gt; Message type : 0x2606<br \/>\n=&gt; Data : 01, de taille 01<br \/>\n=&gt; Checksum : 20<\/p>\n<p>Du device au host<br \/>\n11 60 fe {site(data)} {Message Type #1} {Message Type #2} {data}* {checksum}<br \/>\nExemple: [11 60 fe] [09] [66 06] [01 a5  03 82 00 00 4b 12 00] [15]<br \/>\n=&gt; Message type : 0x6606 (R\u00e9ponse au message 2606&#8230;)<br \/>\n=&gt; Data : 01 a5  03 82 00 00 4b 12 00, de taille 09<br \/>\n=&gt; Checksum : 15<\/p>\n<p>Le fichier ZToolCMD.java vous \u00e9num\u00e8re les diff\u00e9rents types de messages support\u00e9s.<\/p>\n<p>Vous pouvez aussi charger cette documentation : <a title=\"ZigBee API\" href=\"http:\/\/www.cleode.fr\/en\/telecharger.php?fichier=zigbee_api.pdf\" target=\"_blank\">ZigBee API<\/a><\/p>\n<p><strong>Envoyer notre premier message<\/strong><\/p>\n<p>Je suis capable d&#8217;envoyer des messages \u00e0 la clef EcoWizz\/ZigBee<\/p>\n<p>Vous avez toutes les informations pour le faire (au travers d&#8217;un terminal)<\/p>\n<ul>\n<li>Nom du port \/dev\/ttyUSB0<\/li>\n<li>Vitesse du port 115&#8217;200<\/li>\n<li>SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, SerialPort.FLOWCONTROL_NONE<\/li>\n<\/ul>\n<p>Vous pouvez par exemple envoyer en hexad\u00e9cimal:  fe 00 21 02 23                                     ..!.#<br \/>\nVous allez recevoir normalement: 11 60 fe 05 61 02 02 01  01 00 00 64               .`..a&#8230; &#8230;d<\/p>\n<p>Plus d&#8217;informations avec \u00e9ventuellement du code quand j&#8217;aurais avanc\u00e9 dans cette partie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Disclaimer Ce travail est un \u00e9bauche technologique et je ne suis pas affili\u00e9 \u00e0 la compagnie Geroco. N&#8217;h\u00e9sitez pas \u00e0 me contacter si des choses ne marchent pas chez vous ou si vous passez du temps \u00e0 trouver\/comprendre une information, j&#8217;ai peut-\u00eatre oubli\u00e9 des \u00e9tapes et je mettrais ce document \u00e0 jour. C&#8217;est un &#8220;travail [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3],"tags":[],"class_list":["post-141","post","type-post","status-publish","format-standard","hentry","category-technical-analysis"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p50cYU-2h","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/posts\/141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/comments?post=141"}],"version-history":[{"count":0,"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/posts\/141\/revisions"}],"wp:attachment":[{"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/media?parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/categories?post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nuage.ch\/site\/wp-json\/wp\/v2\/tags?post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}