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
Encore merci en tout cas pour la reprise de ce plugin !!!
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.
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");
}
}
}
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
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)
C’est exactement ce que j’essayais de faire sans y arriver
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)
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 )