Plugin méteofrance basé sur la géoloc

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

3 « J'aime »