Pierre5555 a écrit : ↑19 août 2019, 18:26
Bonjour,
J'ai un petit souci avec le calcul de la distance sur un des mes smartphones.
J'utilise le plugin Geoloc avec 2 smartphones android et tasker depuis plus d'un an, et tout fonctionne parfaitement.
Depuis quelques jours j'ai voulu l'utiliser aussi pour un Iphone, mais je n'ai pas réussi à m'identifier correctement sur le plugin Geoloc.
Par contre, j'ai pu récupérer les coordonnées GPS de l'Iphone avec le plugin Ios Icloud, qui fonctionne sans soucis, mais qui donne les coordonnées GPS avec beaucoup de nombres après la virgule (en fait après le point).
A l'aide d'un petit scenario qui inclut un code PHP qui recréé les coordonnées GPS avec seulement 6 digit après la vigule, je force ensuite ces données dans la valeur dynamique de l'IPhone.
Quand je teste la valeur des coordonnées GPS dynamique, elles sont bonnes. Et la carte (cf image jointe) fonctionne aussi.
Par contre, impossible de récupérer la distance, pourquoi ?
Je me réponds à moi-même car j'ai trouvé une solution si ca peut aider d'autres personnes.
J'ai fait quelques lignes de code PHP dans un scenario qui recalcule la distance et qui la met à la bonne place.
Il suffit pour cela dans scenario de choisir CODE (comme on choisit Pause ou event)
Puis d'utiliser le code ci-dessous, en mettant bien sûr à jour les champs, pour cela, j'utilise un faux event dans mon scénatio qui peut facilement aller chercher la bonne description, et je le supprime à la fin ou je ne l'active pas pour ne pas gêner le scenario.
Le code est loin d'être optimisé parce que je découvre PHP, mais c'est bien pratique
# Calcul de la distance entre 2 coordonnées GPS
# Recupère la chaine de caractère "lat,long" de Icloud
$cmd = cmd::byString("#[Reseau Informatique][iPhone de Cath][Localisation]#");
$LocalisationGpsPhone = $cmd->execCmd();
# Recupère la chaine de caractère "lat,long" de la maison
$cmd = cmd::byString("#[Reseau Informatique][Localisation Iphone Cath][Maison Seti]#");
$LocalisationGpsHome = $cmd->execCmd();
# Isole les Latitudes et longitude dans les chaines de caractères et récupère les valeures numériques
$PosCommaPhone = stripos ($LocalisationGpsPhone, ',');
$LatPhone = substr ($LocalisationGpsPhone,0,9);
$LongPhone = substr ($LocalisationGpsPhone,$PosCommaPhone+1,8);
$PosCommaHome = stripos ($LocalisationGpsHome, ',');
$LatHome = substr ($LocalisationGpsHome,0,9);
$LongHome = substr ($LocalisationGpsHome,$PosCommaHome+1,8);
$ValLongPhone = (float)$LongPhone;
$ValLatPhone = (float)$LatPhone;
$ValLongHome = (float)$LongHome;
$ValLatHome = (float)$LatHome;
$ValEarthRadius=6371000;
# calcule la distance entre les 2 coordonnées GPS
$DistY = $ValEarthRadius * pi() * ( $ValLatPhone - $ValLatHome ) / 180;
$DistX = $ValEarthRadius * cos($ValEarthRadius*pi()*($ValLatPhone+$ValLatHome)/(2*180)) * pi()*($ValLongPhone-$ValLongHome)/180;
$Dist = round (0.1 * sqrt ($DistX*$DistX + $DistY*$DistY)) * 0.01;
# Place dans la variable Jeedom la distance à la bonne place
$cmdC = "#[Reseau Informatique][Localisation Iphone Cath][Distance Iphone Cath-Maison]#";
$cmd = cmd::byString($cmdC);
$cmd->event(((string)$Dist));
# Recrée avec le bon nombre de digit (6) la localisation GPS (. = + pour les strings)
$Localisationgps = $LatPhone . ", " . $LongPhone;
# Place dans la variable Jeedom la nouvelle forme de coordonnées GPS
$cmdC = "#[Reseau Informatique][Localisation Iphone Cath][Iphone Cath]#";
$cmd = cmd::byString($cmdC);
$cmd->event(($Localisationgps));
Pierre.
Jeedom Smart Zwave+
Dongle Enocean USB 310
Blea avec dongle UD100 sur Raspberry Pi 3
Webrelay commandé par script