Page 1 sur 9

[TUTO] Scanner Bluetooth (BLE ou non)

Publié : 12 mars 2017, 18:26
par diving91
Hello,

A ce jour il existe bien sûr le plugin BLEA, mais pour ceux (comme moi) qui n'ont pas l'utilité de la totalité de ce que fait le plugin et qui se contentent de scanner la présence d'une personne ou d'un objet via Bluetooth (et qui veulent aussi comprendre un peu comment cela fonctionne), voici un script pour Raspberry PI:

https://github.com/diving91/Bluetooth-scanner

Il a l'avantage de pouvoir tourner sur le même Hardware que Jeedom ou bien sur un autres Hardware (Raspbeyy Pi) qui possède un adaptateur Bluetooth. Dans les deux cas, le script communique avec Jeedom par son API http.

Le script vous guide au démarrage pour configurer les devices a scanner. (soit des devices de type Smartphone, soit des devices BT-LE de type itag)

Ensuite, tout est affaire de widgets et de scenario pour piloter des automatismes en fonction de la présence ou non des devices qui sont scannées

diving91

Re: [TUTO] Scanner Bluetooth

Publié : 15 mars 2017, 10:56
par DjSony971
Salut @diving91,

Super dev, Merci.

J'ai testé sur mon pi3 avec le bluetooth intégré et mon Iphone. J'ai du faire une petite modification sur ton script pour que ça passe ça passe sur pi3. J'ai supprimer le test sur la liste des périphériques usb.

Par contre je ne comprend pas pourquoi tu utilises la commande scan au lieu de l2ping sachant que tu as les adresses mac des périphériques recherchés.

En plus, en faisant des tests chez moi je me suis rendu compte qu'avec la commande scan je devais avoir le téléphone à moins d'un mètres du pi3 pour qu'il soit détecté alors que le l2ping me permet de faire une détection jusqu'à 10m.

Rony

Re: [TUTO] Scanner Bluetooth

Publié : 15 mars 2017, 10:56
par DjSony971
Salut @diving91,

Super dev, Merci.

J'ai testé sur mon pi3 avec le bluetooth intégré et mon Iphone. J'ai du faire une petite modification sur ton script pour que ça passe ça passe sur pi3. J'ai supprimer le test sur la liste des périphériques usb.

Par contre je ne comprend pas pourquoi tu utilises la commande scan au lieu de l2ping sachant que tu as les adresses mac des périphériques recherchés.

En plus, en faisant des tests chez moi je me suis rendu compte qu'avec la commande scan je devais avoir le téléphone à moins d'un mètres du pi3 pour qu'il soit détecté alors que le l2ping me permet de faire une détection jusqu'à 10m.

Rony

Re: [TUTO] Scanner Bluetooth

Publié : 15 mars 2017, 23:23
par diving91
Bonsoir,

Je n'ai pas de PI3 pour tester - Pourrais tu partager tes modifs pour PI3?
sinon entre l2ping et scan, il y a plusieurs méthodes possibles avec des avantages et inconvénients:

chez moi avec un dongle Orico sur RPI2, la portée est très bonne (largement plus de 10m, y compris entre 2 étages d'un pavillon). Je ne constate aucune différence de ce côté entre scan et l2ping.

Je pense que scan (ou lescan) est moins consommateur en CPU/mémoire qu'un ping - mais je n'ai pas fait de mesure

l2ping envoi une requête L2CAP qui offre l'avantage que ça fonctionne aussi sur un device qui n'est pas en mode détectable. Pour l'instant je fais mes essais avec un Samsung S5 mais c'est en attendant d'avoir mes iTags (https://goo.gl/KoQUb3) Ce sont des devices bluetooth LE avec de l'advertisement - donc pas de soucis d'avoir son device détectable .... ce qui a mes yeux diminue l'avantage du l2ping

par ailleurs (j'ai lu, je n'en suis donc pas sûr) qu'un l2ping demande au device s'il veux s'appairer ... consommateur et inutile dans mon cas d'usage.

une alternative interessante par contre:
au lieu d'un hcitool -i hci0 scan serait hcitool -i hci0 name device_bdaddr (la mac address du device)
cette fonction réponds avec le nom du device si elle le trouve - et rien si elle ne le trouve pas.

le code source donne une idée de ce qui est derrière ces commandes https://git.kernel.org/pub/scm/bluetoot ... 942bd316e6

line 521: hcitool scan - ca fait un inquiry , device-open, read-remote-name, et d'autre trucs
line 801: hcitool name - ca semble bien plus léger avec hci get route, device-open, read remote name

il faudrait expérimenter les deux méthodes - mais je pense que c'est plus léger dans tous les cas qu'un l2ping.
L'avantage "unique" (a confirmer ?) d'un l2ping est de détecter les devices types smartphone qui ne s'annoncent pas - c'est surement ton cas avec iPhone.

Par contre, je n'explique pas pourquoi ta distance de détection entre les 2 méthodes varie autant. je ne n'observe pas cela du tout avec mon RPI2 et dongle Orico

diving

Re: [TUTO] Scanner Bluetooth

Publié : 16 mars 2017, 16:42
par DjSony971
Merci, pour cette réponse très complète ;) .

