Propluvia intégré à Jeedom

voilà là bonne syntaxe pour ce que tu veux faire :

$date = date('Y-m-d');
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/".$date."/commune/63113");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_VERBOSE, true);

$headers = 
array(
   "User-Agent: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
   "Content-Type: application/json",
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
$scenario->setLog("CURL :".$result);
curl_close($ch);

il faut que tu requête avec un GET et pas un POST, il faut aussi désactiver les vérifications de certificats, d’adresse, et surtout bien remplir le header. le site en question attend une requête de navigateur, il faut donc envoyer une signature de navigateur quelconque. là j’ai copié mon safari. ta chaine json est dans result.

Merci beaucoup @neurall ,
Je vais creuser pour extraire la bonne information.
J’ai vu qu’on peut faire ça avec foreach.

Mathieu

La bible :

https://www.php.net/manual/fr/control-structures.foreach.php

Oui, je suis dessus :slight_smile:

2 « J'aime »

Bon, mes recherches et mes tests ne sont pas probants.
Les logs pour $scenario->setLog('Niveau : ’ . $jsonKey[‹ nomNiveau ›]); sont vides :frowning:

$date = date('Y-m-d');
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/".$date."/commune/63113");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_VERBOSE, true);

$headers = 
array(
   "User-Agent: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
   "Content-Type: application/json",
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
//$scenario->setLog("CURL :".$result);

foreach ($result['zoneAlerte'] as $jsonKey) {
  if ($jsonKey['nomZone'] == 'Allier rive gauche moyen') {
	$scenario->setLog('Niveau : ' . $jsonKey['nomNiveau']);
  }
}

curl_close($ch);

Je cherche à récupérer le « nomNiveau » du « nomZone »: « Allier rive gauche moyen ».
image

Où est mon erreur ?

Mathieu

Bonjour @OUARZA,
Ton idée de récupérer les info sur les restrictions d’eau m’intéresse aussi.
Du coup cela fait 3 soirées que je bricole de mon coté du code php avec des exemple glanés à droite et à gauche. Aujourd’hui j’ai obtenu un résultat fonctionnel avec les api que tu as partagé sur ce fil, dans un bloc code de scénario .

Je précise avant tout que mes connaissance en php sont très limitées et donc le code n’est certainement pas optimal
Néanmoins il permet de récupérer :

  • le nom de la commune à partir du code Isee
  • début et fin de arrêté
  • Balaye les différentes zones du département et récupère le niveau d’alerte et la légende associée

Maintenant il ne me reste plus qu’à trouver un moyen pour rechercher dans quelle zone fait parti la commune et n’afficher que celle-ci

$date = date('Y-m-d');
$codeInseeCommune = '69027';
//récupération nom commune
$url = 'https://geo.api.gouv.fr/communes?code='.$codeInseeCommune.'&fields=code,nom,contour&format=geojson&geometry=contour';
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec()), true);
if(is_array($jsonData)){
  $nomCommune = $jsonData['features']['0']['properties']['nom'];
}

//récupération info arreté
$url = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/'.$date.'/commune/'.$codeInseeCommune;
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec()), true);
if(is_array($jsonData)){
  $codeInseeDepartement = $jsonData[0]['codeInseeDepartement'];
  $dateDebutValiditeArrete = $jsonData[0]['dateDebutValiditeArrete'];
  $dateFinValiditeArrete = $jsonData[0]['dateFinValiditeArrete'];
  //affichage info arreté
  $scenario->setlog('Nom commune            : '.$nomCommune);
  $scenario->setlog('Code Insee département : '.$codeInseeDepartement);
  $scenario->setlog('Début validité arreté  : '.$dateDebutValiditeArrete);
  $scenario->setlog('Fin validité arreté    : '.$dateFinValiditeArrete);
  
  //balayage des zones
  foreach ($jsonData[0]['restrictions'] as $value=>$jsonKey) {       
    $nomNiveau = $jsonKey['nomNiveau'];
    $nomZone =  $jsonKey['zoneAlerte']['nomZone'];
    
    //recupération info détaillé sur le niveau d'alerte
    $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.strtolower($nomNiveau);    
  	$request_http_legende = new com_http($url_legende);
	$request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	$legende=json_decode(trim($request_http_legende->exec()), true);
    
    //affichage résultat
    $scenario->setlog('');
    $scenario->setlog('----------'.strtoupper($nomZone).'----------');
    $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
    $scenario->setlog($legende[0]['contenuEditorial']);
  }
}

bonne continuation :smiley:

1 « J'aime »

Bonjour @elmer69 ,
Merci beaucoup pour ta contribution.
Dans le lien https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/2022-08-2022/commune/63113, on retrouve le code Insee et un peu plus bas le nomNiveau.

array>0>restrictions>4>zoneAlerte>commune>18>codeInseeCommune
image

array>0>restrictions>4>nomNiveau
image

On ne peut pas faire un lien entre les deux ?

J’ai une erreur, je pense que le site a du mal.
https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_crise cURL error : Operation timed out after 2000 milliseconds with 0 bytes received

Mathieu

