mercredi 8 mars 2017

Domotique: Présence et Localisation

Comme vous l'avez compris, j'utilise Jeedom pour ma domotique mais la problématique que je vais expliquer dans cet article est générale quand on veut faire de détection de présence d'une personne connue avec notre domotique (je précise "connue" parce que pour de la détection de présence d’intrus/inconnu, c'est presque plus simple et cela reste du domaine de l'alarme ;-).

Il y a plusieurs solutions en fait que j'ai déjà investigué et expérimenté. Et finalement, la conclusion est simple... il faut considérer plusieurs technologies et de les intégrer ensemble pour un meilleur résultat. (ex: bluetooth + wifi + geo-fencing)

Dans Jeedom, on a plusieurs outils pour intégrer. On peut utiliser des scripts, des scénarios ou des plugins.


Les scripts :
     - Cela permet surtout d'avoir des fonctions unitaires bas niveau proche du système où l'on peut rapidement intégrer dans nos scénarios. Cela reste compliqué dans certains cas pour les droits d'accès mais cela permet de ne pas avoir de limite et on trouve beaucoup de chose sur internet à base de script bash, python, php, perl, etc...




Les scénarios:
    - Cela permet finalement de faire le lien avec les objets/script/plugin déclarer dans Jeedom pour faire des actions spécifiques et c'est un des points forts de Jeedom. On peut gérer des variables, déclencher des actions en fonction de changement d'état ou en fonction d'une expression cron pour déclencher de manière régulière par minutes, jour, semaine, etc..


Les Plugins:
    -  Point fort aussi ;-), Cela permet d'avoir des fonctions très spécifiques pour intégrer les objets et aussi pour faciliter certains traitement qui serait aussi compliquer par un simple scénario.




Donc pour commencer, la localisation:
      J'avais donc utilisé pour commencer des plugins comme "geoloc" ou "geoloc_ios".


Mais la conclusion était que cela pouvais fonctionner mais cela me posait des problèmes de consommations de batteries mêmes en réduisant la fréquence de rafraichissement, dommage :-(.
De plus sur iOS, c'était dépendant du iCloud d'Apple qui change ses APIs régulièrement :-(. Sur Android, il faudrait réessayer surement, on peut peut être réduire ou mieux gérer la consommation de la batterie mais je ne suis pas le seul à avoir constater des problèmes de consommation de batterie et cela sur tout les OS.

J'ai donc découvert le "geo-fencing", le geo-fencing est à l'origine fait pour le marketing geolocalisé mais on peut aussi l'utiliser pour nous ;-).
Le principe est que l'on défini une zone et en fonction de la sortie ou l'entrée dans cette zone le téléphone prend la décision de faire une action.
Dans notre cas, avec Jeedom, on va envoyer une commande HTTP à Jeedom à chaque fois que l'on rentre ou sort d'une zone.
J'ai expérimenté surtout sur iOS mais je pense que sur Android on a la même chose (je ferais un update de l'article par la suite ;-).
Donc pour iOS, j'utilise "Locative" (https://itunes.apple.com/fr/app/locative/id725198453?mt=8)





Mais il faut installer l'app sur chaque téléphone.
J'ai donc créé une zone autour de chez moi et de mon boulot ainsi que celui de ma femme, ainsi on peux savoir quand ma femme ou moi-même arrivons ou partons de la maison ou quand on part ou arrive du boulot. Ainsi, on peut diriger un scénario ou un plugin avec une commande HTTP/HTTPS vers Jeedom.

Dans mon cas, j'ai envoyé une commande à mon plugin présence :



Pour atteindre un plugin, l'url est de ce type en http ou https (conseillé mais besoin d'avoir un certificat SSL sur votre Jeedom):
https://11.222.33.444/core/api/jeeApi.php?apikey=kdjflsdkfghskliksjgklsj&type=cmd&id=158

On trouve l'URL dans le plugin "Présence" dans votre Jeedom que vous aurait installé.

