Plugin méteofrance basé sur la géoloc

Bonjour,

une petite quesiton/demande d’evolution.
Aujorud’hui, le plugin meteofrance se base sur la localisation Jeedom (ou geotrav, que je trouve beaucoup trop lourd pour cet usage).

Serait-il possible de rajouter une option pour pouvoir utiliser une commande info de type coordonnées GPS pour avoir un affichage plus dynamique de la météo ?
1 - si coordonnées GPS : recherche de la ville/zip (qui semblent être utilisés pour l’API meteofrance) via l’api adresse : https://api-adresse.data.gouv.fr/reverse/?lon=XXXX&lat=YYY
2 - si coordonnées GPS évoluent (ou libellé ville) forçage de la recup des données toutes les XX h

Mon usage, j’ai des pages meteo sur mon tel via plugin-jeedomconnect qui s’appuient sur ce plugin et j’ai la remontée GPS de ma localisation qui remonte de plugin-jeedomconnect vers Jeedom. Donc, avec l’usage des coordonnées GPS, la méteo suivre mes deplacements sur JC :slightly_smiling_face:

Encore merci en tout cas pour la reprise de ce plugin !!!

Norbert

Une petite relance au cas le sujet soit passé à travers

Norbert

J’ai bien vu le sujet.
Je regarderai mais pas dans l’immédiat.
Surtout si ça peut fonctionner avec geotrav.
Mais pas certain que ça fonctionne, le nom de la ville et le code postal sont les points d’entrée actuels du plugin.
Peut-être en forçant les lat et lon dans la configuration de l’équipement.

Oui, c’est pour cela que j’ai donné l’adresse de l’api-adresse.gouv.fr qui permet à partir des lat-lon de trouver la ville et le code postal.

Norbert

Le plugin utilise déjà l’API adresse fr mais en sens inverse ville et code postal donnent les lat, lon et le code insee pour les marées.
La plupart des fonctions n’utilisent que lat et lon.

Bonjour,
Pas vraiment une évolution du plugin mais un bloc code de scénario permettant de faire varier la localisation et obtenir la météo du lieu à partir de coordonnées GPS.
Il faut bien sur que l’équipement MeteoFrance et sa localisation geotrav soient dédiés à ce fonctionnement. Ils sont modifiés par ce scénario.
Le code est à personnaliser avec l’ID de l’équipement et la commande qui contient les coordonnées GPS
A vous de mettre un déclencheur à ce scénario adapté à vos besoins: Chaque heure, dés que votre position change … Attention à ne pas submerger les serveurs MF !

Le bloc code
 // Version initiale: 14/07/2023 08:30
 //      - 14/07/2023 10:30 Controle si le geotrav est manuel
$eqptMF = "1756"; // ID de l'équipement MF à modifier. Il doit utiliser une localisation geotrav
$posCmd = '#[Test][Tel JP plugin JC][Position]#'; // commande JC contenant la position sous la forme latitude , longitude

$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]);
        // 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("Context $context");
      $ctx = explode(',',$context); $newDept = $ctx[0];
      $scenario->setLog("$newLat,$newLon ==> $newZip $newCity Insee: $newInsee Dept: $newDept");

        // MAJ du geotrav
      $scenario->setLog("Geotrav ID : " .$geotrav->getId());
      $geotrav->setConfiguration("staticPostal",$newZip);
      $geotrav->setConfiguration("staticCity",$newCity);
      $geotrav->setConfiguration("staticGps","$newLat,$newLon");
      $geotrav->save();
        // 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 {
      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");
    }
  }
}

Voir aussi la version de @ngrataloup ci-dessous

Bonne utilisation et bons tests.
JP

1 « J'aime »

merci je vais tester : mais il faut aussi Geotrav : comment fait on pour indiquer au code ou se trouve l’ID de Geotrav ?
merci

Pas besoin de préciser le geotrav.
A partir de l’ID de l’équipement MF, le scénario récupère le geotrav utilisé.

cela fonctionne ! excellent ! merci

1 « J'aime »

Modification du bloc code dans le post au dessus pour contrôler si le geotrav est en mode Manuel

Merci, c’est parfait !!!
Paramétrage nécessaire pour tous ceux qui arrivent sur ce post :
Coté geotrav :

Coté plugin météo :

Pour l’instant, je mets à jour toutes les heures. j’essayerai d’améliorer les choses pour faire un update dès lors que la modif de position est supérieure à XX km depuis le dernier update

Norbert

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 »

Maintenant que je vois ce que tu voulais, je vais regarder pour l’intégrer dans le plugin. :wink:

Ya des trucs que t’aurais oublié ? :thinking:

Comme ça, je ne vois pas trop … Ton bloc code correspondait bien au cahier des charges

Merci ca marche super bien !!

C’est exactement ce que j’essayais de faire sans y arriver :wink:

Petite question en plus : possible de recuperer la rue afin d’avoir une adresse complète ? (Jai vu via l api que c’était possible je vais essayer de bidouiller mais je ne suis pas tres douee pour ca)

Bonsoir @MyMy

il suffit que tu rajoutes la ligne :

$newAdress = $json['features'][0]['properties']['name'];

et ensuite

$geotrav->setConfiguration("staticStreet", "$newAdress") ;

Au milieu des commandes équivalentes

ca te génèrera les commandes suivantes dans ton équipement geotrav
[Adresse] → adresse totale (rue + code postal + ville)
[Rue] → juste la rue

Norbert

merci Norbert c’est très sympa de ta part et ca marche parfaitement :slight_smile:

Bonjour,
Je rebondis sur ce sujet (même s’il n’est pas tout à fait en correspondance avec ma requête):
J’habite en zone limitrophe entre deux départements, ce qui implique que les alertes météos ne s’appliquent pas forcement à mon domicile (aujourd’hui, mon département est en alerte vigilance vents jaune, ce qui n’est pas le cas à 2km de chez moi)
Ayant justement avec ce type d’alerte des blocages de mes volets battants (pour éviter les dégâts), je me retrouve dans le noir alors que sur ma ville il ne devrait y avoir de rafales au dessus de 25km/h, aussi, je souhaiterais ajouter un deuxième objet météo dans le bourg voisin pour comparer les deux vigilances ; cependant, n’utilisant pas geotrav, je peux créer des objets uniquement basés sur la configuration Jeedom. Serait-il possible d’ajouter une seconde adresse par un autre bief?

Merci d’avance (et milles mercis pour ce plugin très abouti :slightly_smiling_face: )

Bien cordialement