désolé, je n’ai pas trop le temps de coder en détail en ce moment. C’est bien le cas, le foreach d’elmer69 sert à ça et va en plus chercher le texte complet de commentaire associé aux zones.

ps : si tu utilises les API jeedom pour surcharger la requête CURL et récupérer les textes des arrêtés, je te conseille d’augmenter le timeout de 2 secondes par défaut qui n’est clairement pas assez long et de faire un ->exec(20) ou ->exec(30).

1 « J'aime »

Ok.
Du coup peut-on faire un lien entre le nomNiveau du fichier: https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/2022-08-05/commune/63113

et lui dire « si NomNiveau = Alerte renforcée alors XXX = legende_alerte_renforcee_part »

https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=XXX

Mathieu

1 « J'aime »

hé hé :slight_smile:
Je suis fier de moi ! Ce n’est peut-être pas super joli, mais ça fonctionne.

$date = date('Y-m-d');
$codeInseeCommune = '63113';
//récupération nom commune
$url = 'https://geo.api.gouv.fr/communes?code='.$codeInseeCommune.'&fields=code,nom,contour&format=geojson&geometry=contour';
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec(20)), true);
if(is_array($jsonData)){
  $nomCommune = $jsonData['features']['0']['properties']['nom'];
}

//récupération info arreté
$url = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/'.$date.'/commune/'.$codeInseeCommune;
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec(20)), true);
if(is_array($jsonData)){
  $codeInseeDepartement = $jsonData[0]['codeInseeDepartement'];
  $dateDebutValiditeArrete = $jsonData[0]['dateDebutValiditeArrete'];
  $dateFinValiditeArrete = $jsonData[0]['dateFinValiditeArrete'];
  //affichage info arreté
  $scenario->setlog('Nom commune            : '.$nomCommune);
  $scenario->setlog('Code Insee département : '.$codeInseeDepartement);
  $scenario->setlog('Début validité arreté  : '.$dateDebutValiditeArrete);
  $scenario->setlog('Fin validité arreté    : '.$dateFinValiditeArrete);
  
  //balayage des zones
  foreach ($jsonData[0]['restrictions'] as $value=>$jsonKey) {       
    $nomNiveau = $jsonKey['nomNiveau'];
    $nomZone =  $jsonKey['zoneAlerte']['nomZone'];
 

     }
  
     if ($nomNiveau == "Alerte renforcée"){
     $nomNiveau2 = "alerte_renforcee_part";
     $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.$nomNiveau2; 
  	 $request_http_legende = new com_http($url_legende);
	 $request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	 $legende=json_decode(trim($request_http_legende->exec(20)), true);
       $scenario->setlog('Test : '.$url_legende);
     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');   
    
  }
}

image

Je n’ai plus qu’à rechercher l’ensemble des légendes

Tu peux …
C’est mon inspecteur de la Dréal qui sera content quand je lui montrerai comment le plan Sécheresse m’impacte psychologiquement jusqu’à avoir un scénario pour connaitre dans quel seuil on se situe et pour combien de temps
Merci

Voici avec les ajouts des différentes légendes.

$date = date('Y-m-d');
$codeInseeCommune = '63113';
$eau= '';
$secteur='';
//récupération nom commune
$url = 'https://geo.api.gouv.fr/communes?code='.$codeInseeCommune.'&fields=code,nom,contour&format=geojson&geometry=contour';
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec(20)), true);
if(is_array($jsonData)){
  $nomCommune = $jsonData['features']['0']['properties']['nom'];
}