Je vais utilisé la commande name qui semble mieux fonctionner dans mon cas. Effectivement la commande l2ping fait une tentative de connexion en bluetooth avec rejet automatique.

Je rejoins ton avis sur le fait que mon problème viens probablement de l’implémentation du bluetooth sur iPhone. Malheureusement, je n'ai que des produits Apple pour faire le test chez moi.

Code : Tout sélectionner

root@jeedom:~/Bluetooth-scanner# hcitool -i hci0 scan
Scanning ...
root@jeedom:~/Bluetooth-scanner# hcitool -i hci0 name 90:60:F1:3B:**:**
iPhone de Rony
Pour l'adaptation de ton script sur py3, j'ai juste mis en commentaire les lignes pour tester la présence d'un contrôleur bluetooth usb ( puisqu'il n'est pas en usb sur le py3)

Code : Tout sélectionner

+               //exec("sudo lsusb | grep Bluetooth",$r);
+               //if (empty($r)) {die("ERROR, no bluetooth adapter found: You need to install an adapter\n");}

Re: [TUTO] Scanner Bluetooth

Publié : 17 mars 2017, 00:18
par diving91
ok, je ferai une modif pour detecter si PI2 ou PI3 de facon automatique

Re: [TUTO] Scanner Bluetooth

Publié : 18 mars 2017, 23:15
par diving91
Je viens de déposer une nouvelle version a côté de l'ancienne:
- Doit fonctionner sur RPI 3 et PI zero W
- Scan avec hcitool -i adapter name BTaddr (au lieu de hcitool -i adapter scan)
- Les iTags ne fonctionnent pas correctement - ils s’éteignent dès qu'ils sont hors de portée de l'antenne (donc inutilisable pour faire de la détection de présence) - Cette nouvelle version est donc restreinte a des téléphones

https://github.com/diving91/Bluetooth-s ... daemon.php

je ferai des tests avec des mini nut pour adapter à nouveau le script a des devices de ce type (Bluetooth LE)

Re: [TUTO] Scanner Bluetooth

Publié : 19 mars 2017, 23:09
par mbuffat69
Bonsoir @diving91

je viens d'installer et tester ta derniere version sur orange PI avec jeedom.
J'ai détecté un problème dans BTdaemon.php (et dans BLEdaemon.php)
lors du test de la connexion bluetooth
En effet la commande hciconfig hci0 renvoie
UP RUNNING PSCAN
et non
UP RUNNING
J'ai donc du modifier le script php BTdaemon.php lors du test comme ci-dessous

Code : Tout sélectionner

....
if (@trim($r[2]) != "UP RUNNING PSCAN") {die("ERROR $r[2] : $adapter adapter not running, use: sudo hciconfig $adapter up\n");}
...
après cela cela fonctionne sans problème sous orange pi

Re: [TUTO] Scanner Bluetooth

Publié : 21 mars 2017, 23:43
par diving91
Bonsoir,

Merci.
C'est corrigé dans BTdaemon.php sur le github https://goo.gl/8r4RGM

diving91

Re: [TUTO] Scanner Bluetooth

Publié : 26 mars 2017, 22:02
par mbuffat69
Bonsoir
j'utilise le pluging pour une détection de présence avec mon téléphone (samsung note 4).
Cela fonctionne correctement, mais je me suis aperçu que le plugin détectait de temps en temps une absence
(alors que le téléphone était dans la maison), et moins d'une minute après détectait a nouveau une présence.
Il semble que le téléphone ne réponde pas de temps en temps à une requête hcitool !
Pour pallier ce problème j'ai introduit un compteur dans BTdaemon.php pour ne déclarer le téléphone
déconnecter qu'au bout de maxcount (ici 3) requêtes hcitool.
Voila la modification du code ci-dessous, pour ceux qui ont le même problème que moi

Code : Tout sélectionner


....
        private $_maxcount = 3;         // max count before device is set inactive
