{"id":2741,"date":"2017-12-21T03:15:44","date_gmt":"2017-12-21T02:15:44","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=2741"},"modified":"2018-05-30T15:58:57","modified_gmt":"2018-05-30T13:58:57","slug":"flower-care-miflora-de-xiaomi-recuperer-les-donnees-avec-gatttool-sur-un-rpi-3","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=2741","title":{"rendered":"Flower Care \/ MiFlora de Xiaomi : R\u00e9cup\u00e9rer les donn\u00e9es avec Gatttool sur un RPi 3"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Dans un <a href=\"https:\/\/www.fanjoe.be\/?p=2454\" target=\"_blank\" rel=\"noopener\">article pr\u00e9c\u00e9dent<\/a>, j&rsquo;avais \u00e9voqu\u00e9 une mani\u00e8re de r\u00e9cup\u00e9rer des donn\u00e9es depuis un capteur Flower Care \/ MiFlora de Xiaomi vendu pour un peu plus de 20\u20ac sur <a href=\"http:\/\/amzn.to\/2EW3CwC\" target=\"_blank\" rel=\"noopener\">Amazon<\/a>.<\/p>\n<p>Pour ce faire, on utilisait l\u2019outil \u00ab\u00a0<em>miflora<\/em>\u00a0\u00bb publi\u00e9 par <em>BarnyBug<\/em> sur <em><a href=\"https:\/\/github.com\/barnybug\/miflora\/\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>.<\/em><\/p>\n<p>Mais nous allons voir ici comment importer ces donn\u00e9es avec l&rsquo;outil gatttool sur Linux.<\/p>\n<h1>Importer les donn\u00e9es<\/h1>\n<h2>Installation du bluetooth<\/h2>\n<p>En principe, si vous utilisez un RPi 3, avec Jessie ou Stretch, les outils <em>gatttool<\/em> et <em>hcitool<\/em> que nous allons utiliser plus loin devraient d\u00e9j\u00e0 \u00eatre install\u00e9s.<br \/>\nSi ce n&rsquo;est pas le cas, je vous renvoie vers cet article : <a href=\"https:\/\/thepihut.com\/blogs\/raspberry-pi-tutorials\/17841464-bluetooth-installing-and-using-bluetooth-on-the-raspberry-pi\" target=\"_blank\" rel=\"noopener\">https:\/\/thepihut.com\/<\/a><\/p>\n<pre>$ sudo apt-get update\r\n$ sudo apt-get upgrade\r\n$ sudo apt-get install bluetooth bluez-utils blueman\u00a0bluez<\/pre>\n<h2>D\u00e9terminer l&rsquo;adresse MAC du Miflora<\/h2>\n<p>Pour d\u00e9terminer cette adresse, nous allons utiliser l&rsquo;outil <em>hcitool<\/em>.<\/p>\n<pre>$ sudo hcitool lescan<\/pre>\n<p>Ce qui devrait nous retourner la liste des p\u00e9riph\u00e9rique Bluetooth LE (Low Energy) qui se trouvent \u00e0 proximit\u00e9 :<\/p>\n<pre>LE Scan ...\r\n00:A0:50:44:0B:F3 (unknown)\r\n00:A0:50:44:0B:F3 SensePeanut\r\nC4:7C:8D:63:85:B1 (unknown)\r\nC4:7C:8D:63:85:B1 Flower care\r\nC4:7C:8D:63:85:B1 (unknown)<\/pre>\n<p>Nous avons donc un Flower care avec l&rsquo;adresse MAC : <code>C4:7C:8D:63:85:B1<\/code><\/p>\n<h2>Importer les donn\u00e9es avec gatttool<\/h2>\n<h3>Premiers pas avec gatttool<\/h3>\n<p>Pour nous connecter, nous allons taper cette commande :<\/p>\n<pre>$ sudo gatttool --device=C4:7C:8D:63:85:B1 -I<\/pre>\n<p>Une fois d\u00e9marr\u00e9, l&rsquo;outil est pr\u00eat \u00e0 recevoir des commandes et ceci devrait apparaitre \u00e0 l&rsquo;\u00e9cran :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt;<\/pre>\n<p>On va se connecter avec cette commande :<\/p>\n<pre>connect<\/pre>\n<p>L&rsquo;outil devrait r\u00e9pondre quelque chose comme ceci et l&rsquo;adresse MAC devrait passer en bleu lorsque la connexion est \u00e9tablie :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; connect\r\nAttempting to connect to C4:7C:8D:63:85:B1\r\nConnection successful\r\nNotification handle = 0x0021 value: 00 \r\nNotification handle = 0x0021 value: 00 \r\n<span style=\"color: #0000ff;\">[C4:7C:8D:63:85:B1]<\/span>[LE]<\/pre>\n<p>Un petit <code>help<\/code> va nous retourner toutes les commandes disponibles :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; help\r\nhelp                                          Show this help\r\nexit                                          Exit interactive mode\r\nquit                                          Exit interactive mode\r\nconnect [address [address type]]              Connect to a remote device\r\ndisconnect                                    Disconnect from a remote device\r\nprimary [UUID]                                Primary Service Discovery\r\nincluded [start hnd [end hnd]]                Find Included Services\r\ncharacteristics [start hnd [end hnd [UUID]]]  Characteristics Discovery\r\nchar-desc [start hnd] [end hnd]               Characteristics Descriptor Discovery\r\nchar-read-hnd &lt;handle&gt;                        Characteristics Value\/Descriptor Read by handle\r\nchar-read-uuid &lt;UUID&gt; [start hnd] [end hnd]   Characteristics Value\/Descriptor Read by UUID\r\nchar-write-req &lt;handle&gt; &lt;new value&gt;           Characteristic Value Write (Write Request)\r\nchar-write-cmd &lt;handle&gt; &lt;new value&gt;           Characteristic Value Write (No response)\r\nsec-level [low | medium | high]               Set security level. Default: low\r\nmtu &lt;value&gt;                                   Exchange MTU for GATT\/ATT<\/pre>\n<p>La commande <code>primary<\/code> va explorer les <em>handles <\/em>des services primaires :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; primary\r\nattr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb\r\nattr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb\r\nattr handle: 0x0010, end grp handle: 0x0022 uuid: 0000fe95-0000-1000-8000-00805f9b34fb\r\nattr handle: 0x0023, end grp handle: 0x0030 uuid: 0000fef5-0000-1000-8000-00805f9b34fb\r\nattr handle: 0x0031, end grp handle: 0x0039 uuid: 00001204-0000-1000-8000-00805f9b34fb\r\nattr handle: 0x003a, end grp handle: 0x0042 uuid: 00001206-0000-1000-8000-00805f9b34fb<\/pre>\n<p>La commande <code>char-desc<\/code> va explorer les descripteurs de caract\u00e9ristiques :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; char-desc 0x0001\r\nNotification handle = 0x0021 value: 00 \r\nhandle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb\r\nhandle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb\r\nhandle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb\r\n\r\nhandle: 0x0033, uuid: 00001a00-0000-1000-8000-00805f9b34fb\r\n\r\nhandle: 0x0035, uuid: 00001a01-0000-1000-8000-00805f9b34fb\r\n\r\nhandle: 0x0038, uuid: 00001a02-0000-1000-8000-00805f9b34fb\r\n\r\nhandle: 0x0041, uuid: 00001a12-0000-1000-8000-00805f9b34fb\r\nhandle: 0x0042, uuid: 00001a12-0000-1000-8000-00805f9b34fb<\/pre>\n<h3>Lire un handle<\/h3>\n<p>Pour lire le contenu d&rsquo;un <em>handle<\/em>, on utilise la commande <code>char-read-hnd<\/code> suivie du n\u00b0 du <em>handle<\/em> qui nous int\u00e9resse :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; char-read-hnd 0x0035\r\nCharacteristic value\/descriptor: aa bb cc dd ee ff 99 88 77 66 00 00 00 00 00 00<\/pre>\n<h3>Les <em>handles<\/em> qui nous int\u00e9ressent<\/h3>\n<p>Dans un <a href=\"https:\/\/www.jeedom.com\/forum\/viewtopic.php?t=22870&amp;start=100\" target=\"_blank\" rel=\"noopener\">post sur la plateforme de <em>Jeedom<\/em><\/a>, j&rsquo;ai trouv\u00e9 une petite liste reprenant les <em>handles<\/em> qui vont nous int\u00e9resser. Il s&rsquo;agit du 0x0003, du 0x0033, du 0x0035 et du 0x0038.<\/p>\n<p>Un autre <a href=\"https:\/\/community.home-assistant.io\/t\/xiaomi-mi-plants-monitor-flower\/3388\/111\" target=\"_blank\" rel=\"noopener\">post de la communaut\u00e9 Home Assistant<\/a>, nous apprend que jusqu&rsquo;\u00e0 la version 2.6.2 du firmware du MiFlora, les donn\u00e9es \u00e9taient directement lisibles dans le <em>handle<\/em> 0x0035.<\/p>\n<p>Mais depuis la version 2.6.6, il faut d&rsquo;abord inscrire la valeur <code>A01F<\/code> dans le <em>handle<\/em> <code>0x0033<\/code> pour d\u00e9clencher le <em>live data<\/em> et pouvoir lire les donn\u00e9es en <code>0x0035<\/code>.<\/p>\n<p>Sans \u00e7a, les donn\u00e9es retourn\u00e9es seraient celles par d\u00e9faut :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; char-read-hnd 0x0035\r\nCharacteristic value\/descriptor: aa bb cc dd ee ff 99 88 77 66 00 00 00 00 00 00<\/pre>\n<p>Pour ce faire, on utilise la commande :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; char-write-req 0x0033 A01F<\/pre>\n<p>Une nouvelle lecture de 0x0035 devrait nous retourner quelque chose comme ceci :<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; char-read-hnd 0x0035\r\nCharacteristic value\/descriptor: 8f 00 00 10 00 00 00 23 dc 01 02 3c 00 fb 34 9b<\/pre>\n<p><strong>NB:<\/strong> Les commandes <em>write<\/em> et <em>read<\/em> doivent \u00eatre pass\u00e9es rapidement sans quoi les valeurs retourn\u00e9es seront celles de base.<\/p>\n<pre>[C4:7C:8D:63:85:B1][LE]&gt; connect\r\n[C4:7C:8D:63:85:B1][LE]&gt; char-write-req 0x33 A01F\r\nCharacteristic value was written successfully\r\n[C4:7C:8D:63:85:B1][LE]&gt; char-read-hnd 0x35\r\nCharacteristic value\/descriptor: 8f 00 00 10 00 00 00 23 dc 01 02 3c 00 fb 34 9b \r\n[C4:7C:8D:63:85:B1][LE]&gt; quit<\/pre>\n<h3>En ligne de commande<\/h3>\n<p>Nous allons voir comment utiliser gatttool en ligne de commande :<\/p>\n<pre>$ sudo gatttool --device=C4:7C:8D:63:85:B1 --char-write-req -a 0x33 -n A01F\r\n\r\n$ sudo gatttool --device=C4:7C:8D:63:85:B1 --char-read -a 0x35<\/pre>\n<h2>Structure des donn\u00e9es<\/h2>\n<h3>Nombres entiers sur plusieurs octets<\/h3>\n<p>Les donn\u00e9es sont cod\u00e9es sur des octets en <em>Little endian<\/em>. C.-\u00e0-d. avec l&rsquo;octet de poids le plus faible en premier.<\/p>\n<p>Pour comprendre la repr\u00e9sentation des nombres entiers sur plusieurs octets, vous pouvez consulter cette page Wikipedia : <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Endianness\" target=\"_blank\" rel=\"noopener\">https:\/\/fr.wikipedia.org\/wiki\/Endianness<\/a><\/p>\n<h3>Handle 0x0035<\/h3>\n<p><strong>Correction<\/strong> le 06\/01\/2018 selon le commentaire de Rene Jullien :<br \/>\nTemp\u00e9rature cod\u00e9e sur 2 bytes et non 3.<\/p>\n<p><strong>Exemple<\/strong> : <span style=\"color: #ff0000;\">8f 00<\/span> 00 <span style=\"color: #00ff00;\">10 00 00 00<\/span> <span style=\"color: #0000ff;\">23<\/span> <span style=\"color: #ff6600;\">dc 01<\/span> 02 3c 00 fb 34 9b<\/p>\n\n<table id=\"tablepress-3\" class=\"tablepress tablepress-id-3 tbody-has-connected-cells\">\n<tbody>\n<tr class=\"row-1\">\n\t<td class=\"column-1\">8f<\/td><td class=\"column-2\">00<\/td><td class=\"column-3\">00<\/td><td class=\"column-4\">10<\/td><td class=\"column-5\">00<\/td><td class=\"column-6\">00<\/td><td class=\"column-7\">00<\/td><td class=\"column-8\">23<\/td><td class=\"column-9\">dc<\/td><td class=\"column-10\">01<\/td><td class=\"column-11\">02<\/td><td class=\"column-12\">3c<\/td><td class=\"column-13\">00<\/td><td class=\"column-14\">fb<\/td><td class=\"column-15\">34<\/td><td class=\"column-16\">9b<\/td>\n<\/tr>\n<tr class=\"row-2\">\n\t<td colspan=\"2\" class=\"column-1\">143<\/td><td class=\"column-3\"><\/td><td colspan=\"4\" class=\"column-4\">16<\/td><td class=\"column-8\">35<\/td><td colspan=\"2\" class=\"column-9\">476<\/td><td class=\"column-11\"><\/td><td class=\"column-12\"><\/td><td class=\"column-13\"><\/td><td class=\"column-14\"><\/td><td class=\"column-15\"><\/td><td class=\"column-16\"><\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td colspan=\"2\" class=\"column-1\">Temp\u00e9rature<\/td><td class=\"column-3\">??<\/td><td colspan=\"4\" class=\"column-4\">Ensoleillement<\/td><td class=\"column-8\">Humidit\u00e9<\/td><td colspan=\"2\" class=\"column-9\">Engrais<\/td><td class=\"column-11\">??<\/td><td class=\"column-12\">??<\/td><td class=\"column-13\">??<\/td><td class=\"column-14\">??<\/td><td class=\"column-15\">??<\/td><td class=\"column-16\">??<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-3 from cache -->\n<p>Le handle 0x0035 retourne ces donn\u00e9es :<\/p>\n<ul>\n<li>Bytes 1 &amp; 2 : Temp\u00e9rature : Hex <span style=\"color: #ff0000;\">00 8f<\/span> : 143 = 14,3 \u00b0C<\/li>\n<\/ul>\n<p style=\"padding-left: 70px;\"><strong>Attention !<\/strong><br \/>\nLorsque la temp\u00e9rature est n\u00e9gative, les 2 premiers bytes affichent :<br \/>\nFF FF pour -0.1 \u00b0C \/ F6 FF pour -1.0 \u00b0C \/ 9C FF pour -10.0 \u00b0C<br \/>\nSoit la formule : Temp\u00e9rature = -65536 + Temp\u00e9rature<\/p>\n<ul>\n<li>Bytes 4, 5, 6 &amp; 7 : Ensoleillement : Hex <span style=\"color: #00ff00;\">00 00 00 10<span style=\"color: #000000;\"> : 16 = 16 lux<\/span><\/span><\/li>\n<li>Byte 8 : Humidit\u00e9 : Hex <span style=\"color: #0000ff;\">23<\/span> : 35 %<\/li>\n<li>Bytes 9 &amp; 10 : Engrais : Hex <span style=\"color: #ff6600;\">01 dc<\/span> : 476 uS\/cm<\/li>\n<\/ul>\n<h3>Handle 0x0038<\/h3>\n<p><strong>Exemple<\/strong> : <span style=\"color: #ff00ff;\">63<\/span> 27 <span style=\"color: #339966;\">33 2e 31 2e 38<\/span><\/p>\n\n<table id=\"tablepress-4\" class=\"tablepress tablepress-id-4 tbody-has-connected-cells\">\n<tbody>\n<tr class=\"row-1\">\n\t<td class=\"column-1\">63<\/td><td class=\"column-2\">27<\/td><td class=\"column-3\">33<\/td><td class=\"column-4\">2e<\/td><td class=\"column-5\">31<\/td><td class=\"column-6\">2e<\/td><td class=\"column-7\">38<\/td>\n<\/tr>\n<tr class=\"row-2\">\n\t<td class=\"column-1\">99<\/td><td class=\"column-2\"><\/td><td class=\"column-3\">3<\/td><td class=\"column-4\">.<\/td><td class=\"column-5\">1<\/td><td class=\"column-6\">.<\/td><td class=\"column-7\">8<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">Batterie<\/td><td class=\"column-2\">??<\/td><td colspan=\"5\" class=\"column-3\">Version du Firmware<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-4 from cache -->\n<p>Le handle 0x0038 retourne ces donn\u00e9es :<\/p>\n<ul>\n<li>Byte 1 : Batterie : Hex <span style=\"color: #ff00ff;\">63<\/span> : 99 %<\/li>\n<li>Bytes 3, 4, 5, 6 &amp; 7 : Version du Firmware : ASCII <span style=\"color: #339966;\">33 2e 31 2e 38<\/span> : 3.1.8<\/li>\n<\/ul>\n<h3>Handle 0x0003<\/h3>\n<p>L&rsquo;UUID du handle 0x0003 commence par 0000<span style=\"color: #ff6600;\">2a00<\/span>. On apprend sur <a href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/characteristics\" target=\"_blank\" rel=\"noopener\">cette page<\/a> que 0x<span style=\"color: #ff6600;\">2A00<\/span> correspond \u00e0 un <em>Device Name<\/em>.<\/p>\n<pre>handle: 0x0003, uuid: 0000<span style=\"color: #ff6600;\">2a00<\/span>-0000-1000-8000-00805f9b34fb<\/pre>\n<p><strong>Exemple<\/strong> : 46 6c 6f 77 65 72 20 63 61 72 65<\/p>\n\n<table id=\"tablepress-5\" class=\"tablepress tablepress-id-5 tbody-has-connected-cells\">\n<tbody>\n<tr class=\"row-1\">\n\t<td class=\"column-1\">46<\/td><td class=\"column-2\">6c<\/td><td class=\"column-3\">6f<\/td><td class=\"column-4\">77<\/td><td class=\"column-5\">65<\/td><td class=\"column-6\">72<\/td><td class=\"column-7\">20<\/td><td class=\"column-8\">63<\/td><td class=\"column-9\">61<\/td><td class=\"column-10\">72<\/td><td class=\"column-11\">65<\/td>\n<\/tr>\n<tr class=\"row-2\">\n\t<td class=\"column-1\">F<\/td><td class=\"column-2\">l<\/td><td class=\"column-3\">o<\/td><td class=\"column-4\">w<\/td><td class=\"column-5\">e<\/td><td class=\"column-6\">r<\/td><td class=\"column-7\"><\/td><td class=\"column-8\">c<\/td><td class=\"column-9\">a<\/td><td class=\"column-10\">r<\/td><td class=\"column-11\">e<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td colspan=\"11\" class=\"column-1\">Device Name<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-5 from cache -->\n<p>Le handle 0x0003 retourne ces donn\u00e9es :<\/p>\n<ul>\n<li>Les Bytes de 1 \u00e0 11 indiquent le nom du p\u00e9riph\u00e9rique en ASCII : Flower care<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2755\" data-permalink=\"https:\/\/www.fanjoe.be\/?attachment_id=2755\" data-orig-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01.jpg\" data-orig-size=\"3046,1995\" data-comments-opened=\"1\" data-image-title=\"Gatttool-Miflora-01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01-620x406.jpg\" class=\"alignnone size-large wp-image-2755\" src=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01-620x406.jpg\" alt=\"\" width=\"620\" height=\"406\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01-620x406.jpg 620w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01-175x115.jpg 175w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-01-300x196.jpg 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<h1>Script<\/h1>\n<p>Pour conclure, voici un petit script qui va r\u00e9cup\u00e9rer les donn\u00e9es et les afficher \u00e0 l&rsquo;\u00e9cran :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\n#!\/bin\/bash\r\n\r\n# V\u00e9rifie que l'on est en Root\r\nif &#x5B;&#x5B; $EUID -ne 0 ]];\r\nthen\r\n\techo &quot;Ce script doit \u00eatre ex\u00e9cut\u00e9 avec les privil\u00e8ges administrateur&quot;\r\n   \texit 1\r\nfi\r\n\r\nMACadd=&quot;C4:7C:8D:63:85:B1&quot;\r\n\r\n# On d\u00e9sactive, puis on r\u00e9active le bluetooth pour \u00e9viter les erreurs\r\nhciconfig hci0 down; hciconfig hci0 up\r\n\r\n# On \u00e9crit A01F dans le handle 0x0033 pour activer le live data dans le handle 0x0035\r\ngatttool --device=$MACadd --char-write-req -a 0x33 -n A01F &amp;amp;gt; \/dev\/null\r\n\r\n# Le handle 0x0003 retourne le nom du periph\u00e9rique bluetooth en ASCII\r\n#gatttool --device=$MACadd --char-read -a 0x03\r\n#Characteristic value\/descriptor: 46 6c 6f 77 65 72 20 63 61 72 65\r\n#Flower care\r\n\r\n# Le handle 0x0035 retourne : Temp (Int16) \/ Light (Int32) \/ Moisture (Int8) \/ Fertility (Int16)\r\n#gatttool --device=$MACadd --char-read -a 0x35\r\n#Characteristic value\/descriptor: 8f 00 00 11 00 00 00 23 d9 01 02 3c 00 fb 34 9b \r\n\r\n# Le handle 0x0038 retourne : Battery (Int8) \/ Firmware version (5 bytes ASCII)\r\n#gatttool --device=$MACadd --char-read -a 0x38\r\n#Characteristic value\/descriptor: 63 27 33 2e 31 2e 38\r\n\r\n# Lecture des handle 0x0003, 0x0035 et 0x0038\r\nhnd03=$(gatttool --device=$MACadd --char-read -a 0x03)\r\nhnd35=$(gatttool --device=$MACadd --char-read -a 0x35)\r\nhnd38=$(gatttool --device=$MACadd --char-read -a 0x38)\r\n\r\n# Affichage du nom\r\nname=$(echo &quot;$hnd03&quot; |cut -c34-65 | xxd -r -p)\r\necho Nom : $name\r\n\r\n# Affichage de la temp\u00e9rature\r\ntemperature=$((16#${hnd35:36:2}${hnd35:33:2}))\r\n\r\n# Lorsque la temp\u00e9rature est n\u00e9gative, les 2 premiers bytes affichent :\r\n# FF FF pour -0.1 \u00b0C \/ F6 FF pour -1.0 \u00b0C \/ 9C FF pour -10.0 \u00b0C\r\n# Soit la formule : Temp\u00e9rature = -65536 + Temp\u00e9rature\r\n# J'ai arbitrairement fix\u00e9 la temp\u00e9rature pivot \u00e0 32768 soit 3276.8 \u00b0C !!!\r\n\r\nif &#x5B;&#x5B; $temperature -gt 32768 ]];\r\nthen\r\n\ttemperature=$((-65536 + $temperature))\r\nfi\r\n\r\n# Division par 10 avec 1 chiffre apr\u00e8s la virgule\r\ntemperature=`echo &quot;scale=1;$temperature\/10&quot; | bc`\r\n# Forcer un &quot;0&quot; avant le point d\u00e9cimal pour \u00e9viter par exemple &quot;.1&quot; ou &quot;-.1&quot; \r\n# Chaque fois qu'un nombre commence par &quot;-.&quot;, on remplace &quot;-.&quot; par &quot;-0.&quot;\r\n# Chaque fois qu'un nombre commence par &quot;.&quot;, on remplace &quot;.&quot; par &quot;0.&quot;\r\ntemperature=$(echo $temperature | bc -l | sed -e 's\/^-\\.\/-0.\/' -e 's\/^\\.\/0.\/')\r\necho Temp\u00e9rature : $temperature \u00b0C\r\n\r\n# Affichage de l'ensoleillement\r\nlight=$((16#${hnd35:51:2}${hnd35:48:2}${hnd35:45:2}${hnd35:42:2}))\r\necho Ensoleillement : $light lux\r\n\r\n# Affichage de l'humidit\u00e9\r\nmoisture=$((16#${hnd35:54:2}))\r\necho Humidit\u00e9 : $moisture %\r\n\r\n# Affichage de l'engrais\r\nfertility=$((16#${hnd35:60:2}${hnd35:57:2}))\r\necho Engrais : $fertility uS\/cm\r\n\r\n# Affichage de la batterie\r\nbattery=$((16#${hnd38:33:2}))\r\necho Batterie : $battery %\r\n\r\n# Affichage de la version du firmware\r\nversion=$(echo &quot;$hnd38&quot; |cut -c40-53 | xxd -r -p)\r\necho Version : $version\r\n\r\n# On d\u00e9sactive, puis on r\u00e9active le bluetooth pour \u00e9viter les erreurs\r\nhciconfig hci0 down; hciconfig hci0 up\r\n\r\n<\/pre>\n<p>Vous devriez obtenir ce genre de r\u00e9sultat pour ce script :<\/p>\n<pre>Nom : Flower care\r\nTemp\u00e9rature : 14.3 \u00b0C\r\nEnsoleillement : 17 lux\r\nHumidit\u00e9 : 35 %\r\nEngrais : 473 uS\/cm\r\nBatterie : 99 %\r\nVersion : 3.1.8\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Introduction <\/p>\n<p>Dans un <a href=\"https:\/\/www.fanjoe.be\/?p=2454\" target=\"_blank\" rel=\"noopener\">article pr\u00e9c\u00e9dent<\/a>, j&rsquo;avais \u00e9voqu\u00e9 une mani\u00e8re de r\u00e9cup\u00e9rer des donn\u00e9es depuis un capteur Flower&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2743,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_post_was_ever_published":false},"categories":[179,10,3,173,12],"tags":[13,279,287,288,281,22,280],"class_list":["post-2741","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-domotique","category-geek","category-informatique","category-linux","category-raspberrypi","tag-bluetooth","tag-flower-care","tag-gatttool","tag-hcitool","tag-miflora","tag-raspberry-pi","tag-xiaomi","end"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2017\/12\/Gatttool-Miflora-00.png","_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/2741","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2741"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/2741\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/media\/2743"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2741"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2741"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}