Mes passions, le boulots, mes coups de gueule...




Flower Power de Parrot : Récupérer les données du capteur sur un Raspberry Pi avec gatttool

Catégories : Domotique, Geek, Informatique, Raspberry Pi · par 3 Jan 2019

Introduction

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

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.

Documentation de Parrot

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…

Identification du périphérique BLE

La documentation nous indique de le Flower Power a une MAC address qui commence toujours par 90:03:b7:xx:xx:xx .

UUID des différents services

La liste des UUID normalisés est disponible à cette adresse : https://www.bluetooth.com/specifications/gatt/characteristics

Batterie

  • UUID 0x2A19

Date et heure

  • UUID 0xFD01

La date et l’heure sont codées sur 32 bits en little endian.

Données d’environnement

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.

LED

  • UUID 0xFA07

Pour allumer ou éteindre la LED, il faut écrire 1 ou 0 dans le UUID 0xFA07.

Déplacement

  • UUID 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.

Connexion au Flower Power

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

Déterminer la MAC address du Flower Power

$ 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.

Utilisation de gatttool

Afficher la liste des handles

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.

Lire les handles

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 %

Little endian

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.

Étude des données

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 » .

Température

Relevés

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.

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).

Formule

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

Ensoleillement

Relevés

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) :

Formule

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.

Humidité du sol et engrais

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.

Température du sol

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…

Script

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

Conclusion

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.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.