Veralite et Géolocalisation

Scénario de géolocalisation avec la box Veralite

L’objectif de ce tutorial et de vous proposer une solution pour déclencher une scène dès que vous vous approchez d’une zone ou que vous en partiez.


Mise à jour 9 août 2013

Le service Google Latitude est à présent fermé.
Des alternatives sont en train d’être élaborées.
On peut noter deux pistes :
- Sur le forum de Micasaverde, un contributeur propose d’utiliser le service de Géolocalisation d’Apple. Sa solution a l’avantage d’avoir la même approche que ce tutorial. Mais elle ne sera supportée que par les iPhone…
- Une autre alternative est d’installer l’application Btraced Track & Trace. Cette application peut appeler une URL et donc permettre à votre box d’enregistrer votre position. L’application est compatible IOS et Android.
Quand nous aurons testé ces différentes solutions nous mettrons à jour cet article en vous faisant notre retour d’expérience.


 

Script de géolocalisation avec la box Veralite

La solution est réalisée pour fonctionner sur une Vera ou Veralite.

Ce script est inspiré des articles suivants « Collecter les données Netatmo depuis une Vera« , « Zibase et Géolocalisation« , « ZIPABOX, Latitude et géolocalisation 2.1« , « script google geolocalisation et eedomus« , merci à eux.Mais son approche est un peu différente puisqu’il sera exécuté par votre box.

 

Pré requis

  • Veralite

  • Le plugin « Variable Container » à installer sur la Vera (2 containers x 5 valeurs pour 7 données)

  • La librairie JSON

  • Smartphone avec l’application latitude de google (application disponible sous Android, IPhone, blackberry) : infos ICI

  • Un compte google

Plugins et librairie JSON

Pour installer la librairie Json il vous suffit d’installer le plugin « Google Calendar Switch » que vous trouverez dans le portail des apps de Micasaverde.

google calendar

Le second dont nous aurons besoin s’appelle « Variable Container » vous le trouverez sur le portail des apps de Micasaverde.

Allez dans l’onglet [APPS] & [Install APPS] de votre Veralite, puis installez le plugin « Variable Container ».

myapps020sj-netatmo-00-dashbvc

