Page 1 sur 4

Détection de présence iPhone

Publié : 08 juil. 2016, 11:31
par Sopalin
Bonjour à tous,

Nouveau dans domoticz je suis en train de me pencher sur la detection des téléphones de la maison. Pour info je tourne sous windows mais je me débrouille assez pour adapter les scripts si besoin.

J'ai essayer plusieurs solution :
1) PING, pas assez fiable car IOS coupe le wifi régulière lorsque le téléphone est en veille
2) NMAP, soit disant ça détecte le téléphone même wifi éteint, perso après un grand nombre d'essai le résultat reste aléatoire

Du coup je me demande comment vous gérer la détection de présence de votre coté ?

Merci d'avance

Re: Détection de présence iPhone

Publié : 08 juil. 2016, 13:09
par papoo

Re: Détection de présence iPhone

Publié : 08 juil. 2016, 17:29
par Sopalin
J'y avait pensé mais mon dongle intel est déjà connecté en bluethoot sur une enceinte. De plus la portée est vraiment moyenne :/

Je suis en train de tester une solution à base de ping et de la table arp. Faut que je regarde si l'adresse MAC monte dans la table ARP même si l'iphone ne répond pas au ping.

Tout est prêt, reste à voir si ça marche en rentrant chez moi.

Re: Détection de présence iPhone

Publié : 08 juil. 2016, 18:15
par deennoo
Et par du détecteur de mouvement ? En plus ils peuvent te servir pour diverse scenario

Envoyé de mon Smart'TAB 7801 en utilisant Tapatalk

Re: Détection de présence iPhone

Publié : 08 juil. 2016, 18:55
par Chris54220
si sa marche sa m'intéresse

Re: Détection de présence iPhone

Publié : 08 juil. 2016, 22:30
par georges.attali
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.

Re: Détection de présence iPhone

Publié : 09 juil. 2016, 10:16
par papoo
Merci pour ce script georges.attali
chez moi le ping n'allume jamais mon device, status n'étant jamais à 0
j'ai modifié ton code

Code : Tout sélectionner

for ip, devicePresence in pairs(ips) do
   local status = os.execute("ping -W 1 -q -c 1 "..ip)
   if status == 0 then
      Allumer(devicePresence)
   end
end
par

Code : Tout sélectionner

for ip, devicePresence in pairs(ips) do
   local status = os.execute("ping -W 1 -q -c 1 "..ip)
   if status == true then
      Allumer(devicePresence)
   end
end
pour que cela fonctionne

j'ai aussi une erreur avec la ligne

Code : Tout sélectionner

      debug("iPhone.name="..iPhone.name.."; devicePresence="..devicePresence
          .."; iPh pos=("..iPhone.location.latitude..", "..iPhone.location.longitude..")")

du a la présence sur mon compte apple de plusieurs devices dont je ne veux pas localiser la position et qui génèrent une erreur
pour ceux qui auraient le même soucis, commenter cette ligne n'a aucune incidence sur le fonctionnement du script

Re: Détection de présence iPhone

Publié : 11 juil. 2016, 10:57
par Sopalin
Merci pour vos retour,

Je me penche sur le solution avec Locative, je viens de l'installer.
Je vous ferais un retour si ça fonctionne.

Pour info mes tentatives avec Nmap sont un échec lol

Re: Détection de présence iPhone

Publié : 11 juil. 2016, 13:15
par Sopalin
Il y a aussi la possibilité d'interroger la box via api pour récupérer les devices connectés.
J'ai tester sur ma livebox mais impossible de récupérer la liste de mon coté, peut être que d'autre auront plus de succès avec d'autre box.

Re: Détection de présence iPhone

Publié : 11 juil. 2016, 21:27
par georges.attali
Bonjour,
suite au message de papoo, j'ai fait quelques tests, je crois que papoo a raison sur un point (le ping ne réponds pas ou répond mal), par contre, je maintiens que fait que os.execute renvoie 0 si le ping a marché (FAUX)

j'ai corrigé dans le code.

Merci !