Il faut choisir la roue cranté (entouré d'un carré rouge dans mon screenshot) pour la personne ou l'objet que l'on track:


puis choisir le "mode" que l'on veut sélectionner par la roue cranté qui va bien (sur cette exemple, dans la case rouge, je veux le cas où ma femme est "présent") :


puis il faudra ensuite récupérer la valeur de l'url comme j'ai entouré en rouge sur mon screenshot:



 Ainsi vous allez pouvoir demander à Locative d'envoyer la bonne URL pour commander le plugin "Présence" en fonction si vous sortez ou entrez dans une zone.

Petite astuce: j'ai finalement défini  une zone pour gérer l'arrivé à la maison et une zone pour gérer le départ de la maison. Pourquoi ? pour éviter les variations de la position GPS et ainsi ne pas avoir de mauvais effets de bords avec les notifications (j'utilise pushbullet dans mon cas).


Donc la zone de départ (rayon de 200m) est plus grande que la zone d'arrivée (rayon de 50m). Ainsi quand vous êtes à la maison avec une mauvaise reception GPS, le système ne va pas être sensible au faite que vous pouvez être localisé à plus de 100 mètres de chez vous à cause de la triangulation GSM ;-). Je fais ainsi depuis plusieurs mois, et j'en suis super content.

Pour gérer la présence, vous pouvez aussi complémentez comme je le disais avec le wifi:
Dans ce cas, vous devez faire attention au fait que le téléphone ou autre appareil peut se mettre en veille voir même s'éteindre et donc le wifi peut disparaitre même si la personne est toujours présente.
On peut contourner en regardant cela que dans certaines plages horaires ou en notifiant qu'une fois par période longue de plusieurs heures. Vous pouvez aussi le jumeler à un capteur de présence/mouvement et/ou un capteur d'ouverture de porte, mais le scénario est de plus en plus complexe et j'ai finalement choisi le geo-fencing parce que pas assez fiable finalement (par exemple: quelqu'un peut couper son wifi et là, c'est le drame !!!)

Si vous ne pouvez pas utiliser le GPS ou le wifi, comme pour un chien ou un gosse qui n'a pas encore de mobile ;-), il y a aussi le bluetooth mais il faudra investir dans une clé bluetooth pour votre raspberry pi, comme celui-ci: Mini-USB-Bluetooth-V4



Dans mon cas, j'ai commencé d'experimenter le bluetooth avec mes téléphones mais cela n'était pas vraiment mon besoin, mais voici le script que j'utilise pour le Bluetooth que j'appel ainsi dans Jeedom avec la mac adresse en paramètre, exemple: presenceBT.py 11:22:33:44:55:66


#!/usr/bin/python

# need to install that previously:
# sudo apt-get install bluetooth bluez bluez-utils bluez-alsa
# sudo apt-get install python-bluez


import bluetooth
import time
import sys

for arg in sys.argv:
    #TO GET LAST PARAMETER AS MAC ADDRESS of BLUETOOTH DEVICE TO CHECK PRESENCE
    BTaddress_mac = arg
    
result = bluetooth.lookup_name(BTaddress_mac, timeout=5)
if (result != None):
    print "1"
else:
    print "0"

Regardez bien mes commentaires au début du script pour voir ce que vous devez installer avant toutes choses en terme de librairies linux.

Et donc si on n'a pas de téléphone, il y a les tags, j'ai donc testé les iTags que l'on peut trouver ici: iTag

Pour cela, on a un nouveau plugin Jeedom qui est super ! c'est "BLEA" :




Ce plugin permet d'avoir la présence mais on peut aussi aller plus loin jusqu'à faire de la triangulation en rajoutant des antennes bluetooth, c'est énorme ;-). Je vous propose d'aller voir les tutos du développeur sur son propre blog ;-): 
et

Donc voilà, vous avez une vue d'ensemble de mon expérience sur le sujet.






12 commentaires :

  1. Bonsoir,

    Merci pour la présentation de la geolocalisation. J'ai essayé de suivre votre démarche avec l'utilisation de "Locative" mais je rencontre un pb avec le "Custom Location ID" qui remonte et qui me bloque l'alerte avec l'évènement: "Aucune commande correspondant à l'id : ....". Pourriez-vous m'indiquer ce que l'on doit mettre dans ce pavé?

    Merci d'avance.

    RépondreSupprimer
    Réponses
    1. Bonsoir Jacky,
      Le "Custom Location ID" est juste un titre, moi j'ai mis "Home - arrival" par exemple, c'est la zone de détection quand j'arrive chez moi dans mon cas.
      Ensuite, j'ai activé et rempli le POST "Trigger on Arrival" dans mon cas par l'adresse HTTP jeedom qui va bien du genre: http ou https://VOTRE_IP:VOTRE_PORT/core/api/jeeApi.php.apikey=VOTRE_CLE_API_JEEDOM&type&id=ID_DE_VOTRE_MODE_DE_PRESENCE.
      Je conseil de remplir un seul trigger par zone ("on Arrival" ou "On Departure") pour éviter les problèmes de précisions GPS.
      Je conseil de le faire en post si possible
      J'espère que cela vous aidera ;-)
      A+
      Bozo

      Supprimer
    2. Bonjour,
      j'ai installé Locative sur Iphone et Présence sur Jeedom.
      Jusque là aucun pb.
      Un trigger id "arrivée" pour arrivée et un trigger id "départ" pour départ, les deux en post. Quant je copie le trigger on arrival (validé) https://id_jeedom:port/api_key_id_cd dans la page setting global http setting url :bet que j'envoir test-request , c'est OK dans Jeedom je passe à présent ou absent suivant la valeur de la cmd envoyée par l'URL du test request . Donc tout marche SAUF que je peux entrer et sortir de la zone rien n'est envoyé par Locative dans ce cas. Il semnblerait que Locative ne réagisse plus ?

      Supprimer
    3. Bonjour,
      En fait, je n'ai pas rencontré ce problème :-( et j'ai l'impression que vous avez globalement bien compris le principe.
      Mais je vais essayer de poser quelques questions pour aider:
      Est ce bien en "POST" ? c'est en bleu devant l'URL... j'ai vu que dans l'exemple du store d'Apple, c'est "GET". Cela peut porter à confusion.
      Ensuite, il faudrait vérifier dans la conf GPS/localisation, si cette application est bien autorisé, sinon cela ne pourra pas marcher... de plus, il faut la mettre en "toujours" pour que le geofencing fonctionne.
      Bon courage






      Supprimer
  2. Bonjour,
    Oui avant de poster j'avais testé get et post sur la page setting de l'appli qui permet de tester ses url.
    J'ai bien sur vérifié dans règlages que l'appli avait
    position: toujours
    notifications: autoriser
    dans le centre de notif
    son oui
    patille sur l'icone oui
    affiché sur l'écran vérouillé oui
    la totale quoi.
    Avec l'api key il n'y a pas besoin d'HTTP authentification (d'ailleurs quand je colle l'url de la commande dans la page Setting global http settings URL et Send Test-request elle passe bien dans Jeedom.
    Non tout est bien configuré mais ce que je trouve bizarre c'est que l'appli devrait me notifier On Succes et On failure puisque j'ai validé les deux option et aucune notif sur l'appli.
    D'autre part j'ai aussi fait un test en changant mon adresse IP (qui est fixe) dans send test request et là aucune notif je devrais pourtant avoir une notif d'échec puisque l'adresse IP entrée est fausse !! Je suis sous IOS 10.3.3
    Si l'appli fonctionne chez vous et pas chez moi c'est a manger son chapeau. Quelle différence de config avons nous?
    Une piste que je vais explorer je suis en HTTPS avec un port autre que 443 parce que j'ai plusieurs serveurs en HTTPS. mais je l'indique bien dans l'adresse de l'event: https://monIp:7443/core/etc etc , je vais essayer d'ouvrir pour test le port 80 en HTTP et le rediriger sur le port 80 du Jeedom. Je ne vois que cette possibilité
    En tout cas merci d'avoir pris le temps de me répondre c'est sympa.

    RépondreSupprimer
    Réponses
    1. Bonjour,
      ah oui.. c'est chaud, l'appli a peut être un problème avec le HTTPS, je suis en HTTP à ce jour (même si c'est pas bien :-( parce que j'ai eu pleins de problèmes avec HTTPS par le passé :-( comme avec IFTT par exemple quand on utilise un certificat let's encrypt)... peut être que votre certificat ne plait pas à l'appli et dans ce cas, il n'envoi même pas de notif... mais bon il semble que vous avez fait le teste en HTTP ?!
      De plus, je confirme que chez moi si je mets un IP bidon en HTTP (dans la partie settings et que je fais "Send Test-Request" et que "Notification on success et on failure" sont activés, je n'ai pas de retour aussi... et je me rappel l'avoir déjà vu dans d'autres versions de l'appli (une regression peut être :-(, peut être que la dernière n'est pas térrible en iOS 10 :-(, je testerais avec iOS 11 et je vous dirais... bon courage. Sinon, le reste fonctionne pour moi mais je suis en HTTP.

      Supprimer
    2. Et en plus, je viens de voir que Locative n'est plus mis à jour par le "dev" en charge de cela (il fesait cela depuis 2013 ;-) mais on voit aussi une mise à jour en Janvier 2018 quand même ! l'article est ici: https://blog.locative.io/bye-everyone-df01871fe949

      Supprimer
    3. Merci pour les infos, c'est pas de chance :-(, donc quand vous testez c'est OK à partir de l'appli mais le geofencing ne marche pas, en d'autre terme, il ne voit pas ou n'envoi pas d'info quand vous rentrez dans une zone ou en sortez :-(... une dernière idée, j'ai eu ce problème par le passé, une histoire de cache de géolocalisation, mais pas avec cette appli, plus un problème général. Il faut aller dans général/réinitialiser/réin. localisation et confidnetialité sur iOS 10. Cela peut être une solution aussi. J'avais eu aussi un autre problème avec un iPhone "Jailbreaké" et l'application ne voulait pas faire ce que je demandais :-(
      De plus dans les configuration de Locative (si cela peut aider) et donc dans la partie "settings" du téléphone, j'ai :
      - position: toujours
      - notifications: pastilles/sons/alertes
      - actualiser en arrière-plan: activé
      - données cellulaires: activé
      Autre infos, pour faire vos tests chez vous, c'est pas facile pour tester le geofencing... en fait: il faut vraiment sortir ou rentrer dans une zone, sinon cela ne fait rien, on ne peut juste se dire "je suis dans la zone et cela va déclencher". Au début je faisais de petite zone pour tester et sortir/rentrer facilement dans une zone ou je coupais le wifi pour être moins précis en intérieur et donc simuler un mouvement ;-).
      J'espère que vous allez vous en sortir...Courage !

      Supprimer
  3. Bonjour,
    Merci pour la suite donnée.
    J'ai testé le geofencing en faisant des déplacement réels. Toutes les conditions setting du tel étant respectés, aucune info. Ayant aussi un Iphone 5S j'ai installé aussi Localise. Pareil, aucune transmission que ce soit en GET ou en POST . Par contre sur les deux avec IFTTT et une receipe pour entrer en zone et une autre pour sortir de zone , IFTTT m'envoie bien un get (sur IFTTT il faut utiliser GET et non POST, va savoir pourquoi).
    Donc je laisse tomber Localise pour IFTTT, et je vais voir le plugin IosCloud de Zyg0m4t1k ou on peut jouer finement sur le cron pour éviter de vider la batterie de madame ;-))

    RépondreSupprimer
  4. Bon suite à divers essais, il semble que ce soit I os le responsable, ou plus tôt le processeur:
    Avec un Iphone 5c à jour (Ios 10.3.3 , ne peut passer à Ios 11, processeur 32bits) Localise ne fonctionne pas.
    Iphone 5s Ios 11.2.6 (processeur 64bits) Localise fonctionne. Donc pour les possesseurs d'Iphone 5c ou plus anciens utilisez Ifttt à la place de Localise.

    RépondreSupprimer
    Réponses
    1. OK, merci pour ce retour.. il est vrai qu'en ce moment ma femme et moi, on utilise un iPhone 6 (ios 10) et iphone 5s (ios 11), donc je confirme que l'on est dans le cas où cela fonctionne sans problème.
      Donc merci encore pour tes derniers tests et de les avoir partagés, j'ai aussi iOS Cloud maintenant pour certains cas, mais je préfère encore le Geofencing ;-) mais tu as raison ce nouveau plugin (avec le cron configurable/activable/désactivable) peut t'aider à mieux gérer la consommation de batterie par rapport à l'historique plugin Geoloc iOS que je déconseille fortement.

      Supprimer
  5. Merci pour ce partage très enrichissant ; je vais tenter de mettre tout ça en place pour commander mon chauffage.

    RépondreSupprimer