Créez le container et notez l’ID (#86 dans mon cas) , donnez lui un nom puis affecté le à une pièce.

Dans le device_type, saisissez : urn:schemas-upnp-org:device:VContainer:1

Dans le champ device_file saisissez : D_VContainer.xml

Dans le champ impl_file saisissez : I_VContainer.xml

virtual-plugin

 

3. Passons à google

3.1 Informations nécessaires

  • Id_user de Google latitude (je vous explique comment on le trouve juste après)

 

3.2 Activation de Google latitude

Rq : c’est un copier/coller des précédents tutos pour cette partie

Activation Google Latitude

Cliquez sur le lien : http://latitude.google.com

et passez aux paramètres de l’application :

Cliquez sur : « Activer et afficher les informations de localisation les plus précises disponibles » et appuyer sur « Enregistrer” .

Normalement cette fenêtre s’affiche.

Regardez bien dans le code qui est affiché, votre Latitude User ID s’y trouve!!

<!– Google Public Location Badge –>

Récupérez le et coller le dans le script, en face de Id_user.

Info importante pour que ça marche : Il faut absolument laisser sur

« Activer et afficher les informations de localisation les plus précises disponibles » pour que ça marche et enregistrer ensuite.

Si vous ne diffusez pas ce code, votre position restera privée, c’est uniquement à partir du moment ou vous diffusez ce google ID, à vos amis par exemple, que votre position sera connu du public.

3.3 Code LUA de votre scène

Maintenant, il faut créer votre scène avec un déclencheur (pour ma part, toutes les 5 minutes).

Dans ce tutorial, le script déclenche comme action d’appeler le service « pushingbox » qui lui-même diffusera la notification.

geoloc

 

schedules

Une fois votre script ci-dessous à jour des informations, stockez le dans une scène (Onglet LUUP).

1
2
3
4
5
6
7
8
9
10
11
12
------------------------------------------------------------------------
-- NAME: geoloc-vera.lua
-- AUTHOR: Olivier MALE
-- DATE  : 05/05/2013
-- COMMENT: Géolocaliser une personne
------------------------------------------------------------------------
-- LIBRAIRIES
------------------------------------------------------------------------
json = require("json")
------------------------------------------------------------------------
-- FONCTION HTTP POST
------------------------------------------------------------------------

function calc_distance (id_user,lat_cible, long_cible, min_distance, max_distance, ID_module, id_pushingbox, name_location)

local url = ‘https://latitude.google.com/latitude/apps/badge/api?user=’ .. id_user .. ‘&type=json’
local status, result = luup.inet.wget(url,10)

local SID_Vc = « urn:upnp-org:serviceId:VContainer1″

luup.variable_set(SID_Vc, « VariableName1″, »longitude », ID_module)
luup.variable_set(SID_Vc, « VariableName2″, »latitude », ID_module)
luup.variable_set(SID_Vc, « VariableName3″, »lastupdate », ID_module)
luup.variable_set(SID_Vc, « VariableName4″, »accuracy », ID_module)
luup.variable_set(SID_Vc, « VariableName5″, »location », ID_module)

if status == 0 then

local data = json.decode(result)
local longitude = data.features[1].geometry.coordinates[1]
local latitude = data.features[1].geometry.coordinates[2]
local position = name_location — data.features[1].properties.reverseGeocode
local timestamp = data.features[1].properties.timeStamp
local accuracy = data.features[1].properties.accuracyInMeters

local DateMin= os.time ()
DateMin = DateMin – (10*60*1000)
timestamp = tonumber(timestamp, 10) or 0

if (timestamp >= DateMin) then

local lat_a = lat_cible*(math.pi/180)
local lon_a = long_cible*(math.pi/180)
local lat_b = latitude*(math.pi/180)
local lon_b = longitude*(math.pi/180)

local t1 = math.sin(lat_a) * math.sin(lat_b)
local t2 = math.cos(lat_a) * math.cos(lat_b)
local t3 = math.cos(lon_a – lon_b)
local t4 = t2 * t3
local t5 = t1 + t4
local rad_dist = math.atan(-t5/math.sqrt(-t5 * t5 +1)) + 2 * math.atan(1)

dp = (rad_dist * 3437.74677 * 1.1508) * 1.6093470878864446
local dpr = math.floor(dp * 1000) / 1000
local current_distance = tonumber(dpr, 10) or 0

last_longitude = luup.variable_get(SID_Vc, « Variable1″, ID_module)
last_latitude = luup.variable_get(SID_Vc, « Variable2″, ID_module)

local lat_b_last = last_latitude*(math.pi/180)
local lon_b_last = last_longitude*(math.pi/180)

local t1b = math.sin(lat_a) * math.sin(lat_b_last)
local t2b = math.cos(lat_a) * math.cos(lat_b_last)
local t3b = math.cos(lon_a – lon_b_last)
local t4b = t2b * t3b
local t5b = t1b + t4b
local rad_dist_last = math.atan(-t5b/math.sqrt(-t5b * t5b +1)) + 2 * math.atan(1)

dp_last = (rad_dist_last * 3437.74677 * 1.1508) * 1.6093470878864446
local last_distance = math.floor(dp_last * 1000) / 1000

if(min_distance == 0 and max_distance > 0) then — verif si en dehors de la cible
if(current_distance > max_distance) then
if (last_distance < max_distance) then

luup.variable_set(SID_Vc, « Variable1″,longitude , ID_module)
luup.variable_set(SID_Vc, « Variable2″,latitude , ID_module)
luup.variable_set(SID_Vc, « Variable3″,os.date(‘%H:%M %d/%m’, timestamp), ID_module)
luup.variable_set(SID_Vc, « Variable4″,accuracy , ID_module)
luup.variable_set(SID_Vc, « Variable5″,position , ID_module)

luup.inet.wget(« http://api.pushingbox.com/pushingbox?devid= » .. id_pushingbox)
end
end
end

if(min_distance > 0 and max_distance == 0) then — verif si arrivee au point cible
if(current_distance < min_distance) then
if (last_distance > min_distance) then

luup.variable_set(SID_Vc, « Variable1″,longitude , ID_module)
luup.variable_set(SID_Vc, « Variable2″,latitude , ID_module)
luup.variable_set(SID_Vc, « Variable3″,os.date(‘%H:%M %d/%m’, timestamp), ID_module)
luup.variable_set(SID_Vc, « Variable4″,accuracy , ID_module)
luup.variable_set(SID_Vc, « Variable5″,position , ID_module)

luup.inet.wget(« http://api.pushingbox.com/pushingbox?devid= » .. id_pushingbox)
end
end
end

end — fin timestamp

end — fin status

end

————————————————————————
– PROCEDURE
————————————————————————
– calc_distance (id_google latitude, lat_cible, long_cible, min_distance, max_distance, ID_module, id_pushingbox, name_location)
calc_distance (‘id_google latitude’,48.88xxxx, 2.31xxxx, 1, 0, ID_module, ‘id_pushingbox’,'Maison’) — alerte si moins d’1km de la maison
– calc_distance (‘id_google latitude’,48.91xxxx, 2.35xxxx, 0, 1, ID_module, ‘id_pushingbox’,'En chemin’) — alerte si plus de 1km du bureau
return true

————————————————————————
– FIN
————————————————————————


Vous pouvez télécharger le source : ici
telecharger

luup

 

4.  Configuration du mobile

Maintenant il ne vous reste plus qu’à télécharger l’application LATITUDE (gratuite) dispo.

IOS, ANDROID , BlackBerry … (infos ICI).

Connectez vous avec votre compte Google et vous voilà parti !!!

5. Résultat

veralite-geolocalisation

L'approche d'utiliser comme plugin "Variable Container" évite de créer votre propre plugin. Je compte faire tourner ce script quelques temps afin de l'optimiser. Mais une prochaine étape sera certainement de créer un plugin complet. Cela offrira comme avantage de pouvoir déclencher des actions facilement sans devoir écrire une seule ligne de code.

Vos commentaires pour améliorer, corriger sont les bienvenus.

Author: Olivier MALE

Je me suis très intéressé à la domotique début 2012 suite à un changement d'appartement. Depuis je continue à suivre les nouvelles tendances et partager mon expérience. Ce qui me tient à cœur ce sont les solutions ouvertes et grand public. Ce qui m'intéresse également c'est d'étudier ce que peuvent être les usages de la maison connectée aujourd'hui et d'ici trois ans. Accéder à mes articles =>

Share This Post On

16 Comments

  1. Bravo !
    On attends le plug-in alors… :)

  2. Je viens de découvrir qu’un plugin Google Latitude est en train d’être développé. On peut le télécharger en version béta sur le forum : http://forum.micasaverde.com/index.php/topic,14321.0.html

    Ce qui est intéressant dans son approche est qu’il utilise l’API Google et donc il ne nécessite pas que vous mettiez votre position en public.

    Il y a sans doute du code intéressant à récupérer dans ce plugin ;-)

  3. Cela me donne l’idée de faire l’équivalent sur mon serveur en PHP pour la Zibase ! Cela éviterai une perte d’autonomie en charge de mon portable !
    Je m’y attellerai dès que possible (et bien sûr le faire partager à tous) ;)
    (mais je suis un peu surchargé pour l’instant)

  4. Argh.
    Moi je n’arrive pas à le faire tourner. J’ai des erreurs LUA…
    Surement à cause de la conversion des caractères  » et ‘…

    De plus, je comprends pas trop pourquoi pushingbox? Peux tu détailler un peu cette partie?

    Merci d’avance.

  5. Pour pushinbox, OK, j’ai comprit. Il faut mettre un DeviceID d’une scène créé.

  6. Bonjour,
    Tout d’abord merci pour les tutoriels ! Pour ma part serait il possible d’expliquer un peu plus en détail les parties du script. J’avoue ne pas tout comprendre.
    Autre chose, dans le cas d’une utilisation avec un éloignement d’un point cible, si la scène tourne toutes les 5 min on va donc recevoir un message push d’éloignement du point toutes les 5 minutes ?
    Merci d’avance pour vos réponses et désolé si mes questions paraissent bêtes :-(

  7. Il n’y a que des réponses bêtes comme on dit.
    Je vais essayer d’expliquer le script.
    En premier on vérifie l’heure de la dernière géolocalisation par google. Si c’est suspérieur à 10 minutes par rapport à l’heure courante on poursuit le script.
    Dans ce cas il y a deux cas, soit min-distance est égale à zéro et dans ce cas on va vérifie si le nouveau pt de geoloc est sorti de la zone, soit le paramètre max-distance est à zéro et dans ce cas on va vérifier si le nv point de geoloc est dans la zone cible.
    Prenons le premier cas, le script va vérifier si le nouveau point est sorti de la zone. Si c’est le cas on va vérifier si le point d’avant était encore dans la zone. Si ces deux conditions sont vérifiées c’est qu’on vient de sortir de la zone. Dans ce cas on sauvegarde la nouvelle position et on envoie une notification à pushingbox.
    Le second cas s’explique de façon similaire.

    Est ce que cela répond à votre question ?

  8. Bonjour,
    est-il possible de modifier le temps de rafraichissement sur la demande de position en fonction de la derniere valeur obtenue?
    Par exemple :

    si la position actuelle > 200 km, rafraichir toutes les 2h.
    si position actuelle 50 km, rafraichir toutes les 30 minutes,
    si ^position actuelle 10km, rafraichir toutes les 5 minutes..

    et ainsi de suite.
    Cela permettrait de ne pas trop surcharger les demandes sur la vera, et ni trop consommer de la batterie sur notre smarphone!

    Merci!

  9. Merci Olivier pour ces éclaircissements !

    Je vais mettre ca en place des que possible :)

  10. Au lieu d’utiliser les options de schedule de la scène on peut via LUA, planifier le rafraichissement du traitement.
    Le code ressemble à :
    While true do
    ….
    sleep(nbr_sec*1000)
    End
    Par contre sauf erreur, sur le mobile l’application Latitude ne permet pas de changer la fréquence de rafraichissement. Il me semble que sur le service Latitude on peut soit demander à ce que le service te localise avec beaucoup de précision soit au niveau de la ville.

  11. Personnellement j’utilise l’application Backitude sur Android qui est bcq plus fiable et avec bcq d’options que Latitude.

  12. De mon coté, j’utilise Tasker pour me localiser et envoyer l’info à la Vera. La fiabilité de Latitude reste à prouver. Entre les délai de mise à jour et les improbables positions, je préfère que le téléphone envoie lui même l’info quand la position change.

  13. Pour information, le service google Latitude fermera ses portes le 9 août…

  14. Trouver les alternatives aux solutions Google va devenir une sport de geek national

Trackbacks/Pingbacks

  1. Veralite et Géolocalisation | | Domotiqu... - [...] Script pour vous géolocaliser avec une box Veralite. Ce script est fait en LUA. Son approche est de s'exécuter …
  2. Géolocalisation Domotique | Pearltrees - [...] Veralite et Géolocalisation [...]
  3. Veralite et Géolocalisation | | Domotiqu... - [...] Ce script est va vous permettre de vous localiser et de déclencher une scène dès que vous vous approcher …

Laisser un commentaire