Files
Domoticz/lua/iphone.luaTMP
2025-03-06 11:09:58 +01:00

136 lines
4.9 KiB
Plaintext
Executable File

-- ==============================
-- 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.0.20"] = "moi"
-- , ["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="47.726695, -2.131950"
--(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