[LUA] Geolocalisation et info IPhone
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Geolocalisation et info Iphone
A oui chest -k qui esquive la double authentification.
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Geolocalisation et info Iphone
Bonjour,
J'ai cette erreur :
Script_time_loc.lua:183: bad argument #1 to 'match' (string expected, got nil)
il semble que cela soit cette ligne :
une idée ? une erreur ?
Merci
J'ai cette erreur :
Script_time_loc.lua:183: bad argument #1 to 'match' (string expected, got nil)
il semble que cela soit cette ligne :
J'ai pourtant :local latitudeOld, longitudeOld = string.match(uservariables['GPS '..user], '(.*)%,'), string.match(uservariables['GPS '..user], '%,(.*)')
qui sont bien créer.Dummy switch "Presence C"
Dummy text "Adresse C"
Dummy text "Trajet C"
Dummy % "Batterie C"
Variable chaine "GPS C"
Variable chaine "updateGeoloc"
une idée ? une erreur ?
Merci
Re: Geolocalisation et info Iphone
Pour les allergiques à google on peut utiliser le site adresse.data.gouv.fr pour obtenir l'adresse.
la limite est d'une requête par seconde.
la limite est d'une requête par seconde.
Code : Tout sélectionner
local url ='curl -s "https://api-adresse.data.gouv.fr/reverse/?lon='.. longitude .. '&lat=' .. latitude ..'"'
local handle = io.popen(url)
local result = handle:read("*a")
handle:close()
output = json:decode(result)
if output.features[1].properties.label ~=nil then
adresse= output.features[1].properties.label
return adresse
else
return nil
end-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Geolocalisation et info Iphone
Genial merci pour l'info!!!!
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Geolocalisation et info Iphone
Cela ne marche plus.
J'ai du changer l'url avec l'info suivante trouvé sur le forum anglais:
J'ai du changer l'url avec l'info suivante trouvé sur le forum anglais:
Code : Tout sélectionner
https://p43-fmipmobile.icloud.com/Re: Geolocalisation et info Iphone
Bonjour,
Merci pour le partage de ce code.
J'ai transposé pour DzVents en utilisant les fonctions openurl et callback ce qui permet de ne pas bloqué le script en cas de non réponse d'un site. (curl)
Sur le principe rien de changé excepté la détection du sens de trajet Eloignement/Rapprochement du domicile et le filtrage iCloud qui filtre sur deviceClass pour ne détecter que les iPhones.
Merci pour le partage de ce code.
J'ai transposé pour DzVents en utilisant les fonctions openurl et callback ce qui permet de ne pas bloqué le script en cas de non réponse d'un site. (curl)
Sur le principe rien de changé excepté la détection du sens de trajet Eloignement/Rapprochement du domicile et le filtrage iCloud qui filtre sur deviceClass pour ne détecter que les iPhones.
Code : Tout sélectionner
-- Fonction de calcul de distance
-- Renvoi la distance en kilometre a une decimale entre deux coordonées GPS
function distancekm(latitude1, longitude1, latitude2, longitude2)
local rayonTerre = 6378137; -- Rayon équatorial de la terre en metre
local radlatx = math.rad(latitude1);
local radlonx = math.rad(longitude1);
local radlaty = math.rad(latitude2);
local radlony = math.rad(longitude2);
local calculLatitude = (radlaty - radlatx) / 2;
local calculLongitude = (radlony - radlonx) / 2;
local detail = (math.sin(calculLatitude))^2 + math.cos(radlatx) * math.cos(radlaty) * (math.sin(calculLongitude))^2;
local calcul = 2 * math.atan(math.sqrt(detail), math.sqrt(1 - detail));
output = math.floor((rayonTerre * calcul)/100)/10
return output
end
-- Fonction de recuperation des informations icloud
-- Renvoi les informations du telephone (Position GPS, Batterie, Status...)
function iCloud(triggered)
--On recherche le device associé au devicename de l'utilisateur
for key,value in pairs(triggered.json.content) do
if value.deviceClass == 'iPhone' then
--On verifie que le device est localisé depuis peu pour recuperer les valeurs importantes
if value.isLocating == true and value.location ~= nil and value.location.isInaccurate ~= true and value.location.isOld ~= true then
result = {
batlvl = math.floor(value.batteryLevel * 100 / 1);
batstat = value.batteryStatus;
accuracy = value.location.isInaccurate;
latitudeiPhone = value.location.latitude;
longitudeiPhone = value.location.longitude;
positionType = value.location.positionType;
timestampupdate = value.location.timeStamp;
horizontalAccuracy = value.location.horizontalAccuracy
}
return result
elseif value.isLocating == false or value.location == nil or value.location.isInaccurate == true or value.location.isOld == true or value.location.locationFinished == false then
return nil
else
return nil
end
end
end
end
-- Fonction de calcule d'itineraire
-- Renvoi dans une table le temps en minute et la distance en metre de trajet entre deux coordonées GPS
function waze(dz, triggered)
local convert = dz.utils.fromJSON(triggered.data)
local routeTotalDistm = 0
for key,value in pairs(convert.response.results) do
routeTotalDistm = routeTotalDistm + value.length
end
if routeTotalDistm ~= nil and convert.response.totalRouteTime ~= nil then
trajet = { temps = convert.response.totalRouteTime ; distance = routeTotalDistm }
return trajet
else
return nil
end
end
-- Recherche le user ayant déclenché httpResponses callback
function findUser(dz,triggered)
for usr,cpt in pairs(dz.data.users) do
if string.find(triggered.callback,usr) then
return usr
end
end
end
--Codage base64
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function encodeb64(data)
return ((data:gsub('.', function(x)
local r,b='',x:byte()
for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
return r;
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then return '' end
local c=0
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
return b:sub(c+1,c+1)
end)..({ '', '==', '=' })[#data%3+1])
end
-- Latitude et Longitude du domicile:
local latitudeDomicile="48.802939"
local longitudeDomicile="4.954217"
-- Précision (en km) de detection de position au domicile ou de changement de position
local Precision=0.2
--Exemple pour 2 utilisateurs.
local user1 = 'toto' --Le nom d'utilisateur doit matcher avec la déclaration dans data ci dessous
local user2 = 'titi' --Le nom d'utilisateur doit matcher avec la déclaration dans data ci dessous
--Devices à créer:
--Dummy switch "Presence toto"
--Dummy text "Adresse toto"
--Dummy text "Trajet toto"
--Dummy pourcentage "Batterie toto"
--Dummy switch "Presence titi"
--Dummy text "Adresse titi"
--Dummy text "Trajet titi"
--Dummy pourcentage "Batterie titi"
return {
active = true,
on = {
timer = {'every 1 minutes'},
httpResponses = {'iCloud'..user1,'waze'..user1,'Adresse'..user1,'iCloud'..user2,'waze'..user2,'Adresse'..user2}
},
--Variables persistantes initialisées au premier lancement du script par le système
--Après les données sont mémorisées : obligation liée au principe du callback, les données doivent être non volatile entre appel
data = {
users = { initial = {
toto = {
username = 'adresse mail de toto@xxxx.yy'; --Adresse mail du compte
password ='mot de passe compte titi';
UDID = ''; --Optionnel
latitudeiPhone = latitudeDomicile;
longitudeiPhone = longitudeDomicile;
DistanceDomicile = 0;
deplacement = false;
position = '';
delai = 1;
},
titi = {
username = 'adresse mail de titi@xxxx.yy'; --Adresse mail du compte
password ='mot de passe compte titi';
UDID = 'a90f21853edfe54091589104dae71f218abb1e79'; --Optionnel
latitudeiPhone = latitudeDomicile;
longitudeiPhone = longitudeDomicile;
DistanceDomicile = 0;
deplacement = false;
position = '';
delai = 6;
},
}
}
},
execute = function(domoticz, triggeredItem, info)
--Déclenchement toutes les minutes aucun impact sur la durée batterie de l'iPhone
if (triggeredItem.isTimer) then
for user,compte in pairs(domoticz.data.users) do
print('Lancement demande de localisation '..user..' dans '..compte.delai..' seconde(s)')
local url = 'https://p43-fmipmobile.icloud.com/fmipservice/device/'..compte.username..'/initClient'
local headers = {
["Authorization"] = "Basic "..encodeb64(compte.username..':'..compte.password), --Type authentification basic fonctionne avec authentification deux facteurs
["Content-Type"] = "application/json",
["charset"] = "utf-8",
["X-Apple-Find-Api-Ver"] = "2.0",
["X-Apple-Authscheme"] = "UserIdGuest",
["X-Apple-Realm-Support"] = "1.0",
["User-agent"] = "Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)",
["X-Client-Name"] = "iPad",
["X-Client-UUID"] = compte.UDID,
["Accept-Language"] = "en-us",
["Connection"] = "keep-alive",
["Origin"] = "https://www.icloud.com"
}
domoticz.openURL({
url = url,
headers=headers,
method = 'POST',
callback = 'iCloud'..user
}).afterSec(compte.delai) --compte.delai : Astuce pour décaler les demandes sinon waze n'aime pas !
end
elseif triggeredItem.isHTTPResponse and triggeredItem.ok then
if (triggeredItem.isJSON) then
--Test type de callback
if string.find(triggeredItem.callback,'iCloud') then
--Récupère le user qui génère le callback
user = findUser(domoticz,triggeredItem)
compte = domoticz.data.users[user]
--Fonction de recherche données uniquement deviceClass:iPhone voir filtre dans la fonction elle même en début de code
local device = iCloud(triggeredItem)
if device ~= nil then
-- Ancienne position:
local latitudePrecente = compte.latitudeiPhone
local longitudePrecedente = compte.longitudeiPhone
-- Ancienne distance [position-domicile]:
local DistanceDomicilePrecedente = distancekm(latitudePrecente, longitudePrecedente, latitudeDomicile, longitudeDomicile)
-- Distance [nouvelle position-ancienne position]:
local EcartDistance = distancekm(device.latitudeiPhone, device.longitudeiPhone,latitudePrecente, longitudePrecedente)
-- Distance [nouvelle position-domicile]:
compte.DistanceDomicile = distancekm(device.latitudeiPhone, device.longitudeiPhone, latitudeDomicile, longitudeDomicile)
--Presence: si la distance avec le domicile est inferieure à la précision souhaitée alors le smartphone est present au domicile
if compte.DistanceDomicile < Precision then --Presence
if domoticz.devices('Presence ' .. user).state == 'Off' then --Arrivée
domoticz.devices('Presence ' .. user).switchOn()
end
compte.DistanceDomicile = 0
else
if domoticz.devices('Presence ' .. user).state == 'On' then
domoticz.devices('Presence ' .. user).switchOff()
end
end
print('Callback iCloud : '..user..': '..compte.DistanceDomicile..' km du domicile, '..device.batlvl..'% de batterie restante. Statut: "'..device.batstat..'". Precision: '..device.horizontalAccuracy)
-- EcartDistance = 1
--Deplacement: si la distance avec l'ancienne position est superieure à la précision souhaitée alors le smartphone n'est plus au meme endroit et se deplace
if EcartDistance > Precision then
compte.deplacement = true
if DistanceDomicilePrecedente > compte.DistanceDomicile then
compte.position='En rapprochement du domicile'
else
compte.position='En éloignement du domicile'
end
print('iPhone de '..user.. ': '..compte.position)
domoticz.devices('Adresse '..user).updateText(compte.position)
print('Lancement demande de trajet '..user)
local url = 'https://www.waze.com/row-RoutingManager/routingRequest?from=x:'..longitudeDomicile..'+y:'..latitudeDomicile..'&to=x:'..device.longitudeiPhone..'+y:'..device.latitudeiPhone..'&at=0&returnJSON=true&returnGeometries=false&returnInstructions=false&timeout=30000&nPaths=1&clientVersion=1.0.0&options=AVOID_TRAILS:t,ALLOW_UTURNS:t'
domoticz.openURL({
url = url,
headers={["Content-Type"] = "application/json",["referer"]="https://www.waze.com"},
method = 'POST',
callback = 'waze'..user
})
else
if compte.deplacement == true and ( domoticz.devices('Adresse '..user).state=='En éloignement du domicile' or domoticz.devices('Adresse '..user).state=='En rapprochement du domicile') then
print("Lancement demande de l'adresse de "..user)
local url = 'https://api-adresse.data.gouv.fr/reverse/?lon='.. device.longitudeiPhone .. '&lat=' .. device.latitudeiPhone
domoticz.openURL({
url = url,
method = 'GET',
callback = 'Adresse'..user
})
end
compte.deplacement = false
end
domoticz.devices('Batterie '..user).updatePercentage(device.batlvl)
--Mémorisation nouvelle coordonnée iPhone
--Mise a jour des informations
compte.latitudeiPhone = device.latitudeiPhone
compte.longitudeiPhone = device.longitudeiPhone
else
print('Retour iCloud problème : '..user)
end
end
--Test type de callback
if string.find(triggeredItem.callback,'Adresse') then
--Récupère le user qui génère le callback
user = findUser(domoticz,triggeredItem)
compte = domoticz.data.users[user]
local adresse = triggeredItem.json.features[1].properties.label
if adresse ~=nil then
compte.position=adresse..' ('..compte.DistanceDomicile..' km)'
print('Callback Adresse : '..user..': '..compte.position)
domoticz.devices('Adresse '..user).updateText(compte.position)
else
print('Retour Adresse problème : '..user)
compte.position=domoticz.devices('Adresse '..user).state
end
end
else
--C'est bien un format JSON mais domoticz ne le detecte pas !
--Test type de callback
if string.find(triggeredItem.callback,'waze') then
--Récupère le user qui génère le callback
user = findUser(domoticz,triggeredItem)
compte = domoticz.data.users[user]
local trajet = waze(domoticz,triggeredItem)
if trajet ~= nil then
--Fonction waze retourne pour le trajet entre deux coordonées une table avec le temps en seconde et la distance en metre
local heures=math.floor(trajet.temps / 3600)
local minutes=math.floor((trajet.temps % 3600) / 60)
local secondes=math.floor((trajet.temps % 3600) % 60)
ETA=os.date("%Hh%M",os.time()+trajet.temps)
duree=heures..'h'..minutes..'min'
trafic='Heure d\'arrivée: '..ETA..' - '..tostring(((math.floor(trajet.distance/100))/10))..'Km, '..duree
print('Callback waze : ' .. user .. ': '..trafic)
domoticz.devices('Trajet '..user).updateText(trafic)
else
print('Retour Waze problème : '..user)
end
end
end
end
end
}
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Geolocalisation et info Iphone
Génial !!! Impatient d'étudier ça !
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
-
landaisbenj
- Messages : 695
- Inscription : 12 mars 2017, 19:24
Re: Geolocalisation et info Iphone
FredWst a écrit : 27 sept. 2019, 23:26 Bonjour,
Merci pour le partage de ce code.
J'ai transposé pour DzVents en utilisant les fonctions openurl et callback ce qui permet de ne pas bloqué le script en cas de non réponse d'un site. (curl)
Sur le principe rien de changé excepté la détection du sens de trajet Eloignement/Rapprochement du domicile et le filtrage iCloud qui filtre sur deviceClass pour ne détecter que les iPhones.
Code : Tout sélectionner
-- Fonction de calcul de distance -- Renvoi la distance en kilometre a une decimale entre deux coordonées GPS function distancekm(latitude1, longitude1, latitude2, longitude2) local rayonTerre = 6378137; -- Rayon équatorial de la terre en metre local radlatx = math.rad(latitude1); local radlonx = math.rad(longitude1); local radlaty = math.rad(latitude2); local radlony = math.rad(longitude2); local calculLatitude = (radlaty - radlatx) / 2; local calculLongitude = (radlony - radlonx) / 2; local detail = (math.sin(calculLatitude))^2 + math.cos(radlatx) * math.cos(radlaty) * (math.sin(calculLongitude))^2; local calcul = 2 * math.atan(math.sqrt(detail), math.sqrt(1 - detail)); output = math.floor((rayonTerre * calcul)/100)/10 return output end -- Fonction de recuperation des informations icloud -- Renvoi les informations du telephone (Position GPS, Batterie, Status...) function iCloud(triggered) --On recherche le device associé au devicename de l'utilisateur for key,value in pairs(triggered.json.content) do if value.deviceClass == 'iPhone' then --On verifie que le device est localisé depuis peu pour recuperer les valeurs importantes if value.isLocating == true and value.location ~= nil and value.location.isInaccurate ~= true and value.location.isOld ~= true then result = { batlvl = math.floor(value.batteryLevel * 100 / 1); batstat = value.batteryStatus; accuracy = value.location.isInaccurate; latitudeiPhone = value.location.latitude; longitudeiPhone = value.location.longitude; positionType = value.location.positionType; timestampupdate = value.location.timeStamp; horizontalAccuracy = value.location.horizontalAccuracy } return result elseif value.isLocating == false or value.location == nil or value.location.isInaccurate == true or value.location.isOld == true or value.location.locationFinished == false then return nil else return nil end end end end -- Fonction de calcule d'itineraire -- Renvoi dans une table le temps en minute et la distance en metre de trajet entre deux coordonées GPS function waze(dz, triggered) local convert = dz.utils.fromJSON(triggered.data) local routeTotalDistm = 0 for key,value in pairs(convert.response.results) do routeTotalDistm = routeTotalDistm + value.length end if routeTotalDistm ~= nil and convert.response.totalRouteTime ~= nil then trajet = { temps = convert.response.totalRouteTime ; distance = routeTotalDistm } return trajet else return nil end end -- Recherche le user ayant déclenché httpResponses callback function findUser(dz,triggered) for usr,cpt in pairs(dz.data.users) do if string.find(triggered.callback,usr) then return usr end end end --Codage base64 local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' function encodeb64(data) return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end -- Latitude et Longitude du domicile: local latitudeDomicile="48.802939" local longitudeDomicile="4.954217" -- Précision (en km) de detection de position au domicile ou de changement de position local Precision=0.2 --Exemple pour 2 utilisateurs. local user1 = 'toto' --Le nom d'utilisateur doit matcher avec la déclaration dans data ci dessous local user2 = 'titi' --Le nom d'utilisateur doit matcher avec la déclaration dans data ci dessous --Devices à créer: --Dummy switch "Presence toto" --Dummy text "Adresse toto" --Dummy text "Trajet toto" --Dummy pourcentage "Batterie toto" --Dummy switch "Presence titi" --Dummy text "Adresse titi" --Dummy text "Trajet titi" --Dummy pourcentage "Batterie titi" return { active = true, on = { timer = {'every 1 minutes'}, httpResponses = {'iCloud'..user1,'waze'..user1,'Adresse'..user1,'iCloud'..user2,'waze'..user2,'Adresse'..user2} }, --Variables persistantes initialisées au premier lancement du script par le système --Après les données sont mémorisées : obligation liée au principe du callback, les données doivent être non volatile entre appel data = { users = { initial = { toto = { username = 'adresse mail de toto@xxxx.yy'; --Adresse mail du compte password ='mot de passe compte titi'; UDID = ''; --Optionnel latitudeiPhone = latitudeDomicile; longitudeiPhone = longitudeDomicile; DistanceDomicile = 0; deplacement = false; position = ''; delai = 1; }, titi = { username = 'adresse mail de titi@xxxx.yy'; --Adresse mail du compte password ='mot de passe compte titi'; UDID = 'a90f21853edfe54091589104dae71f218abb1e79'; --Optionnel latitudeiPhone = latitudeDomicile; longitudeiPhone = longitudeDomicile; DistanceDomicile = 0; deplacement = false; position = ''; delai = 6; }, } } }, execute = function(domoticz, triggeredItem, info) --Déclenchement toutes les minutes aucun impact sur la durée batterie de l'iPhone if (triggeredItem.isTimer) then for user,compte in pairs(domoticz.data.users) do print('Lancement demande de localisation '..user..' dans '..compte.delai..' seconde(s)') local url = 'https://p43-fmipmobile.icloud.com/fmipservice/device/'..compte.username..'/initClient' local headers = { ["Authorization"] = "Basic "..encodeb64(compte.username..':'..compte.password), --Type authentification basic fonctionne avec authentification deux facteurs ["Content-Type"] = "application/json", ["charset"] = "utf-8", ["X-Apple-Find-Api-Ver"] = "2.0", ["X-Apple-Authscheme"] = "UserIdGuest", ["X-Apple-Realm-Support"] = "1.0", ["User-agent"] = "Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)", ["X-Client-Name"] = "iPad", ["X-Client-UUID"] = compte.UDID, ["Accept-Language"] = "en-us", ["Connection"] = "keep-alive", ["Origin"] = "https://www.icloud.com" } domoticz.openURL({ url = url, headers=headers, method = 'POST', callback = 'iCloud'..user }).afterSec(compte.delai) --compte.delai : Astuce pour décaler les demandes sinon waze n'aime pas ! end elseif triggeredItem.isHTTPResponse and triggeredItem.ok then if (triggeredItem.isJSON) then --Test type de callback if string.find(triggeredItem.callback,'iCloud') then --Récupère le user qui génère le callback user = findUser(domoticz,triggeredItem) compte = domoticz.data.users[user] --Fonction de recherche données uniquement deviceClass:iPhone voir filtre dans la fonction elle même en début de code local device = iCloud(triggeredItem) if device ~= nil then -- Ancienne position: local latitudePrecente = compte.latitudeiPhone local longitudePrecedente = compte.longitudeiPhone -- Ancienne distance [position-domicile]: local DistanceDomicilePrecedente = distancekm(latitudePrecente, longitudePrecedente, latitudeDomicile, longitudeDomicile) -- Distance [nouvelle position-ancienne position]: local EcartDistance = distancekm(device.latitudeiPhone, device.longitudeiPhone,latitudePrecente, longitudePrecedente) -- Distance [nouvelle position-domicile]: compte.DistanceDomicile = distancekm(device.latitudeiPhone, device.longitudeiPhone, latitudeDomicile, longitudeDomicile) --Presence: si la distance avec le domicile est inferieure à la précision souhaitée alors le smartphone est present au domicile if compte.DistanceDomicile < Precision then --Presence if domoticz.devices('Presence ' .. user).state == 'Off' then --Arrivée domoticz.devices('Presence ' .. user).switchOn() end compte.DistanceDomicile = 0 else if domoticz.devices('Presence ' .. user).state == 'On' then domoticz.devices('Presence ' .. user).switchOff() end end print('Callback iCloud : '..user..': '..compte.DistanceDomicile..' km du domicile, '..device.batlvl..'% de batterie restante. Statut: "'..device.batstat..'". Precision: '..device.horizontalAccuracy) -- EcartDistance = 1 --Deplacement: si la distance avec l'ancienne position est superieure à la précision souhaitée alors le smartphone n'est plus au meme endroit et se deplace if EcartDistance > Precision then compte.deplacement = true if DistanceDomicilePrecedente > compte.DistanceDomicile then compte.position='En rapprochement du domicile' else compte.position='En éloignement du domicile' end print('iPhone de '..user.. ': '..compte.position) domoticz.devices('Adresse '..user).updateText(compte.position) print('Lancement demande de trajet '..user) local url = 'https://www.waze.com/row-RoutingManager/routingRequest?from=x:'..longitudeDomicile..'+y:'..latitudeDomicile..'&to=x:'..device.longitudeiPhone..'+y:'..device.latitudeiPhone..'&at=0&returnJSON=true&returnGeometries=false&returnInstructions=false&timeout=30000&nPaths=1&clientVersion=1.0.0&options=AVOID_TRAILS:t,ALLOW_UTURNS:t' domoticz.openURL({ url = url, headers={["Content-Type"] = "application/json",["referer"]="https://www.waze.com"}, method = 'POST', callback = 'waze'..user }) else if compte.deplacement == true and ( domoticz.devices('Adresse '..user).state=='En éloignement du domicile' or domoticz.devices('Adresse '..user).state=='En rapprochement du domicile') then print("Lancement demande de l'adresse de "..user) local url = 'https://api-adresse.data.gouv.fr/reverse/?lon='.. device.longitudeiPhone .. '&lat=' .. device.latitudeiPhone domoticz.openURL({ url = url, method = 'GET', callback = 'Adresse'..user }) end compte.deplacement = false end domoticz.devices('Batterie '..user).updatePercentage(device.batlvl) --Mémorisation nouvelle coordonnée iPhone --Mise a jour des informations compte.latitudeiPhone = device.latitudeiPhone compte.longitudeiPhone = device.longitudeiPhone else print('Retour iCloud problème : '..user) end end --Test type de callback if string.find(triggeredItem.callback,'Adresse') then --Récupère le user qui génère le callback user = findUser(domoticz,triggeredItem) compte = domoticz.data.users[user] local adresse = triggeredItem.json.features[1].properties.label if adresse ~=nil then compte.position=adresse..' ('..compte.DistanceDomicile..' km)' print('Callback Adresse : '..user..': '..compte.position) domoticz.devices('Adresse '..user).updateText(compte.position) else print('Retour Adresse problème : '..user) compte.position=domoticz.devices('Adresse '..user).state end end else --C'est bien un format JSON mais domoticz ne le detecte pas ! --Test type de callback if string.find(triggeredItem.callback,'waze') then --Récupère le user qui génère le callback user = findUser(domoticz,triggeredItem) compte = domoticz.data.users[user] local trajet = waze(domoticz,triggeredItem) if trajet ~= nil then --Fonction waze retourne pour le trajet entre deux coordonées une table avec le temps en seconde et la distance en metre local heures=math.floor(trajet.temps / 3600) local minutes=math.floor((trajet.temps % 3600) / 60) local secondes=math.floor((trajet.temps % 3600) % 60) ETA=os.date("%Hh%M",os.time()+trajet.temps) duree=heures..'h'..minutes..'min' trafic='Heure d\'arrivée: '..ETA..' - '..tostring(((math.floor(trajet.distance/100))/10))..'Km, '..duree print('Callback waze : ' .. user .. ': '..trafic) domoticz.devices('Trajet '..user).updateText(trafic) else print('Retour Waze problème : '..user) end end end end end }
Je fais un premier test de ton code. C'est dommmage qu'on soit obligé de remplir les deux utilisateurs..
Il faudrait pouvoir juste remplir les champs data, et que tout soit automatique pour detecter le nombre d'utilisateur.
Je rajoute pour note de recuperer la localisation du domicile avec l'api de domoticz, ainsi que de detecter si les dummy sont créés et sinon de les faire creer (possible avec l'api aussi).
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Re: Geolocalisation et info Iphone
bonjour
je souhaiterai mettre en place ce script mais mon niveau est très bas , j ai besoin d aide
j ai mise le script sur un fichier lua dans domiticz/script/lua/ que j ai nommé script_time_geolocalisation.lua
j ai changé la ligne : Utilisateur1 = {username = "xxxxx@me.com" ; password = "xxxxxxxxxx" ; devicename = "Linux"
j ai mis mon UDID
j ai mis les valeurs de ma localisation :
local latitudeHome="49.376636"
local longitudeHome="3.323420"
j ai créé une clef API sur mon adresse gmail
j ai crée des Dummy :
Présence Linux ; Batterie Linux ; Adresse Linux ; Trajet Linux
j ai crée des variable : GPS Linux (type de variable : Chaine, valeur de la variable : "vide" ? faut il mettre la position GPS du domicile?) ; "updateGeoloc" (type de variable : Chaine , valeur de la variable : "reload")
mais rien de fonctionne
j ai fait une erreur qq part?
Merci de votre aide
je souhaiterai mettre en place ce script mais mon niveau est très bas , j ai besoin d aide
j ai mise le script sur un fichier lua dans domiticz/script/lua/ que j ai nommé script_time_geolocalisation.lua
j ai changé la ligne : Utilisateur1 = {username = "xxxxx@me.com" ; password = "xxxxxxxxxx" ; devicename = "Linux"
j ai mis mon UDID
j ai mis les valeurs de ma localisation :
local latitudeHome="49.376636"
local longitudeHome="3.323420"
j ai créé une clef API sur mon adresse gmail
j ai crée des Dummy :
Présence Linux ; Batterie Linux ; Adresse Linux ; Trajet Linux
j ai crée des variable : GPS Linux (type de variable : Chaine, valeur de la variable : "vide" ? faut il mettre la position GPS du domicile?) ; "updateGeoloc" (type de variable : Chaine , valeur de la variable : "reload")
mais rien de fonctionne
j ai fait une erreur qq part?
Merci de votre aide
Dernière modification par damolc le 08 oct. 2019, 09:39, modifié 5 fois.
Re: Geolocalisation et info Iphone
Bonjour,
J'ai ajouté la création automatique des objets, la position domicile est maintenant celle renseignée dans domoticz.
Pour la gestion des utilisateurs, c'est un peu plus compliqué à gérer de façon automatique …
Le seul moyen existant est de configurer dans le script. J'ai donc ajouté une option simple pour enable/disable un user.
Je mettrai à disposition dans les jours qui vienne.
Cdl
Fred
J'ai ajouté la création automatique des objets, la position domicile est maintenant celle renseignée dans domoticz.
Pour la gestion des utilisateurs, c'est un peu plus compliqué à gérer de façon automatique …
Le seul moyen existant est de configurer dans le script. J'ai donc ajouté une option simple pour enable/disable un user.
Je mettrai à disposition dans les jours qui vienne.
Cdl
Fred