logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 12-01-2017 18:11:47

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Utilisation de Gatttool (bluetooth LE) dans un script shell

Bonjour à tous,

Je suis équipé d'un raspberry pi qui tourne sous jessie, celui ci à le bluetooth. J'ai aussi une station météo (hector) qui fonctionne en bluetooth.

A ce jour je suis capable via gatttool de récupéré les info d'hector via le bluetooth LE:

root@raspberrypi:~#

gatttool -b @mac hector -I -t random


[@mac hector][LE]> connect
Attempting to connect to @mac hector
Connection successful
[@mac hector][LE]> char-read-uuid af51 # récupération du taux d'humidité dans l'air -> Valeur en hexadécimal, conversion en décimal puis divisé par 10 et ça me donne l'humidité
handle: 0x003c   value: 03 3a
[@mac hector][LE]> char-read-uuid 3c81 # récupération de la température en °C -> Idem que l'humidité
handle: 0x0034   value: 00 fa




En gros, j'ai un vivarium avec une espèce de phasme tropical que j'élève et qui nécessite un micro climat particulier.
Le RASP est équipé d'une carte interrupteur relais 8 canaux 5V -> 230V que je pilote grâce aux GPIO du RASP. Je suis donc en mesure de contrôler des résistances chauffante pour la température et aussi un brumisateur pour l'humidité de l'air.

Ma question; J'aimerais via un script SH qui se déclenchera via crontab, automatiser la récupération des valeurs température et humidité et les injecter dans des variables.
Après c'est relativement simple de traiter les variables et de déclencher ou non les résistances et brumisateur selon les mesures récupérées. Mais je suis complètement bloqué pour automatiser la connexion, la récupération des valeurs et les injecter dans les variable.
J'aimerais que ça soit automatique sans mon intervention.

En vous remerciant par avance pour votre aide !

Françoué

Edit à bendia : séparation commande et retour comme indiqué là Voir le tuto : Le code, ça pique moins les yeux en couleur wink

Hors ligne

#2 12-01-2017 20:34:30

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Salut smile

Si je pige bien, gatttool t'ouvre un shell directement sur ta station météo, et tu es donc obligé de taper les commande dans ce shell pour récupérer les infos ?

Edit :

Du coup, après quelques recherches, il semble que gattttool soit fournit par le paquet bluez, et il n'y a pas de page man hmm

Ceci-dit on a des infos avec

gatttool --help


Usage:
  gatttool [OPTION...]

Help Options:
  -h, --help                                Show help options
  --help-all                                Show all help options
  --help-gatt                               Show all GATT commands
  --help-params                             Show all Primary Services/Characteristics arguments
  --help-char-read-write                    Show all Characteristics Value/Descriptor Read/Write arguments

Application Options:
  -i, --adapter=hciX                        Specify local adapter interface
  -b, --device=MAC                          Specify remote Bluetooth address
  -t, --addr-type=[public | random]         Set LE address type. Default: public
  -m, --mtu=MTU                             Specify the MTU size
  -p, --psm=PSM                             Specify the PSM for GATT/ATT over BR/EDR
  -l, --sec-level=[low | medium | high]     Set security level. Default: low
  -I, --interactive                         Use interactive mode
 



gatttool --help-gatt


Usage:
  gatttool [OPTION...]

GATT commands
  --primary                                 Primary Service Discovery
  --characteristics                         Characteristics Discovery
  --char-read                               Characteristics Value/Descriptor Read
  --char-write                              Characteristics Value Write Without Response (Write Command)
  --char-write-req                          Characteristics Value Write (Write Request)
  --char-desc                               Characteristics Descriptor Discovery
  --listen                                  Listen for notifications and indications
  -I, --interactive                         Use interactive mode
 



Il me semble donc qu'en utilisant sans l'option I (interactive), tu devrais arrivé à tes fins genre

#!/bin/sh
gatttool -b @mac hector  -t random --char-read-uuid -a af51
gatttool -b @mac hector  -t random --char-read-uuid -a 3c81
 



Re-Edit : une solution en anglais là http://www.mathieupassenaud.fr/control- … h-scripts/ je corrige donc mon script


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#3 12-01-2017 22:56:43

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Hello !

Oui c'est bien ça, j'initialise la connexion sur la station météo via le Bluetooth LE et je dois taper à la main pour checker les infos que je veux.
PS: Bluez, j'ai essayé et c'est mort hmm
J'ai déjà check le "help"... et non la commande #

gatttool -b @mac hector  -t random --char-read-uuid -a af51


me redirige vers la page help -_-

Edit à toto :
Mis la commande root sous la balise Commande root de la fenêtre d'édition du forum pour que ce soit plus lisible par tous.

Hors ligne

#4 12-01-2017 22:58:34

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Et en faisant un bypass de l'option I, il n'en veut pas non plus et il me balance la page "help" hmm

Hors ligne

#5 13-01-2017 02:27:59

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Sinon ça marche aussi comme ça:

root@raspberrypi:~#

hcitool lecc --random E0:E5:CF:DE:F8:3B


Connection handle 64    
root@raspberrypi:~# bluetoothctl
[NEW] Device E0:E5:CF:DE:F8:3B hector          
[hector          ]# info
Device E0:E5:CF:DE:F8:3B
  Name: hector          
  Alias: hector          
  Paired: no
  Trusted: no
  Blocked: no
  Connected: yes
  LegacyPairing: no
[hector          ]

#

En gros je suis connecté mais je gratte encore pour trouver mes valeurs !

Edit à toto :
Mis la commande en Commande root du forum.

Hors ligne

#6 13-01-2017 03:09:35

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Trouvé !:

root@raspberrypi:~#

gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x003c


Characteristic value/descriptor: 02 f6





Donc là j'ai Characteristic value/descriptor: 02 f6 en retour de la commande. Maintenant il me faudrait un coup de pouce pour récupérer dans la variable uniquement 02f6 pour que ça donne:

$hum=02f6


Sans l'espace afin que je puisse traduire cette variable en décimal et la diviser par 10.. je pensais à truc du genre:

$var=02f6



à titre d'info ça donne -> 758 en décimal et je divise par 10. J'obtiens 75,8% d'humidité !

Je pensais à un truc comme ça:

var=$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x0034 | cut -cxx)



Merci d'avance pour vos retours !

Edit à toto :
Mis les balises du forum, etc...

Hors ligne

#7 13-01-2017 05:06:56

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Hello Françoué,

Pour le pourquoi du comment des balises du forum, voir le tuto qui le fait :
Voir le tuto : Le code, ça pique moins les yeux en couleur

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#8 13-01-2017 09:14:55

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Salut smile

Avec cut, j'aurais plutôt fait un truc du genre

var=$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x0034 | cut -d":" -f2)


Ça te permet de récupérer

 02 f6

Reste ensuite à virer les espaces en début de chaine et au milieu.

De ce fait, je ne suis pas certain que cut soit la commande la plus appropriée, peut-être sed ou awk feraient-il mieux l'affaire ?

Cependant, il me semble que bash et autres shells considères les retours des commandes comme des chaines de caractères, et non comme des valeur numérique. Pour ça, il faut utiliser bc, où tu galères un peu avec les flotants hmm

Du coup, un script shell est-il la meilleure solution pour faire ça ? Est-ce qu'utiliser le wrapper Python pour gatttool ne serait pas plus simple, au moins pour te renvoyer une valeur (que je garderais en pour mille perso), que tu peux ensuite gérer avec le shell pour commander tes broches GPIO ? Ceci-dit, il existe aussi un tas de modules python pour piloter ces mêmes broches. Si j'avais à le faire je ferrais tout en Python, qui te permettra aussi assez simplement de te faire une IHM, parce que les automates muets, je trouve ça compliqué à dépanner tongue

Faudra peut-être déplacer le sujet dans la section script ou programation bientôt wink

@smolski : il était déjà dans le premier message le tuto sur la coloration syntaxique, à moi le point choco big_smile


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#9 13-01-2017 09:29:53

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

C'est pô juste en édit du post, non, c'est pô juste ! tongue

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#10 13-01-2017 09:35:07

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

@smolski : il y est depuis hier soir woohoo.gif

Bon, sinon, j'ai trouvé pour faire en bash  (sans la coloration syntaxique, parce que le # au milieu de la commande, il aime pas fluxgeshi) wink

