Détection de présence par beacon : partie 2

Dans l’article précédent https://easydomoticz.com/?p=3408 nous avions vu toute la partie préalable de la mise en place de détection de présence.

Voyons ici comment mettre en place la détection dans Domoticz.

Configurer le script

(Lisez les commentaires dans le script check_beacon_presence)

On peut adapter le niveau de log pour les tests et pour l’utilisation quotidienne en commentant/décommettant les lignes logLevel :
– Pour tester activez .DEBUG , le log de /var/log/check_beacon_presence.log est alors très bavard.

logLevel=logging.DEBUG
#logLevel=logging.CRITICAL
#logOutFilename='/var/log/check_beacon_presence.log'

– Ensuite passez en .CRITICAL en commentant la première ligne

#logLevel=logging.DEBUG
logLevel=logging.CRITICAL
logOutFilename='/var/log/check_beacon_presence.log'

Domoticz et les variables

Rendez vous dans Domoticz et ajoutez une variable texte par beacon à gérer.

variables

Je vous conseille d’acheter des beacons de couleur différente pour chaque membre de la famille puis de nommer vos variables soit par couleur ou par prénom du possesseur, ou un mix des deux si vous avez deux fois la même couleur.

Par exemple

variables-texte

Adaptation du script

Ouvrez le script

 sudo nano /usr/local/bin/check_beacon_presence.py

Adaptez la partie URL_DOMOTICZ si vous ne travaillez pas en localhost ou avec le port par défaut

URL_DOMOTICZ = 'http://localhost:8080/json.htm?type=command&param=updateuservariable&idx=PARAM_IDX&vname=PARAM_NAME&vtype=2&vvalue=PARAM_CMD'

 

Descendez dans la partie des beacons et configurez les vôtres  sous la forme suivante dans  TAG_DATA : [Nom_de_la_variable_domoticz,MacAddress,Timeout,0,idx,mode]

  • Nom_de_la_variable_domoticz: C’est le nom EXACT de la variable texte de Domoticz, attention aux majuscules/minuscules !
  • macAddress : la Mac adress de ce beacon.
  • Timeout est le temps qu’il faut pour que le beacon soit considéré en AWAY (parti). Si le beacon émets toutes les 3 à 8 secondes , un bon timeout est  15 seconds. Pour définir cela utilisez les valeurs données par test_beacon.py voir plus haut).
  • – 0 : pas touche.
  •  l’idx Domoticz de cette variable texte, c’est le nombre en face du nom de la variable.
  • mode : SWITCH_MODE = une mise a jour unique lorsque le statut change / REPEAT_MODE = mise à jour continuelle de l’état toutes les 3 secondes
TAG_DATA = [  
            ["Orange","Fb:14:78:38:18:5e",15,0,9,REPEAT_MODE],
            ["Vert_Papa","ff:ff:60:00:22:ae",15,0,7,REPEAT_MODE]
           ]

Second Test : Lançons le script à la main et voyons.

sudo python /usr/local/bin/check_beacon_presence.py

A l’écran des information s’affichent , le log se remplit à :

sudo more /var/log/check_beacon_presence.log
sudo python /usr/local/bin/check_beacon_presence.py
2016-09-23 12:33:26,274 - root - DEBUG - Ok hci0 interface Up n running !
2016-09-23 12:33:26,276 - root - DEBUG - Connect to bluetooth device 0
2016-09-23 12:33:31,282 - root - DEBUG - Tag Tag_Orange not seen since 20 sec => update absence
2016-09-23 12:33:31,284 - root - DEBUG - Tag Tag_Green not seen since 20 sec => update absence
2016-09-23 12:33:31,356 - requests.packages.urllib3.connectionpool - INFO - Starting new HTTP connection (1): localhost
2016-09-23 12:33:31,362 - requests.packages.urllib3.connectionpool - INFO - Starting new HTTP connection (1): localhost
2016-09-23 12:33:31,389 - requests.packages.urllib3.connectionpool - DEBUG - "GET /json.htm?type=command&param=updateuservariable&idx=7&vname=Tag_Green&vtype=2&vvalue=AWAY HTTP/1.1" 200 58
2016-09-23 12:33:31,394 - root - DEBUG -  <Thread(Thread-3, started daemon 1970148464)> -> <Response [200]>
2016-09-23 12:33:31,401 - requests.packages.urllib3.connectionpool - DEBUG - "GET /json.htm?type=command&param=updateuservariable&idx=6&vname=Tag_Orange&vtype=2&vvalue=AWAY HTTP/1.1" 200 58
2016-09-23 12:33:31,405 - root - DEBUG -  <Thread(Thread-2, started daemon 1978537072)> -> <Response [200]>

