Du coup, rajout de quelques fonctionnalités :
1 - control de la distance depuis la dernière position utilisée. Si la distance est < $distanceMin, pas de recalcul de la position pour la météo et pas de recalcul forcédes données météo ( /!\ si scenario lancé par cron planifié ou manuellement, le contrôle sur la distance n’est pas effectué
2 - si le zipcode est identique (même ville), pas de recalcul forcé des données météo (permet de laisser le plugin météo travailler normalement et de limiter les appels au site météofrance
3 - rajout d’une fonction pour extraire l’altitude de la position et l’inserer dans geotrav
Bloc code
// Version initiale: 14/07/2023 8:30
// - 14/07/2023 10:30 Controle si le geotrav est manuel
// - 14/07/2023 18:30 Controle sur la distance
// Controle sur l'evolution du zipcode pour forcer un rechargement des données météo
// Rajout de l'altitude dans les données recupérées sur geotrav
$eqptMF = "1547"; // ID de l'équipement MF à modifier. Il doit utiliser une localisation geotrav
$posCmd = '#[test][test][Position]#'; // commande JC contenant la position sous la forme latitude, longitude
$distanceMin = 20; // distance minimale pour mettre à jour la localisation
$altitudeUptdate = 1 ;// mise à jour de l'altitude dans l'equipement Geotrav
$trigger = $scenario->getRealTrigger() ; // trigger de lancement du scenario : Si user ou schedule, recalcul du positionnement,
// si autre, recalcul seilement si $distance > $distanceMin
$MF = eqLogic::byId($eqptMF);
if (is_object($MF)) {
$geoloc = $MF->getConfiguration('geoloc', 'none');
if ($geoloc == 'none' || $geoloc == 'jeedom') {
$scenario->setLog("Unable to change geoloc type: '$geoloc'");
} else {
$geotrav = eqLogic::byId($geoloc);
if (is_object($geotrav) && $geotrav->getEqType_name() == 'geotrav' && $geotrav->getConfiguration("typeConfLoc", '') == 'static') {
// récupération latitude et longitude contenues dans la commande
$pos = cmd::byString($posCmd)->execCmd();
$valPos = explode(',', $pos);
$newLat = trim($valPos[0]);
$newLon = trim($valPos[1]);
// calcul de la distance depuis derniere MAJ
$oldPos = explode(',', $geotrav->getConfiguration("staticGps"));
$oldLat = trim($oldPos[0]);
$oldLon = trim($oldPos[1]);
$latFrom = deg2rad($oldLat);
$lonFrom = deg2rad($oldLon);
$latTo = deg2rad($newLat);
$lonTo = deg2rad($newLon);
$earthRadius = 6371000;
$lonDelta = $lonTo - $lonFrom;
$a = pow(cos($latTo) * sin($lonDelta), 2) + pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
$b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);
$angle = atan2(sqrt($a), $b);
$distance = round($angle * $earthRadius / 1000, 0);
if ($distance >= $distanceMin || $trigger == 'user' || $trigger == 'schedule' ) {
// deplacement > à $distancemin -> mise à jour de la position
if ($distance >= $distanceMin) $scenario->setLog("Déplacement de $distance km : Mise à jour de la position");
// Interrogation API adresse pour avoir la ville et son code postal
$url = "https://api-adresse.data.gouv.fr/reverse/?lon=$newLon&lat=$newLat";
$json = meteofrance::callURL($url);
$newZip = $json['features'][0]['properties']['postcode'];
$newCity = $json['features'][0]['properties']['city'];
$newInsee = $json['features'][0]['properties']['citycode'];
$context = $json['features'][0]['properties']['context'];
$scenario->setLog("Contexte : $context");
$ctx = explode(',', $context);
$newDept = $ctx[0];
$scenario->setLog("$newLat,$newLon ==> $newZip $newCity Insee: $newInsee Dept: $newDept");
if ( $altitudeUptdate ) {
// Interrogation API IGN pour récupération altitude :
$url = "https://wxs.ign.fr/calcul/alti/rest/elevation.json?lon=$newLon&lat=$newLat&zonly=true";
$data = file_get_contents($url);
$jsonData = json_decode($data, true);
$altitude = round($jsonData['elevations'][0], 0);
$geotrav->setConfiguration("staticElevation", "$altitude");
$scenario->setLog("Altitude : $altitude m") ;
}
// MAJ du geotrav
$scenario->setLog("Geotrav ID : " . $geotrav->getId());
$geotrav->setConfiguration("staticPostal", $newZip);
$geotrav->setConfiguration("staticCity", $newCity);
$geotrav->setConfiguration("staticGps", "$newLat,$newLon");
$geotrav->save();
if ( $MF->getConfiguration('zip') != $newZip ) {
// MAJ de la configuration de l'equipement MF
$MF->setConfiguration('lat', $newLat);
$MF->setConfiguration('lon', $newLon);
$MF->setConfiguration('zip', $newZip);
$MF->setConfiguration('ville', $newCity);
$MF->setConfiguration('insee', $newInsee);
$MF->setConfiguration('numDept', $newDept);
// reset des heures d'appels afin de forcer la MAJ de la météo
$MF->setConfiguration('lastHourlyCall', 0);
$MF->setConfiguration('lastInstantCall', 0);
$MF->setConfiguration('lastTideCall', 0);
$MF->save(true);
$MF->getInformations();
}
else {
$scenario->setLog("Meme code postal $newZip : PAS de Mise à jour forcée des données météo");
}
} else {
$scenario->setLog("Déplacement de $distance km : PAS de Mise à jour de la position");
}
} else {
if (is_object($geotrav)) {
$scenario->setLog("Configuration geotrav [" . $geotrav->getName() . '] : Type: ' . $geotrav->getEqType_name() . ' Mode: ' . $geotrav->getConfiguration("typeConfLoc", ''));
} else {
$scenario->setLog("Geotrav ID $geoloc not found");
}
}
}
}
Permet ainsi d’avoir 2 declencheurs
- 1 declencheur planifié (Toutes les heures chez moi)
- 1 déclencheur provoqué, la position GPS
Norbert