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