...

					$x = exec("sudo $this->_hcitool -i $this->_adapter name $key");
                                        if (empty($x) and $device['state'] == true) {
                                            $this->log("count:".$device['count']."\n");
                                            $this->_tags[$key]['count']--;
                                            if ($device['count'] <= 0) {
						  $this->callJedoomUrl($device['off']);
						  $this->_tags[$key]['state'] = false;
						  $this->dbg("Inactive Tag found: $key\n");
                                                  $this->log("$key inactive\n");
                                                  $this->_tags[$key]['count']=$this->_maxcount; 
                                            }
...
...
		foreach ($config['TAGS'] as $tag) {
			$tagData = explode(",",$tag);
			$this->_tags[$tagData[0]] = array("on" => $tagData[1], "off" => $tagData[2],"state" => false, "count"=> 3);
....

Re: [TUTO] Scanner Bluetooth

Publié : 02 avr. 2017, 19:24
par diving91
Bonjour,

Merci pour cette modif. J'ai aussi parfois quelques trous dans la détection du device.

Je viens de pousser une modification sur le github pour BTdaemon.php
Au lieu de mettre un compteur comme dans ta proposition, j'ai mis un timeout en secondes (2minutes par défaut dans le fichier)
-> variable $_timeOut

L'avantage est de pouvoir mettre des temps plus long (ex 5minutes) et aussi pour être indépendant du temps du scan hcitool.
Autre avantage, cela ne surcharge pas l'array $_tags avec une entrée supplémentaire

Info: je pense avoir une piste pour faire cohabiter à la fois des smartphones et des tags de type mini nut (Bluetooth LE)
J'en ai un en commande, une fois le code OK, je le pousserai sur le github

diving

Re: [TUTO] Scanner Bluetooth

Publié : 04 avr. 2017, 12:39
par mbuffat69
Bonjour
je viens de tester ta dernière version et effectivement ta solution fonctionne et est plus propre !-)
Je suis aussi intéressé par la cohabitation ble téléphone
Merci

Re: [TUTO] Scanner Bluetooth

Publié : 06 avr. 2017, 13:58
par diving91
Petite modification (amélioration) sur le github pour éviter la répétition des commandes On vers jeedom dans la période transitoire du device qui sort de la portée de l'antenne Bluetooth

ligne 94:

Code : Tout sélectionner

-					else if (!empty($x) and $device['state'] != 1) {
a remplacer par

Code : Tout sélectionner

+					else if (!empty($x) and $device['state'] == 0) {

Re: [TUTO] Scanner Bluetooth

Publié : 06 avr. 2017, 17:04
par mbuffat69
Une suggestion

mettre par defaut l'etat du device à 1 (present) au lieu de 0, ce qui permet au démarrage une mise ajour du widget jeedom.
Sinon il faut attendre la détection du device pour la mise jour du widget

Encore merci pour le script

Re: [TUTO] Scanner Bluetooth

Publié : 29 avr. 2017, 01:13
par diving91
mbuffat69 a écrit :Une suggestion

mettre par defaut l'etat du device à 1 (present) au lieu de 0, ce qui permet au démarrage une mise ajour du widget jeedom.
Sinon il faut attendre la détection du device pour la mise jour du widget

Encore merci pour le script
La détection du device se fait dans les 10secondes max - je ne suis pas sûr de l’intérêt donc.
Par contre l'avantage d'avoir l’état par défaut à absent est de vérifier rapidement que le daemon tourne correctement

Re: [TUTO] Scanner Bluetooth

Publié : 29 avr. 2017, 01:23
par diving91
Après une longue attente avant de recevoir mon Nut Mini, je viens de pousser une mise a jour fonctionnelle pour des tag BLE.
Cela fonctionne bien avec des Nut mini.
Ça ne fonctionne pas avec des iTag - non pas du fait du script mais lié au fait que ces tags s’éteignent quand ils sont non connectés et ne font pas d'advertisement quand ils sont connectés. C'est inutilisable pour détecter de la présence.

Pour les Nut mini, il faut vérifier à l'usage la durée de vie de la batterie en advertisement permanent sans qu'il soient connectés.

J'ai du augmenter le timeout avant de les considérer comme 'absent' car ils ont tendance a ne plus envoyer d'advertisement de temps en temps.

Il faut refaire la config du fichier BT.ini (à la main ou avec php BTdaemon.php conf) pour prendre en compte le BLE.
à la main il faut ajouter ,0 (non BLE) ou ,1 (BLE) à la fin de la ligne de chaque tags.

C'est fonctionnel chez moi - si vous pouviez tester sur d'autres config, ce serait cool.

diving

Re: [TUTO] Scanner Bluetooth (BLE ou non)

Publié : 30 avr. 2017, 15:54
par RylicR
Bonjour,

Désolé de cette question qui parait certainement bête, mais je ne sais pas comment installer un script GitHub sur Jeedom? Il faut passer par Jeedom ou directement sur le Pi3 en SSH?

Merci,
Cyril.

Re: [TUTO] Scanner Bluetooth (BLE ou non)

Publié : 30 avr. 2017, 16:58
par diving91
RylicR a écrit :Bonjour,

Désolé de cette question qui parait certainement bête, mais je ne sais pas comment installer un script GitHub sur Jeedom? Il faut passer par Jeedom ou directement sur le Pi3 en SSH?

Merci,
Cyril.
Oui avec git /ssh c'est plus simple.
si tu n'as pas git, en ssh il faut faire un wget https://github.com/diving91/Bluetooth-s ... master.zip
qu'il faut ensuite unzipper (apt-get install unzip).
puis en ssh tu lances php BTdaemon.php

Re: [TUTO] Scanner Bluetooth (BLE ou non)

Publié : 30 avr. 2017, 17:10
par RylicR
Merci, j'ai réussi en bidouillant un peu haha. J'ai fini le script de configuration, maintenant je cherche comment retrouver la commande "présent" et "absent" dans Jeedom ;)

Re: [TUTO] Scanner Bluetooth (BLE ou non)

Publié : 30 avr. 2017, 17:27
par RylicR
J'ai un problème après la configuration du script, je reçois des lignes "Set scan parameters failed: Input/output error
grep: erreur d'écriture: Relais brisé (pipe)", d'ou vient le problème?