Articles connexes :
Il y a quelques temps, mon Flower Power de marque Parrot a, pour une mystérieuse raison, perdu la connexion avec l’application sur iOS. Il était alors compliqué de concevoir un script pour le maintenir en vie et récupérer les données sur mon Raspberry Pi, vous allez comprendre pourquoi plus bas.
Puis, je suis tombé sur le blog Journal du Lapin qui expliquait comment remédier au problème.
Et effectivement le handle: 0x0003
, uuid: 00002a00-0000-1000-8000-00805f9b34fb
(qui correspond au Device Name) était vide alors que pour être reconnu par l’app iOS il doit contenir « Parrot ».
J’ai utilisé cette commande gatttool pour le modifier :
$ sudo gatttool –device=90:03:B7:xx:xx:xx –char-write-req -a 0x03 -n 506172726f74
Où 506172726f74
est « Parrot » en Hex.
Après cette manipulation, tout est rentré dans l’ordre et l’app iOS a recommencé à fonctionner. J’ai alors pu attaquer l’étude des données.
En cherchant un peu sur la toile, j’ai rapidement trouvé la documentation du Flower Power sur le site du constructeur.
Je l’ai aussi hébergée ici au cas ou…
La documentation nous indique de le Flower Power a une MAC address qui commence toujours par 90:03:b7:xx:xx:xx
.
La liste des UUID normalisés est disponible à cette adresse : https://www.bluetooth.com/specifications/gatt/characteristics
0x2A19
0xFD01
La date et l’heure sont codées sur 32 bits en little endian.
Pour déclencher la lecture des mesures en live, il faut inscrire 1 dans l’UUID 0xFA06
et 0 pour clôturer la lecture.
0xFA01
: Éclairement (en lux)0xFA02
: Conductivité électrique du sol (milli Siemens par mètre (mS/m))0xFA03
: Température du sol (en °Celsius)0xFA04
: Température de l’air (en °Celsius)0xFA05
: Contenu volumétrique d’eau dans le sol (en m3/m3)La documentation explique que la valeur à afficher est le résultat de la formule indiquée dans le tableau. Mais il n’en est rien ! Et les formules sont bien plus complexes. J’ai du porter de nombreuses mesures dans des tableaux pour parvenir à les trouver.
0xFA07
Pour allumer ou éteindre la LED, il faut écrire 1
ou 0
dans le UUID 0xFA07
.
0xFA08
Lorsque le Flower Power est déplacé, la date du déplacement est inscrite dans cet UUID.
NB: Je n’ai pas trouvé cet UUID dans la liste obtenue par gatttool.
Je vous renvoie vers l’article qui traite du Flower Care pour plus d’infos sur l’utilisation de gatttool : Flower Care / MiFlora de Xiaomi : Récupérer les données avec Gatttool sur un RPi 3
$ sudo hcitool lescan
Ce qui devrait nous retourner la liste des périphérique Bluetooth LE (Low Energy) qui se trouvent à proximité :
LE Scan ...
FC:E4:1D:88:BD:59 FCE41D88
FC:E4:1D:88:BD:59 (unknown)
C4:7C:8D:63:85:B1 (unknown)
C4:7C:8D:63:85:B1 Flower care
90:03:B7:E7:DC:6C (unknown)
90:03:B7:E7:DC:6C Parrot
2C:41:A1:8B:8C:9B (unknown)
2C:41:A1:8B:8C:9B LE-Bose Micro SoundLink
Le Flower Power est bien là. Sa Mac address commence bien par 90:03:B7:xx:xx:xx
comme indiqué dans la documentation.
La documentation de Parrot nous fournit les UUID des différentes caractéristiques. Mais nous avons besoins de l’ID de leurs handles respectifs.
Nous allons utiliser la commande :
$ sudo gatttool --device=90:03:B7:E7:DC:6C --char-desc -a 0x0001
Après quelques secondes d’attente, nous devrions voir apparaitre une longue liste dont voici les lignes les plus intéressantes :
handle = 0x0003, uuid = 00002a00-0000-1000-8000-00805f9b34fb handle = 0x0025, uuid = 39e1fa01-84a8-11e2-afba-0002a5d5c51b handle = 0x0029, uuid = 39e1fa02-84a8-11e2-afba-0002a5d5c51b handle = 0x002d, uuid = 39e1fa03-84a8-11e2-afba-0002a5d5c51b handle = 0x0031, uuid = 39e1fa04-84a8-11e2-afba-0002a5d5c51b handle = 0x0035, uuid = 39e1fa05-84a8-11e2-afba-0002a5d5c51b handle = 0x0039, uuid = 39e1fa06-84a8-11e2-afba-0002a5d5c51b handle = 0x003c, uuid = 39e1fa07-84a8-11e2-afba-0002a5d5c51b handle = 0x004c, uuid = 00002a19-0000-1000-8000-00805f9b34fb handle = 0x0078, uuid = 39e1fd01-84a8-11e2-afba-0002a5d5c51b
J’ai indiqué en rouge l’UUID. Nous pouvons voir les handles correspondants en début de ligne.
Nous avons vu plus haut que le niveau de la batterie était repris par l’UUID 0x2A19
, soit le handle 0x004c
.
Pour lire le contenu du handle de la batterie, nous allons utiliser cette commande :
$ sudo gatttool --device=90:03:B7:E7:DC:6C --char-read -a 0x4c
NB: On peut abréger le handle par 0x4c
au lieu de 0x004c
.
On obtiendra une réponse sous cette forme :
Characteristic value/descriptor: 54
C’est une valeur hexadécimale soit : 84 %
Certains handles comme la température apporteront une réponse sur 2 octets.
$ sudo gatttool --device=90:03:B7:E7:DC:6C --char-read -a 0x31
Characteristic value/descriptor: 92 03
Comme indiqué sur l’article de Wikipédia, l’octet de poids le plus faible vient en premier.
Nous aurons donc à permuter comme ceci :
92 03 => 03 92
Ce qui donne 914
en décimal.
Une fois qu’il est possible de lire les données, il est nécessaire de les comprendre. Comme les formules données par le constructeur ne fonctionnent pas, j’ai décidé de procéder à de nombreuses mesures que j’ai portées dans un tableau afin de déterminer la formule.
NB: Plus bas, j’utilise régulièrement le terme « Hex ». Il faudra souvent comprendre : « la valeur brute du capteur exprimée en hexadécimal et convertie en décimal » .
Pour trouver la corrélation entre la température exprimée en hexadécimal (Hex) dans le résultat de gatttool et celle affichée en degrés Celsius (°C) dans l’app iOS, j’ai décidé de relever un maximum de points et de tracer une courbe.
Pour ce faire, j’ai plongé de Flower Power dans une boîte en polystyrène et ai placé le tout au congélateur. Je l’ai ensuite ressorti et ai relevé régulièrement la température qui remontait doucement via gatttool et l’app Flower Power sur iOS.
J’en ai déduit ce tableau :
Comme lorsque l’on converti une température en degrés Fahrenheit vers des degrés Celsius, il faut retrouver un 0 commun avant d’appliquer une règle de trois.
Dans notre cas, il faut appliquer un décalage de 320 à la température exprimée en Hex afin de faire passer la droite par le point 0,0.
Sur le graphique, on peut constater que la courbe des tendances (une droite dans ce cas) en gris ne suit pas le tracé. Je n’ai pas d’explication et pourtant mes relevés sont corrects.
Edit 16/04/2020 : Le Flower Power utilise probablement 2 sondes différentes pour relever les températures (basses et hautes) avec une bascule entre les deux qui se passe à 10°C. D’où une sensibilité et des pentes différentes.
Pour résoudre le problème, j’ai tracé une droite brisée qui passe par x=0,y=0 et change de pente en x=10,y=130 pour rejoindre x=31,y=565.
Je retrouve alors un tracé (en orange) très cohérent avec mes observations (les points bleus en dessous).
Pour les valeurs de température Hex ≤ 130 :
m (pente) = 13
y = 13 x
Température °C = (Température Hex - 320) / 13
Pour les valeurs de température Hex > 130 :
m (pente) = 20,7142
y = 20,7142 x - 77,142
Température en °C = (Température Hex - 320 + 77,142) / 20,7142
Pour mesurer l’ensoleillement ou plutôt l’éclairement exprimé en lux, j’ai placé le Flower Power sous une lampe de bureau et ai fait varier la distance avec la source. Les relevés étant forts instables, j’ai effectué 5 mesures à chaque fois et en ai tiré une moyenne.
Le graphique est ici très cohérent :
C’est une courbe exponentielle qu’il faudra prolonger vers les valeurs les plus extrêmes et dont MS Excel nous donne la formule (courbe des tendances : puissance) :
y = 8E+07 x ^-1,063
y = 80000000 x ^-1,063
Éclairement en lux = 80000000 * (Éclairement en Hex) ^-1,063
Avec cette formule, nous avons un minimum de 607 lux quand la valeur Hex vaut 65535. Ce qui correspond à la lecture minimal de l’app qui « décroche » en dessous de cette valeur.
À l’inverse, la lecture sur l’app s’arrête à 903 klux quand la valeur Hex vaut 44, soit 1 432 517 lux en appliquant la formule.
En théorie nous pourrions monter à 80 000 000 lux quand Hex vaut 1.
Malheureusement, pour une raison qui m’échappe, mon Flower Power n’affiche aucune données concernant l’humidité du sol (Contenu volumétrique d’eau dans le sol / VWC). Dans le sol, dans l’eau, à sec, … Rien ! Je ne peux donc pas tracer de graphique comme je l’ai fait pour les autres paramètres.
Quant à l’engrais (Conductivité électrique du sol), il n’est pas possible d’afficher les données en live.
Côté lectures sur le Raspberry Pi, j’obtiens des données incohérentes.
La documentation parle de « Température du sol » pour l’UUID 0xFA03
. Mais encore une fois, le contenu de handle 0x002d
correspondant est difficile à déchiffrer sans référence sur l’app.
C’est peut-être un point que je vais continuer à creuser…
Voici un petit script qui va nous permettre de lire les infos :
#!/bin/bash # Vérifie que l'on est en Root if [[ $EUID -ne 0 ]]; then echo "Ce script doit être exécuté avec les privilèges administrateur" exit 1 fi MACadd="90:03:B7:xx:xx:xx" # Indiquer la MACaddress de votre Flower Power # On désactive, puis on réactive le bluetooth pour éviter les erreurs #sudo hciconfig hci0 down; sudo hciconfig hci0 up # On affiche la MAC Address echo -e "MAC address : $MACadd \n" # On allume la LED gatttool --device=$MACadd --char-write-req -a 0x3c -n 01 #LED # On active les données Live gatttool --device=$MACadd --char-write-req -a 0x39 -n 01 #Live Data ######## # Name # ######## hnd03=$(gatttool --device=$MACadd --char-read -a 0x03) echo $hnd03 name=$(echo "$hnd03" |cut -c34-65 | xxd -r -p) echo -e "Nom : $name \n" ########### # Battery # ########### hnd4c=$(gatttool --device=$MACadd --char-read -a 0x4c) echo $hnd4c battery=$((16#${hnd4c:33:2})) echo -e "Battery : $battery % \n" ######### # Light # ######### hnd25=$(gatttool --device=$MACadd --char-read -a 0x25) echo $hnd25 light=$((16#${hnd25:36:2}${hnd25:33:2})) echo Light Hex : $light #light=1 if [[ $light -eq 65535 ]] then light=0 else light=`python -c "print int(round((80000000*($light**(-1.063))),0))"` fi echo -e "Light lux : $light lux \n" ############ # Air Temp # ############ hnd31=$(gatttool --device=$MACadd --char-read -a 0x31) echo $hnd31 air_temp=$((16#${hnd31:36:2}${hnd31:33:2})) echo Air Temp Hex : $air_temp if [[ $air_temp -le 450 ]] then air_temp=`echo "scale=1;($air_temp-320)/13" | bc` else air_temp=`echo "scale=1;(($air_temp-320)+77.142)/20.7142" | bc` fi echo -e "Air Temp °C : $air_temp °C \n" ############# # Soil Temp # ############# hnd2d=$(gatttool --device=$MACadd --char-read -a 0x2d) echo $hnd2d soil_temp=$((16#${hnd2d:36:2}${hnd2d:33:2})) echo -e "Soil Temp Hex : $soil_temp \n" ########### # Soil EC # ########### hnd29=$(gatttool --device=$MACadd --char-read -a 0x29) echo $hnd29 soil_ec=$((16#${hnd29:36:2}${hnd29:33:2})) echo -e "Soil EC Hex : $soil_ec \n" ############ # Soil VWC # ############ hnd35=$(gatttool --device=$MACadd --char-read -a 0x35) echo $hnd35 soil_vwc=$((16#${hnd35:36:2}${hnd35:33:2})) echo Soil VWC Hex : $soil_vwc # On désactive les données Live gatttool --device=$MACadd --char-write-req -a 0x39 -n 00 #Live Data
Vous devriez obtenir ce genre de données :
MAC address : 90:03:B7:E7:DC:6C
Characteristic value/descriptor: 50 61 72 72 6f 74
Nom : Parrot
Characteristic value/descriptor: 50
Battery : 80 %
Characteristic value/descriptor: 82 17
Light Hex : 6018
Light lux : 7683 lux
Characteristic value/descriptor: f7 02
Air Temp Hex : 759
Air Temp °C : 24.9 °C
Characteristic value/descriptor: a5 02
Soil Temp Hex : 677
Characteristic value/descriptor: 5f 00
Soil EC Hex : 95
Characteristic value/descriptor: 00 00
Soil VWC Hex : 0
Mon Flower Power est resté bien longtemps au fond d’une caisse et il est possible qu’il ait été endommagé. J’ai donc décidé de l’utiliser pour ses deux fonctions dont je peux déchiffrer les résultats.
Je l’ai accroché sur le tuteur, en haut de mon ficus. Il me permet d’obtenir des données complémentaires à celles de mon Xiaomi Flower Care qui est planté dans le pot.
Voici les résultats de mesures affichés avec RPi-Monitor :
On peut voir la différence de température et d’ensoleillement entre le feuillage et le pot.
Voilà, si vous avez envie d’investiguer plus avant et de vous plonger dans l’étude de la conductivité ou l’humidité du sol, n’hésitez pas à venir m’en parler dans les commentaires.
5 ans ago ·
Bonjour,
En cherchant sur Internet, une formule pour calculer la température semble être la suivante
rawValue est la valeur en décimal
temperature = 0.00000003044 * Math.pow(rawValue, 3.0) – 0.00008038 * Math.pow(rawValue, 2.0) + rawValue * 0.1149 – 30.449999999999999
la formule est valable entre -10 degrés Celsius et + 55 degrés celsius
c’est surement les limites du capteur de température
5 ans ago ·
Bonjour,
Merci pour la formule qui m’a permis de faire d’autres recherches et de trouver ces liens vers du code qui intègre les formules pour calculer les différentes données du capteur :
https://forum.developer.parrot.com/t/origin-of-raw-temperature-conversion-formula/1395
https://github.com/sandeepmistry/node-flower-power/pull/8/commits/9dcb7e200a2f70e65d080417d7acfe48c82add75
Dommage qu’il faille calculer les valeurs lors de la lecture.
L’approche de Xiaomi pour son Flower Care est plus simple.
Didier.
4 ans ago ·
J’ai plusieurs flower power, dont 3 neufs (merci le fleuriste qui m’a vendu ça, et ne veut pas les reprendre, sachant bien que leur serveur est fermé dorénavant). Les anciens continuent de fonctionner sur l’app (sans le suivi des stats donc). Les neufs : argent perdu.
Je vois çà et là sur le web les solutions alternatives. Mais p****, il faut être informaticien ; je ne pige rien à ce que vous racontez, bon sang.
Existe-t-il des solutions « simples », compréhensibles pour une personne qui n’y connaît rien en informatique, pour connecter ces appareils ?
4 ans ago ·
Bonjour,
Je comprend votre frustration.
C’est tout le problème de la domotique qui repose sur les serveurs des fabricants.
Une fois fermés, les appareils deviennent inutilisables.
Pour répondre à votre question, il n’y a pas, à ma connaissance, d’autre app qui permette de synchroniser le Flower Power.
Didier.