var=$((16#$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x003c | cut -d":" -f2 | sed 's/ //g')))



Edit : un poil d'explications quand même

Pour obtenir la valeur hexa, on utilise avec cut le délimiteur : ( option -d":") pour séparer le retour en 2 champs, et on récupère uniquement le deuxième champ avec l'option -d2

Pour obtenir la valeur hexa sans les espaces, on demande à sed de les remplacer par rien, donc de les supprimer

echo "02 f6" | sed 's/ //g'



Et enfin, on converti la chaine hexa en décimal

echo $((16#02f6))

758


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#11 13-01-2017 10:24:28

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

bendia : Le peuple aura ta peau !

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#12 13-01-2017 10:31:00

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

@smolski : bbbblllbbblll mwahaha.gif

Et aussi @Françoué, on veut des photos, ce fil étant peuplé de vertébrés, quelques arthropodes de plus y seront bienvenu big_smile

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#13 13-01-2017 16:04:32

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Hello,
Voilà le script, merci du coup de pouce ->

#!/bin/bash
var=$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x003c | cut -c34-35,37-38) #Je "découpe le résultat pour obtenir une chaine de type xxxx sans espace
echo $var #vérification de la valeur hexa au cas ou !
var=$((16#$var)) #Je converti en décimal
var=$(($var/10)) #Division /10
echo $var # Je vérifie une dernière fois c'est le bon résultat !

Par contre pas de virgule après la division !

Je vous enverrai une photo plus rendu du script final à venir smile

Hors ligne

#14 13-01-2017 16:17:33

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Françoué a écrit :

Par contre pas de virgule après la division !

Oui, il faut utiliser bc pour les virgules. Ou un truc (peut-être crado) du genre

res=$(python -c "print $var/10.0")


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#15 13-01-2017 16:35:31

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Je comfirme, impek wink

Hors ligne

#16 13-01-2017 18:26:02

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Bon bah c'est terminé ! voilà le script final >


#!/bin/bash
date >> histo.txt # je garde un historique et je le balance dans /var/www/ pour garder un oeil même si je suis pas chez moi
humax="85" #Comme je vous le disais c'est une espèce particulière donc en humidité max je dois pas trop monté au dessus de 85%
humini="75" # pas en dessous de 75%
hum=$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x003c | cut -c34-35,37-38) # ça vous connaissez !
hum=$((16#$hum))
hum=$(python -c "print $hum/10.0")
echo $hum % "d'humidité">> histo.txt # Je check l'humidité toujours dans l'historique
if [[ "$humini" > "$hum" ]] # Si l'humidité de l'air est inférieur à 75% je rentre dans la condition
then
        while [[ "$hum" < "$humax" ]] #un petit tant que -> l'humidité est inférieur à 85% je boucle
        do
                gpio write 0 1 #Déclenchement de l'humidificateur, je dis à la GPIO 0 de passer à 1. L'interrupteur relais passe à 1 donc ferme le circuit sur lequel le brumisateur est plugé
                echo "Déclenchement de l'humidificateur">>histo.txt #un petit coup dans l'historique pour surveiller !
                sleep 15 # Je fais une pause de 15s pour laisser le brumisateur tourner un peu
                hum=$(gatttool -t random -b E0:E5:CF:DE:F8:3B --char-read --handle 0x003c | cut -c34-35,37-38) #Je mesure à nouveau l'humidité et la redéfinie dans $hum
                hum=$((16#$hum))
                hum=$(python -c "print $hum/10.0")
                echo $hum % "d'humidité">> histo.txt
        done # Et si l'humidité est remonté au delà de 85% je quitte la boucle
else #Si l'humidité est supérieur à 75% il n'est pas nécessaire d'humidifier d'avantage
        echo "l'humidité est supérieur à 75%, fin du programme">>histo.txt
        exit
fi
gpio write 0 0 # Je coupe le circuit, le brumisateur s'éteint
echo "fin d'humidification, fin du programme">>histo.txt
exit



Et voilà, niveau historique ça donne ->

vendredi 13 janvier 2017, 18:06:42 (UTC+0100)
75.9 % d'humidité
l'humidité est supérieur à 75%, fin du programme
vendredi 13 janvier 2017, 18:07:36 (UTC+0100)
74.8 % d'humidité
Déclenchement de l'humidificateur
75.7 % d'humidité
Déclenchement de l'humidificateur
79.2 % d'humidité
Déclenchement de l'humidificateur
82.7 % d'humidité
Déclenchement de l'humidificateur
85.6 % d'humidité
fin d'humidification, fin du programme

Du coup je vois exactement ce qui se passe !

Et pour finir, il faut que le script bosse tout seul sans que j'ai besoin de l'actionner, j'ajoute une ligne au fichier /etc/crontab ->

*/5 *    * * *    root    /root/hum.sh

Je lui demande de se déclencher toutes les 5 minutes tous les jours.
Enfin le script est "intelligent" car je dois vaporiser les ronces histoire que les phasme puise boire un peu. C'est une "simulation" de la rosé du soir et du matin.
Donc l'humidité est relativement importante. Du coup bah le script ne se déclenche pas !

Hors ligne

#17 13-01-2017 18:45:09

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Voir le tuto : C'est résolu ! Bravo mais il faut l'indiquer dans l'titre. smile

J'ai mis de la coloration syntaxique autour de ton script. N'hésites pas à éditer pour voir comment on fait wink

Et je vais déplacer la discussion dans le forum relatif au scripts aussi

Reste que les photos tongue

Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#18 13-01-2017 20:46:49

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Pour les images, je les upload ou ?

Hors ligne

#19 13-01-2017 20:56:45

Françoué
Membre
Distrib. : Linux Jessie 8.0
Noyau : Linux raspberrypi 4.1.19-v7+
Inscription : 12-01-2017

Re : Utilisation de Gatttool (bluetooth LE) dans un script shell

Sinon j'ai mis les photos sur 800mon serveur, elle sont dispo ici -> http://176.129.173.15/BLE/

Il y a le rasp, les interrupteur relais, l'historique, l'app hector avec l'humidité, la photo du vivarium en général et 2 photos de phasme.

Il est beau ce phasme

Edit à bendia : une photo, mais elles sont balèzes tongue N'héistes pas à éditer pour voir comment on utilise la balise img wink

Hors ligne

Pied de page des forums