Vérifiez que vos variables texte sont mises à jour correctement en regardant leur contenu (AWAY ou HOME) et la date de mise à jour en fonction de ce que vous voyez passer à l’écran.

Repassez le debug à critical quand tout fonctionne et activons tout cela automatiquement en tant que service.

Installation du service

sudo wget https://raw.githubusercontent.com/jmleglise/mylittle-domoticz/master/Presence%20detection%20%28beacon%29/check_beacon_presence
sudo mv check_beacon_presence /etc/init.d/
sudo chmod 755 /etc/init.d/check_beacon_presence

Troisième test

Lancez le service manuellement :

sudo /etc/init.d/check_beacon_presence start

Vérifiez qu’il fonctionne par :

sudo /etc/init.d/check_beacon_presence status

On peut y utiliser les commandes : start, stop, restart, status

Si le service est bien lancé activons le au boot du Raspberry

Démarrage du service automatique

sudo update-rc.d check_beacon_presence defaults

Pour le supprimer du démarrage du Raspberry  :

sudo update-rc.d -f check_beacon_presence remove

Test final (avec le démarrage automatique activé)

sudo reboot
ps -ef | grep python

Vous devez voir un « check_beacon_presence.py » quelque part

Utilisation dans Domoticz

Vous avez vu que ce sont des uservariables texte qui passent de AWAY à HOME, vous pouvez donc utiliser tous les moyens offerts par Domoticz pour exploiter cela à votre convenance (Lua, Blocky, API JSON…)

Exemple Lua

script_variable_autoArmAlarm.lua

--Variable scripts receive 7 tables from Domoticz: 
-- otherdevices, otherdevices_lastupdate, otherdevices_svalues, otherdevices_idx, uservariables, uservariables_lastupdate and uservariablechanged
 
commandArray = {}
 
beaconHome=0
for variableName, variableValue in pairs(uservariables) do
    if string.sub(variableName,1,3)=="Tag" and variableValue ~= "AWAY" then
      beaconHome=beaconHome+1
    end
end
if otherdevices['Alarm'] == 'On' and beaconHome>=1 then   -- switch Off Alarm because 1 beacon come back Home
    table.insert (commandArray, { ['Alarm'] ='Off' } )
elseif otherdevices['Alarm'] == 'Off' and beaconHome==0 then  -- switch On Alarm because all beacon are away
    table.insert (commandArray, { ['Alarm'] ='On' } )
end
 
return commandArray

 

D’autres exemples : https://www.domoticz.com/forum/viewtopic.php?f=28&t=10640&start=100#p86310

Blocky

https://www.domoticz.com/forum/viewtopic.php?f=28&t=10640&start=140#p86725

Références

Le topic du forum :https://www.domoticz.com/forum/viewtopic.php?f=28&t=10640
Une page de référence pour les beacons ble : https://www.beaconzone.co.uk/allbeacons
https://wiki.tizen.org/wiki/Bluetooth
https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/pybluez/source-archive.zip => pybluez\examples\advanced\inquiry-with-rssi.py

Mémo d’autres commandes

Reset  de l’adapttateur bluetooth (hci0 dans cet exemple) :

sudo hciconfig hci0 down
sudo hciconfig hci0 up

Trouver une  MacAdress d’un beacon avec hcitool

pi@raspberrypi ~ $ whereis hcitool
hcitool: /usr/local/bin/hcitool
pi@raspberrypi ~ $ sudo hcitool lescan
LE Scan ...
FB:14:78:38:18:5E nut
FB:14:78:38:18:5E (unknown)

 

Voila vous pouvez maintenant détecter les arrivées/départs de tous les membres de la famille, faites en bon usage.

big-brother-is-watching-you1

 

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/
Posted in domoticz.

