Script LUA géoloc apple

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Script LUA géoloc apple

Message 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.
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Script LUA géoloc apple

Message 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
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Script LUA géoloc apple

Message 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...
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Script LUA géoloc apple

Message 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
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Script LUA géoloc apple

Message 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.
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Script LUA géoloc apple

Message 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...
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Script LUA géoloc apple

Message 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.
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
chacal62
Messages : 63
Inscription : 14 juin 2015, 20:47

Re: Script LUA géoloc apple

Message 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
e111111
Messages : 225
Inscription : 11 déc. 2018, 19:44

Re: Script LUA géoloc apple

Message 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.
Domoticz V4.10 sur Synology DS216j (DSM 6.3), clef Z-Wave Sigma
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Script LUA géoloc apple

Message 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
Répondre