Page 1 sur 3
Script LUA géoloc apple
Publié : 11 déc. 2018, 20:05
par e111111
Bonjour à tous,
petit nouveau sur le forum, je pratique la domotique, qui est pour moi un loisir, depuis 1 an et demi.
Je me suis monté un petit Domoticz sur NAS Synology avec tout plein de petites fonctions sympas, en apprenant au gré des infos trouvées sur les différents forums trouvés sur le net?
Encore pas mal d'évolutions à venir, mais petit à petit, car souvent en plus du soft je réalise aussi le matériel.
Pour en venir à ma question, j'avais jusqu'ici un service de loc de mon iPhone (avec adresse et état batterie) qui marchait très bien, mais depuis le 30 juillet plus rien, je n'ai pas eu le temps de m'en occuper jusqu'ici et je planche donc la dessus depuis quelques jours.
J'ai donc appris que les API google sont passées payantes et qu'il faut passer par autre chose, soit, mais il semble aussi que le code qui va chercher les infos sur icloud ne fonctionne plus non plus, le résultat de la requête est vide, et là je ne comprends pas.
J'ai essayé tout ce que j'ai pu trouver comme script LUA pour aller chez le monsieur à la pomme, mais rien ne tourne, et je ne trouve aucun post récent sur ce sujet, j'ai regardé les histoires de SSL, option -k ... trouvées sur un forum Anglais, mais rien y fait...
Quelqu'un a une idée ?
Merci d'avance pour votre aide.
Re: Script LUA géoloc apple
Publié : 11 déc. 2018, 20:20
par Datawolf
Salut,
J'avais une réponse vide mais avec l'option k ça marche.
Le json est invalide, mais la réponse est exploitable.
@+
Datawolf
Re: Script LUA géoloc apple
Publié : 11 déc. 2018, 21:01
par e111111
Merci pour ta réponse, tu peux m'en dire un peu plus ?
Je ne comprends pas comment faire si le json n'est pas exploitable, je vais rajouter le K et regarder ce que donne le résult, mais après
je ne saurais pas trop quoi faire avec, je ne maitrise pas encore à fond le LUA...
Re: Script LUA géoloc apple
Publié : 12 déc. 2018, 09:39
par Datawolf
Il "suffisait" peut-être de réparer le json (en ajoutant une accolade manquante, ou que sais-je).
Moi j'ai extrait les infos qui nous intéressent avec des string.sub
Re: Script LUA géoloc apple
Publié : 12 déc. 2018, 14:17
par e111111
Merci,
je ne suis probablement pas assez compétent pour "réparer" le json, mais je vais explorer la piste de la récup du contenu si
l'argument K fait l'affaire.
Re: Script LUA géoloc apple
Publié : 12 déc. 2018, 14:19
par Datawolf
J'essaierai de publier une version du script avec cette partie réparée.
Pour l'instant j'ai un retour waze vide mais qui sait, petit à petit...
Re: Script LUA géoloc apple
Publié : 12 déc. 2018, 22:52
par e111111
Salut,
j'ai trouvé, à force de chercher dans tous les sens et de tester tout un tas de scripts à cause du pb dû à Google et du -k, la ligne suivante avait sauté :
json = (loadfile "/usr/local/share/lua/5.2/json.lua")()
Maintenant je récupère bien les datas d'iCloud, reste plus qu'à les remettre en forme, merci de m'avoir mis sur la piste.
Re: Script LUA géoloc apple
Publié : 17 déc. 2018, 20:43
par chacal62
Bonsoir , quel service utilisez vous afin de remplacer l’api De Google ? Et l’option -k se place ds la commande curl ? Pourriez vous poster votre script , afin de mieux comprendre la marche à qui reb svp , c’etait très pratique cette géolocalisation , d’avance merci
Re: Script LUA géoloc apple
Publié : 19 déc. 2018, 14:42
par e111111
Bonjour Chacal,
Pour le moment je n'ai pas encore étudié de près le service pour renvoyer l'adresse postale, il faut que je regarde Waze et OpenStreetMap, qui devraient pouvoir remplacer google, mais ce n'est pas ma priorité.
Pour l'utilisation des infos iCloud, il faut mettre quelque chose comme ça :
"curl -sk -X POST -D - -o /dev/null -L -u '" .. username .. ":" .. password .. "
........↑
On trouve des scripts plus ou moins équivalents un peu partout sur le net, sur ce forum je te renvoie à ce post :
viewtopic.php?f=17&t=5415
Quand au mien, il n'est pour le moment pas publiable, c'est un agloméra de tout ce que j'ai pu trouver à droite et à gauche,
c'est en plein débug avec des lignes de test partout.
Pour ma part, ce qui m'interressait surtout était d'avoir l'état batterie, si le tel est en mouvement ou pas, et à quelle distance de la maison, en prime j'ai même quelques infos comme les km et le temps estimé pour rentrer à la maison.
La distance et le mouvement me sont surtout utiles pour changer le taux de rafraichissement des infos, donc les appels au script et induire par conséquent une décharge moindre de la batterie.
Re: Script LUA géoloc apple
Publié : 19 déc. 2018, 15:27
par Datawolf
Hello,
Voici comment j'exploite le retour d'iCloud:
Code : Tout sélectionner
function mabidouille(name, string)
-- on cherche la valeur, on coupe avant
deb, fin = string.find(string, name)
value = string.sub(string, fin + 3)
-- on cherche la virgule qui la suit mais ça peut être la dernière valeur (suivie par '}')
deb1 = string.find(value, ',')
deb2 = string.find(value, '}')
deb = math.min(deb1, deb2)
value = string.sub(value, 1, deb - 1)
-- on supprime les double quotes dans le cas d'une chaine
len = string.len(value)
if string.sub(value, 1, 1) == '"' and string.sub(value, len, len) == '"'
then
value = string.sub(value, 2, len - 1)
end
return value
end -- function mabidouille
-- Fonction de recuperation des informations icloud
-- Renvoi les informations du telephone (GPS, Batterie, Status...)
function icloud(username,password,devicename,UDID)
-- local url = 'curl -s -X POST -L -u "' .. username .. ':' .. password .. '" '
-- "s" is "silent"
-- "k" added for "Allow connections to SSL sites without certs"
local url = 'curl -sk -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: '..UDID..'" '
.. '-H "Accept-Language: en-us" '
.. '-H "Connection: keep-alive" https://fmipmobile.icloud.com/fmipservice/device/' .. username ..'/initClient'
local handle = assert(io.popen(url))
local result = handle:read("*a")
handle:close()
-- DEBUT remplacement Datawolf
-- car le json est invalide => on va extraire ce qui nous intéresse
-- output = json:decode(result)
-- --On recherche le device associé au devicename de l'utilisateur
-- for key,value in pairs(output.content) do
-- if value.name == devicename 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
-- device = {
-- batlvl = math.floor(value.batteryLevel * 100 / 1);
-- batstat = value.batteryStatus;
-- accuracy = value.location.isInaccurate;
-- latitudeGPS = value.location.latitude;
-- longitudeGPS = value.location.longitude;
-- positionType = value.location.positionType;
-- timestampupdate = value.location.timeStamp;
-- horizontalAccuracy = value.location.horizontalAccuracy
-- }
-- return device
-- elseif value.isLocating == false or value.location == nil or value.location.isInaccurate == true or value.location.isOld == true or value.location.locationFinished == false then
-- print(script..'Retour icloud: probleme')
-- return nil
-- else
-- print(script..'Retour icloud: probleme')
-- return nil
-- end -- if value.isLocating
-- end -- if value.name
-- end -- for
thename = mabidouille("name", result)
print('iCloud a répondu, le device est='..thename)
if thename == devicename then
isLocating = ( mabidouille("isLocating", result) == 'true' )
isInaccurate = ( mabidouille("isInaccurate", result) == 'true' )
isOld = ( mabidouille("isOld", result) == 'true' )
locationFinished = ( mabidouille("locationFinished", result) == 'true' )
-- --On verifie que le device est localisé depuis peu pour recuperer les valeurs importantes
if isLocating == true and accuracy ~= true and isOld ~= true then
device = {
batlvl = math.floor(mabidouille("batteryLevel", result) * 100 / 1);
batstat = mabidouille("batteryStatus", result);
isInaccurate;
latitudeGPS = mabidouille("latitude", result);
longitudeGPS = mabidouille("longitude", result);
positionType = mabidouille("positionType", result);
timestampupdate = mabidouille("timeStamp", result);
horizontalAccuracy = mabidouille("horizontalAccuracy", result)
}
return device
elseif isLocating == false or isInaccurate == true or isOld == true or locationFinished == false then
-- if isLocating then print('DEBUG'..' isLocating=true') else print('DEBUG'..' isLocating=false') end
-- if isInaccurate then print('DEBUG'..' isInaccurate=true') else print('DEBUG'..' isInaccurate=false') end
-- if isOld then print('DEBUG'..' isOld=true') else print('DEBUG'..' isOld=false') end
-- if locationFinished then print('DEBUG'..' locationFinished=true') else print('DEBUG'..' locationFinished=false') end
print('Retour icloud: pas de localisation récente')
return nil
else
print('Retour icloud: problème non identifié')
return nil
end -- if isLocating
end -- if thename
-- FIN remplacement Datawolf
end -- function icloud
C'est pas optimisé mais ça marche.
@+
Datawolf