28 Comments

  1. Bonjour

    Merci pour ce super tuto.

    J’ai un petit pb avec la mise en place du service.

    pi@raspberrypi:~ $ sudo /etc/init.d/check_beacon_presence start
    [….] Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceFailed to start check_beacon_presence.service: Unit check_beacon_presence.service failed to load: No such file or directory.
    failed!

    Avez-vous une idée ?

    Merci de  votre aide.

  2. Bonsoir
    Une idée ?
    Oui
    Regardes la dernière ligne , elle dit « no such file » donc pas de fichier
    A mon avis tu as raté au moins ca du tuto

    sudo wget https://raw.githubusercontent.com/jmleglise/mylittle-domoticz/master/Presence%20detection%20%28beacon%29/check_beacon_presence
    sudo mv check_beacon_presence /etc/init.d/
    sudo chmod 755 /etc/init.d/check_beacon_presence

    Essaye et dis nous si c’est OK

  3. Merci pour votre réponse.

    J’ai bien fait cette étape du tuto

    pi@raspberrypi:~ $ sudo /etc/init.d/check_beacon_presence

    Usage: /etc/init.d/check_beacon_presence {start|stop|restart|force-reload|status}

     

    Je pensai que cela pouvais venir du fichier check_beacon_presence.py.

    Mais il est bien dans le repertoire /usr/local/bin/

  4. le fait qu’il dise

    Usage: /etc/init.d/check_beacon_presence {start|stop|restart|force-reload|status}

    est plutot bon signe
    fais

    sudo /etc/init.d/check_beacon_presence start

    pour voir

  5. Bonjour Patrice

    Merci pour ce fabuleux tuto .

    J’ai bien suivie les étapes une à une jusqu’au moment ou, problème :

    Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceFailed to start check_beacon_presence.service: Unit check_beacon_presence.service failed to load: No such file or directory.
    failed!

    le fichier est bien présent, les droits accordés mais comme notre ami « sjteddy » impossible de le lancer.

    Merci de toute aide apporté.

    Cordialement.

     

  6. Je me répond : ;-))

    Un simple reboot m’a permis de lancer le fameux « check_beacon ».

    Encore un énorme MERCI à Patrice pour ce superbe partage.

    Et une pierre de plus a Domoticz

  7. Bonjour,

    Merci pour ce super tuto que j’ai réussi à mettre en place mais mon nut 2 ne reste pas « éveillé », je dois appuyer longtemps sur le bouton de celui-ci pour le réveiller et là il est vu par mon PI 3, avez-vous rencontrer le problème ?

    Merci par avance
    Sylvain

  8. Bonjour,

    un grand merci pour ce tuto, qui devrait me faciliter la vie.
    Par contre j’ai le même soucis que Sylvain, mon nut 2 est visible uniquement lorsque j’appuie sur le bouton d’appairage, et cela durant 1 minute pile.
    Ai je raté une étape !?

     

    Merci d’avance pour votre aide, j’y suis presque mais pas encore.

  9. Bonsoir
    Je ne pense pas que tu ai raté qq chose, en ce qui me concerne le nut reste actif tout le temps.
    Est ce que c’est parce que je les ai reliés à mon/nos smartphone aussi via l’appli nut avec les jeux de clé de chacun/chacune ?

  10. Bonjour,

    merci pour ta réponse patrice, je viens d’appairer mon nut à mon smartphone, apparemment il répond présent à mon raspi depuis déjà 5 minutes, il semblerait que cela marche.
    Reste à voir combien de temps, et ce qu’il se passe si mon smartphone s’éloigne du nut.

    En tout cas merci pour ta réponse. Affaire à suivre…

  11. Bon, après plusieurs test, le problème semble être résolu.
    Meme si je coupe mon BT de mon smartphone, pas de soucis, le nut continue d’émettre pendant dèja 30minutes.
    Par contre j’ai un nouveau soucis  :/
    Impossible de lancer le script
    pi@raspberrypi:~$ sudo /etc/init.d/check_beacon_presence start
    [….] Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceJob for check_beacon_presence.service failed. See ‘systemctl status check_beacon_presence.service’ and ‘journalctl -xn’ for details.
    failed!

    Si quelqu’un a une idée…

  12. J’ai trouvé, pour ceux qui ont fait la même erreur que moi.
    j’avais la première ligne du script vide, et en 2ème ligne #! /bin/sh
    Suffit juste de supprimer la 1ère ligne vide et d’avoir le #! /bin/sh à la place.
    tout simplement…

  13. Bonjour à tous et merci pour ce tuto,

    J’ai réussi toutes les étapes avec un NUT mini (qui est vraiment petit soit dit en passant 😉

    Je reste bloqué sur le démarrage automatique du service.

    Le démarrage manuel fonctionne correctement :
    pi@raspberrypi:~$ sudo /etc/init.d/check_beacon_presence start
    [ ok ] Starting check_beacon_presence (via systemctl): check_beacon_presence.service.

    Tout ce passe bien lorsque je saisi
    sudo update-rc.d check_beacon_presence defaults

    Mais après le reboot, le service n’est pas listé dans ps et le status est « étrange »…
    pi@raspberrypi:~$ sudo /etc/init.d/check_beacon_presence status
    ● check_beacon_presence.service - LSB: This daemon manages the bluetooth low energy device detector : check_beacon_presence.py
    Loaded: loaded (/etc/init.d/check_beacon_presence)
    Active: active (exited) since Sat 2017-01-14 13:37:05 CET; 1min 16s ago
    Process: 317 ExecStart=/etc/init.d/check_beacon_presence start (code=exited, status=0/SUCCESS)

    Jan 14 13:37:05 raspberrypi systemd[1]: Started LSB: This daemon manages the bluetooth low energy device detector : check_beacon_presence.py.
    Jan 14 13:37:07 raspberrypi sudo[509]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/local/bin/hciconfig hci0 down
    Jan 14 13:37:07 raspberrypi sudo[509]: pam_unix(sudo:session): session opened for user root by (uid=0)
    Jan 14 13:37:07 raspberrypi sudo[509]: pam_unix(sudo:session): session closed for user root
    Jan 14 13:37:07 raspberrypi sudo[526]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/local/bin/hciconfig hci0 up
    Jan 14 13:37:07 raspberrypi sudo[526]: pam_unix(sudo:session): session opened for user root by (uid=0)
    Jan 14 13:37:07 raspberrypi sudo[526]: pam_unix(sudo:session): session closed for user root
    Jan 14 13:37:07 raspberrypi sudo[541]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/local/bin/hciconfig
    Jan 14 13:37:07 raspberrypi sudo[541]: pam_unix(sudo:session): session opened for user root by (uid=0)
    Jan 14 13:37:07 raspberrypi sudo[541]: pam_unix(sudo:session): session closed for user root

  14. Bonjour, merci pour ce tuto.

     

    J’ai un soucis lorsque j’arrive au second test, je tape  la commande « sudo python /usr/local/bin/check_beacon_presence.py »

     

    Dans la console j’ai se méssage qui tourne en boucle

    Exception in thread Thread-4:
    Traceback (most recent call last):
    File « /usr/lib/python2.7/threading.py », line 810, in __bootstrap_inner
    self.run()
    File « /usr/lib/python2.7/threading.py », line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File « /usr/local/bin/check_beacon_presence.py », line 126, in request_thread
    logging.critical(‘ %s Request Failed %s – %s’ % (threading.current_thread(), e, url) )
    TypeError: __str__ returned non-string (type Error)

     

    Avez vous une idée?

    Merci

  15. Bonjour,

    Merci pour ce super tuto par contre je me demande comment connaître le niveau de batterie du NUT ?

    Merci par avance.

    Sylvain

  16. Super tuto, très bien expliqué, merci !

     

    La mise en place se fait rapidement.

    Je me permets juste une petite correction au sujet du script de mise à jour des variables d’environnement : il semblerait que la nouvelle version mette à jour là variable avec le RSSI quand le beacon est détecté  (au lieu de mettre la variable à « HOME »). Ça devrait notamment permettre d’exploiter là puissance du signal (et donc la distance) du beacon !

     

    A+

  17. Bonjour et merci pour ce tuto.
    Mais en fait je galère un peu…

    Voici l’erreur que j’obtiens !!! (j’ai un Pi3)

    pi@raspberrypi:~$ sudo python /usr/local/bin/check_beacon_presence.py
    Traceback (most recent call last):
    File « /usr/local/bin/check_beacon_presence.py », line 77, in
    import bluetooth._bluetooth as bluez
    ImportError: No module named bluetooth._bluetooth

    Merci d’avance pour le retour

    Bruno

  18. Bonjour,
    Le script ne trouve pas de module bluetooth._bluetooth
    il faut voir dans les scripts check_beacon_presence.py de jmleglise ou il cherche ses modules

  19. Bonjour,

    Après avoir suivi le tuto avec attention et sans rien oublié, je me retrouve avec une erreur en démarrant le service

    /etc/init.d/check_beacon_presence: 7: /etc/init.d/check_beacon_presence: Syntax error: newline unexpected

    Avez vous la solution ??
    Merci d’avance

  20. Bonjour
    Oui ,
    Probablement tu a modifié le script sous Windows et donc changé les caracteres de fin de ligne de Linux
    Tu installe dos2unix et tu refais convertir tes fichiers par cet outil

  21. Bonjour,

    J’ai suivi le tuto et après avoir téléchargé le fichier (sudo wget https://raw.githubusercontent.com/jmleglise/mylittle-domoticz/master/Presence-detection-beacon/check_beacon_presence)
    J’ai mis comme demandé celui-ci dans le repertoire init.d
    J’ai fait le chmod 755
    Mais quand je lance l’exécutable j’ai cette erreur :
    sudo /etc/init.d/check_beacon_presence start
    [….] Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceFailed to start check_beacon_presence.service: Unit check_beacon_presence.service failed to load: No such file or directory.
    Quelqu’un peut-il m’aider ?
    A bientôt !

  22. Bonjour,

     

    J’ai suivi le tuto mais quand je lance check_beacon_presence en teste j’ai cette erreur :

    sudo /etc/init.d/check_beacon_presence start
    [….] Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceJob for check_beacon_presence.service failed. See ‘systemctl status check_beacon_presence.service’ and ‘journalctl -xn’ for details.
    failed!

     

    Quelqu’un peut-il m’aider ?

    A bientôt

  23. Bonjour
    A mon avis tu as du rater la parie « Installation du service » et en particulier

    sudo mv check_beacon_presence /etc/init.d/
    sudo chmod 755 /etc/init.d/check_beacon_presence

    Puis cela
    Lancez le service manuellement :

    sudo /etc/init.d/check_beacon_presence start

    Vérifiez qu’il fonctionne par :

    sudo /etc/init.d/check_beacon_presence status

    On peut y utiliser les commandes : start, stop, restart, status

    Si le service est bien lancé activons le au boot du Raspberry

    Relance tout ça et dis nous si c’est Ok pour toi

  24. Bonjour,

    J’ai mis à jour mon système il y a un moment sur la base de ce tuto (très bien expliqué, merci !).
    Par contre, la localisation de mon appartement fait que l’on doit le contourner avant d’y rentrer. Du coup, la détection passe du statut « activé » à « désactivé » puis encore à « activé », le tout en environ 15 secondes.

    Auriez-vous une idée sur la façon de contourner ce problème ?

    Merci !

  25. Bonjour
    J’ai bien du soucis ma config raspbian strech n’accepte pas ma commande :
    pi@domoticz:~ $ sudo /etc/init.d/check_beacon_presence start
    [….] Starting check_beacon_presence (via systemctl): check_beacon_presence.serviceFailed to start check_beacon_presence.service: Unit check_beacon_presence.service is not loaded properly: Invalid argument.
    See system logs and ‘systemctl status check_beacon_presence.service’ for details.
    failed!
    Et dans systemctl status:
    pi@domoticz:~ $ systemctl status check_beacon_presence.service
    ● check_beacon_presence.service
    Loaded: error (Reason: Invalid argument)
    Active: inactive (dead)

    juil. 09 17:40:29 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:10] Unknown section ‘Installer’. Ignoring.
    juil. 09 17:40:29 domoticz systemd[1]: check_beacon_presence.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
    juil. 09 17:40:29 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:1] Unknown section ‘Unité’. Ignoring.
    juil. 09 17:40:29 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:5] Unknown section ‘Un service’. Ignoring.
    juil. 09 17:40:29 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:10] Unknown section ‘Installer’. Ignoring.
    juil. 09 17:40:29 domoticz systemd[1]: check_beacon_presence.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
    juil. 09 17:43:07 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:1] Unknown section ‘Unité’. Ignoring.
    juil. 09 17:43:07 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:5] Unknown section ‘Un service’. Ignoring.
    juil. 09 17:43:07 domoticz systemd[1]: [/lib/systemd/system/check_beacon_presence.service:10] Unknown section ‘Installer’. Ignoring.
    juil. 09 17:43:07 domoticz systemd[1]: check_beacon_presence.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
    Pourquoi ?
    Merci

  26. Bonjour
    C’est l’installation du service depuis le github qui à foiré, reprends à ce niveau
    Bon courage

Comments are closed.