//récupération info arreté
$url = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/'.$date.'/commune/'.$codeInseeCommune;
$request_http = new com_http($url);
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$jsonData=json_decode(trim($request_http->exec(20)), true);
if(is_array($jsonData)){
  $codeInseeDepartement = $jsonData[0]['codeInseeDepartement'];
  $dateDebutValiditeArrete = $jsonData[0]['dateDebutValiditeArrete'];
  $dateFinValiditeArrete = $jsonData[0]['dateFinValiditeArrete'];
  //affichage info arreté
  $scenario->setlog('Nom commune            : '.$nomCommune);
  $scenario->setlog('Code Insee département : '.$codeInseeDepartement);
  $scenario->setlog('Début validité arreté  : '.$dateDebutValiditeArrete);
  $scenario->setlog('Fin validité arreté    : '.$dateFinValiditeArrete);
  
  //balayage des zones
  foreach ($jsonData[0]['restrictions'] as $value=>$jsonKey) {       
    $nomNiveau = $jsonKey['nomNiveau'];
    $nomZone =  $jsonKey['zoneAlerte']['nomZone'];
     }

  $scenario->setlog('Debug nomNiveau : '.$nomNiveau);
  
     if ($nomNiveau == "Crise"){
     $nomNiveau2 = "crise_part";
     $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.$nomNiveau2; 
  	 $request_http_legende = new com_http($url_legende);
	 $request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	 $legende=json_decode(trim($request_http_legende->exec(20)), true);
     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setData('Niveau_Propluvia', $nomNiveau);
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');
     $scenario->setData('Legende_Propluvia', $legende[0]['contenuEditorial']);
    
  }  else {
     if ($nomNiveau == "Alerte renforcée"){
     $nomNiveau2 = "alerte_renforcee_part";
     $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.$nomNiveau2; 
  	 $request_http_legende = new com_http($url_legende);
	 $request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	 $legende=json_decode(trim($request_http_legende->exec(20)), true);
     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setData('Niveau_Propluvia', $nomNiveau);
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');
     $scenario->setData('Legende_Propluvia', $legende[0]['contenuEditorial']);  
    
  }  else {
     if ($nomNiveau == "Alerte"){
     $nomNiveau2 = "alerte_part";
     $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.$nomNiveau2; 
  	 $request_http_legende = new com_http($url_legende);
	 $request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	 $legende=json_decode(trim($request_http_legende->exec(20)), true);
     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setData('Niveau_Propluvia', $nomNiveau);
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');
     $scenario->setData('Legende_Propluvia', $legende[0]['contenuEditorial']);
    
  }  else {
     if ($nomNiveau == "Vigilance"){
     $nomNiveau2 = "vigilance_part";
     $url_legende = 'https://eau.api.agriculture.gouv.fr/apis/propluvia/editoriaux/?idEditorial=legende_'.$nomNiveau2; 
  	 $request_http_legende = new com_http($url_legende);
	 $request_http_legende->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
	 $legende=json_decode(trim($request_http_legende->exec(20)), true);
     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setData('Niveau_Propluvia', $nomNiveau);
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');
     $scenario->setData('Legende_Propluvia', $legende[0]['contenuEditorial']);
    
  }  else {
     $scenario->setlog("Erreur de données"); 
  
     }
     }
     }
     }
}

Je vais continuer à chercher pour choisir entre « Eaux superficielles » et « Eaux souterainnes » mais également particulier vs profesionnel.
En effet, il y a plusieurs types de légendes:

legende_crise
legende_crise_part
legende_crise_pro

legende_alerte_renforcee
legende_alerte_renforcee_part
legende_alerte_renforcee_pro

legende_alerte
legende_alerte_part
legende_alerte_pro

legende_vigilance
legende_vigilance_part
legende_vigilance_pro

Mathieu

on ne l’arrête plus …

comment envoyer ce log en notification ou mail ?
désolé , je ne suis pas fortiche

Ouf, ça je sais faire facilement, je te montre.
Il faut ajouter les lignes « setData » dans le code.

     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setData('Niveau_Propluvia', $nomNiveau);
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');
     $scenario->setData('Legende_Propluvia', $legende[0]['contenuEditorial']);

Puis après tu vas chercher ton action et tu intègres tes variables « variable(nomdelavariable) ».

Par contre le site est vraiment lent et merdique et j’ai l’impression que les données ne remontent pas toujours. J’ai donc modifié le code ci-dessus (pour intégrer quand il n’y a pas de données) ou alors j’ai fait une bourde dans mon code, ce qui est fort possible.

Il faudrait aussi que j’arrive à sortir ces éléments là des IF pour soulager les lignes.

     $scenario->setlog('*** Niveau : '.$nomNiveau.' ***');
     $scenario->setlog('*** Legende : '.$legende[0]['contenuEditorial'].' ***');

Mathieu

Ce sujet m’intéresse énormément et pourquoi pas en faire un plugin peut-être plus générique permettant de récupérer diverses informations d’un même site… A voir si j’ai le temps ces prochaines semaines !

La requête suivante retourne un fichier compressé de 868kB qui te donne une ressource final de 2.2MB :
https://eau.api.agriculture.gouv.fr/apis/propluvia/arretes/2022-08-02/commune/63113

Ceci peut expliquer les lenteurs car chrome m’indique un temps de 6s pour télécharger le contenu…

Impec Merci …
sans rien y connaitre :joy: mais en regardant tes lignes de codes , j’ai rajouté 2 variables

     $scenario->setData('Propluvia_Date début', $dateDebutValiditeArrete);
  $scenario->setData('Propluvia_Date fin', $dateFinValiditeArrete);

Un raccourci sur mon tel pour envoyer la notification avec les 3 variables.
Super !

1 « J'aime »

Hello @thanaus ,
Avec plaisir !
Perso je m’y connais pas trop :smiley:

Mathieu

Bonjour @OUARZA
je vois que tu as été prolifique depuis mon post d’hier soir :wink:

oui un peu de mal de temps en temps, j’ai vu ça hier soir

pourquoi tu t’es embêté à rajouter du code pour chaque légendes? mon exemple est générique et récupère la légende associé à nom du niveau. Je vais proposer quelque chose pour différencier pro et particulier

Dans le json tu le trouves pour une zone donnée dans « typeZone » qui prend la valeur « SUP » ou bien « SOU »

merci, c’est justement ce sur quoi je vais plancher

idem, ça serait un bonne idée. Si je peux aider…

Ho merci @elmer69.
J’ai fait avec mes maigres connaissances :smiley: Heureux si j’ai pu contribuer un peu.
J’attends avec impatience le fruit de vos travaux.

Mathieu