Bonjour,
ce script est pas trop mal : il détecte bien mon iphone, mais en général avec un délai de 10 ou 20 minutes ... C'est le mieux que j'ai pu avoir avec ce teléphone.
Je l'ai (bien sur

) pompé en grande partie sur internet (je ne sais plus ou et c'est bien dommage) et adapté à ma sauce.
Ca fonctionne par la localisation de l'iPhone, et comparaison de la distance de votre maison (changer la variable "coordonneesGoogleDeLaMaison").
Il faut mettre votre login et mot de passe icloud.
Dans devices, le nom de chaque iphone que vous pouvez voir, et le nom d'un device virtuel qui s'allume si l'iPhone est présent.
Pour améliorer la détection, j'ai mis une adresse fixe à mon iphone (paramétrage NAT de la box), il faut le renseigner dans la variable ips, mais ce n'est pas obligatoire. Ca permet de le détecter par "ping" si jamais le wifi du tel est allumé.
Vous pouvez aussi changer la ligne (pas obligatoire ...)
.. "-H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' "
(présente 2 fois) avec votre propre UUID. Vous pouvez normalement trouver votre UUID par
http://whatsmyudid.com/
C'est aussi assez sympa d'enregistrer la distance dans un autre device virtuel de type distance, mais c'est pas dans ce script là. Je vous laisse mettre à jour.
Il s'agit d'un script de type "time".
Vous aurez aussi besoin de copier JSON.lua (google ! si vous trouvez pas, tell me) dans le répertoire /home/pi/domoticz/scripts/lua/JSON.lua
Bonne soirée.
GD
Code : Tout sélectionner
-- ==============================
-- Cherche la position iphone sur icloud
-- ==============================
-- Variables
-- 1) User et mot de passe icloud
username = "votre.login@icloud.com"
password = "votre mot de passe icloud"
-- 2) Pour chaque iPhone déclaré : associer le nom du device de présence
devices = {
["iPhone de Georges-David"] = "Presence GD"
-- , ["iPhone de Jean-Michel"] = "Présence JM"
-- , ["iPhone de Pierre-André"] = "Présence PA"
}
-- 3) Pour chaque iPhone déclaré : associer adresse IP et le nom du device de présence
ips= {
["192.168.1.52"] = "Presence GD"
-- , ["xxx.xxx.xxx"] = "Présence JM"
-- , ["xxx.xxx.xxx"] = "Présence PA"
}
-- 4) Position de la maison, "lat, long" as given by google map
coordonneesGoogleDeLaMaison="43.693858, 5.504608"
--(43.693982097361, 0.00010012119960745)
-- 5) Périmètre de considération de la maison
-- NB : 0.001 = 0.111 kilometres soit 111 metres
skew = 0.001
-- ==============================
commandArray = {}
print('Script v01 script_time_localisation.lua')
function debug(m)
print("........ localisation "..m)
end
function Allumer(item)
if otherdevices[item] ~= 'On' then commandArray[item] = 'On' end
end
function Eteindre(item)
if otherdevices[item] ~= 'Off' then commandArray[item] = 'Off' end
end
-- Time to run?
time = os.date("*t")
-- toutes les minutes, on allume si l'adresse IP répond au ping
-- ce mécanisme n'est pas utilisé pour éteindre : contrairement
-- à Android, l'IPhone éteint le wifi quand il est en veille.
for ip, devicePresence in pairs(ips) do
-- local status = os.execute("ping -W 1 -q -c 1 "..ip) !! pas bon, comme as dit papoo
local status = os.execute("ping -W 1 -q -c 4 "..ip)
if status == true then
Allumer(devicePresence)
end
end
-- On vérifie toute les 10 minutes
if time.min % 10 == 2 then
--- Faire un premier appel pour recherche la position
urlCloud1 = ("curl -s -X POST -D - -o /dev/null -L -u '" .. username .. ":" .. password .. "' "
.. "-H 'Content-Type: application/json; charset=utf-8' "
.. "-H 'X-Apple-Find-Api-Ver: 2.0' "
.. "-H 'X-Apple-Authscheme: UserIdGuest' "
.. "-H 'X-Apple-Realm-Support: 1.0' "
.. "-H 'User-agent: Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)' "
.. "-H 'X-Client-Name: iPad' "
.. "-H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' "
.. "-H 'Accept-Language: en-us' "
.. "-H 'Connection: keep-alive' https://fmipmobile.icloud.com/fmipservice/device/"
.. username .."/initClient")
-- debug("urlCloud1="..urlCloud1)
local handle = io.popen(urlCloud1)
local result = handle:read("*all")
handle:close()
-- Récupération de la position dans le resultat de la premiere URL
stageServer = string.match(result, "X%-Apple%-MMe%-Host%:%s(.*%.icloud%.com)")
-- Faire la deuxième url en cherchant le nom du tel / ipad ou autre avec jq
urlCloud2 = ("curl -s -X POST -L -u '" .. username .. ":" .. password .. "' "
.. "-H 'Content-Type: application/json; charset=utf-8' "
.. "-H 'X-Apple-Find-Api-Ver: 2.0' "
.. "-H 'X-Apple-Authscheme: UserIdGuest' "
.. "-H 'X-Apple-Realm-Support: 1.0' "
.. "-H 'User-agent: Find iPhone/1.3 MeKit (iPad: iPhone OS/4.2.1)' "
.. "-H 'X-Client-Name: iPad' -H 'X-Client-UUID: 0cf3dc501ff812adb0b202baed4f37274b210853' "
.. "-H 'Accept-Language: en-us' "
.. "-H 'Connection: keep-alive' "
.. "https://" .. stageServer .. "/fmipservice/device/" .. username .."/initClient ")
-- debug("urlCloud2="..urlCloud2)
local handle = io.popen(urlCloud2)
local result = handle:read("*all")
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
local jsonPosition = json:decode(result)
handle:close()
latMaison, lonMaison = string.match(coordonneesGoogleDeLaMaison, "(%d+.%d+), (%d+.%d+)")
for i, iPhone in ipairs(jsonPosition.content) do
devicePresence=devices[iPhone.name]
debug("iPhone.name="..iPhone.name.."; devicePresence="..devicePresence
.."; iPh pos=("..iPhone.location.latitude..", "..iPhone.location.longitude..")")
if devicePresence ~= nil then
-- iPhone connu, on teste la position
distance=math.sqrt((111*(latMaison-iPhone.location.latitude))^2
+ (111*(lonMaison-iPhone.location.longitude))^2)
debug("Distance="..distance
..", TimeStamp="..iPhone.location.timeStamp
..", deltaT="..math.floor(os.time()-iPhone.location.timeStamp/1000).."s")
ici = ((math.abs(latMaison-iPhone.location.latitude) <= skew)
and (math.abs(lonMaison-iPhone.location.longitude) <= skew))
if ici then
Allumer(devicePresence)
debug(iPhone.name.." est ici!")
else
Eteindre(devicePresence)
debug(iPhone.name.." est absent!")
end
end
end
end
--Fin du script
return commandArray
PS : si vous avez une meilleure réactivité, je suis preneur ! avec plaisir.
Autre solution intéressante, que je n'ai pas explorée (mais je devrais), est l'utilisation de l'app gratuite "Locative" a télécharger sur l'App Store qui peut activer une URL lorsque vous arrivez dans une zone géographique.