Geolocalisation et info Iphone

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
landaisbenj
Messages : 695
Enregistré le : 12 mars 2017, 19:24

Re: Geolocalisation et info Iphone

Message par landaisbenj » 24 janv. 2019, 18:24

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

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


quiquoi
Messages : 2
Enregistré le : 01 févr. 2019, 11:53

Re: Geolocalisation et info Iphone

Message par quiquoi » 09 févr. 2019, 08:41

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 :
local latitudeOld, longitudeOld = string.match(uservariables['GPS '..user], '(.*)%,'), string.match(uservariables['GPS '..user], '%,(.*)')
J'ai pourtant :
Dummy switch "Presence C"
Dummy text "Adresse C"
Dummy text "Trajet C"
Dummy % "Batterie C"
Variable chaine "GPS C"
Variable chaine "updateGeoloc"
qui sont bien créer.

une idée ? une erreur ?

Merci

stephvite
Messages : 8
Enregistré le : 28 janv. 2016, 12:18

Re: Geolocalisation et info Iphone

Message par stephvite » 15 févr. 2019, 16:59

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.

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
Enregistré le : 12 mars 2017, 19:24

Re: Geolocalisation et info Iphone

Message par landaisbenj » 15 févr. 2019, 18:11

Genial merci pour l'info!!!!
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


stephvite
Messages : 8
Enregistré le : 28 janv. 2016, 12:18

Re: Geolocalisation et info Iphone

Message par stephvite » 07 mars 2019, 10:54

Cela ne marche plus.
J'ai du changer l'url avec l'info suivante trouvé sur le forum anglais:

Code : Tout sélectionner

https://p43-fmipmobile.icloud.com/

FredWst
Messages : 21
Enregistré le : 03 oct. 2017, 21:24

Re: Geolocalisation et info Iphone

Message par FredWst » 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
    
}


landaisbenj
Messages : 695
Enregistré le : 12 mars 2017, 19:24

Re: Geolocalisation et info Iphone

Message par landaisbenj » 28 sept. 2019, 00:36

Génial !!! Impatient d'étudier ça !
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway

landaisbenj
Messages : 695
Enregistré le : 12 mars 2017, 19:24

Re: Geolocalisation et info Iphone

Message par landaisbenj » 03 oct. 2019, 14:09

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

damolc
Messages : 115
Enregistré le : 24 juil. 2016, 22:08

Re: Geolocalisation et info Iphone

Message par damolc » 06 oct. 2019, 15:50

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
Modifié en dernier par damolc le 08 oct. 2019, 09:39, modifié 5 fois.

FredWst
Messages : 21
Enregistré le : 03 oct. 2017, 21:24

Re: Geolocalisation et info Iphone

Message par FredWst » 07 oct. 2019, 20:39

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

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre