Récupérer les infos météo du site Infoclimat

Bonjour,

Je partage ci-dessous une version améliorée du code publié sur l’ancien forum
permettant de récupérer les informations sur le site Infoclimat.

Dans un scénario :

  • définir une programmation => regarder quand les données sont actualisées et ne pas mettre trop court, il y a une sécurité le site quand il y trop de demandes
  • créer un bloc code
  • y insérer le code suivant en changeant :
    – l’url de la page
    – les noms des commandes (il faut créer un virtuel et ses commandes avec le plugin virtuel)
  • éventuellement, dans l’objet virtuel, aller dans Configuration avancée, descendre à la liste des commandes et aller dans les propriétés de Rafraichir et dans l’onglet Configuration > Action après exécution de la commande ajouter un appel à votre scenario avec dans Tags maj=1 (cela permet de forcer le rafraîchissement quand on clique sur la double flèche)
// On récupère les tags du scénario
$tags = $scenario->getTags();
// On extrait l'éventuel tag maj
$maj = $tags['#maj#'];

// Carpentras  

  $url = "https://www.infoclimat.fr/observations-meteo/temps-reel/carpentras/07586.html";
  $data = file_get_contents($url);
  @$dom = new DOMDocument();
  libxml_use_internal_errors(true);
  $dom->loadHTML($data);
  libxml_use_internal_errors(false);

  $xpath = new DomXPath($dom);

  $j1 = 0;$j2 = 0;
  $s = 1; // 1 si colonne avec liens vers stations météo 

  //$node = $xpath->query("//*[@id=\"tableau-releves\"]/thead/tr/th[2]/a");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/thead/tr/th[3]/a");
  $val = $node[0]->nodeValue;
  $scenario->setLog("Colonne 'Temps' ? : ".$val);
  if ($val === "Temps") {
    $j1 = 1;//Ajout d'une colonne dans le tableau
  }
  $scenario->setLog("Valeur de j1 : ".$j1);
  //$node = $xpath->query("//*[@id=\"tableau-releves\"]/thead/tr/th[".(3+$j)."]/a");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/thead/tr/th[".(6+$s+$j1)."]/a");
  $val = $node[0]->nodeValue;
  if ($val === "Bio-météo") {
    $j2 = 1;//Ajout d'une colonne dans le tableau
  }
  $scenario->setLog("Valeur de j2 : ".$j2);

  //Heure
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/th/span");
  $nouvelle_heure = preg_replace ('#h$#','h00',$node[0]->nodeValue);
  $cmd = cmd::byString("#[Météo][Carpentras][Heure]#");
  $ancienne_heure = $cmd->execCmd();
  $scenario->setLog("Carpentras ".$ancienne_heure. " vs ".$nouvelle_heure);

  //Température
  $i = 1 + $s;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span[1]");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
  $nouvelle_temp = $node[0]->nodeValue;
  $scenario->setLog("Carpentras - Température ".$nouvelle_temp);

 if ( ($nouvelle_heure != $ancienne_heure || $maj) && ($nouvelle_heure != "") && ($nouvelle_temp != "") )  {
  
  //Mise à jour heure et température
  $scenario->setLog("=> Mise à jour Carpentras");
  $cmd->event($nouvelle_heure);
  cmd::byString("#[Météo][Carpentras][Température]#")->event($nouvelle_temp);

  //Pluie
  $i = 2 + $s + $j1;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span/text()");
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]");   
  cmd::byString("#[Météo][Carpentras][Pluie]#")->event($node[0]->nodeValue);
   
  //Humidité
  $i = 4 + $s + $j1;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
  cmd::byString("#[Météo][Carpentras][Humidité]#")->event($node[0]->nodeValue);
 
  //Point de rosée
  $i = 5 + $s + $j1 + $j2;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
  cmd::byString("#[Météo][Carpentras][Point de rosée]#")->event($node[0]->nodeValue);

  //Vent
  $i =  3 + $s + $j1;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/span[1]");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[1]");
  cmd::byString("#[Météo][Carpentras][Vent]#")->event($node[0]->nodeValue);
   
  //Rafales
  $i = 3 + $s + $j1;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]/span[4]"); 
  $valeur = $node[0]->nodeValue;
  //$tmp1 = strrchr($valeur, '(');$valeur = substr($tmp1, 1, strpos($tmp1, ')') -1); // On récupère la valeur entre parenthèses
  cmd::byString("#[Météo][Carpentras][Rafales]#")->event($valeur);
   
  //Pression
  $i = 6 + $s + $j1 + $j2;
  //$node = $xpath->query("//*[@id=\"cdata0\"]/td[".$i."]/text()");
  $node = $xpath->query("//*[@id=\"resptable-releves\"]/tbody/tr[1]/td[".$i."]"); 
  cmd::byString("#[Météo][Carpentras][Pression]#")->event($node[0]->nodeValue);

  //Précipitations
  $precipitations = 0;
  for ($k = 3; $k <= 12; $k++) {
    $node = $xpath->query("//*[contains(@class, \"recap-clim-resp\")]/tr[".$k."]/td[1]");
    $texte = $node[0]->nodeValue;
    $scenario->setLog("Libellé :  $texte");
    if (stripos($texte, 'Cumul 24h glissantes') !== FALSE) {
     $scenario->setLog("Match trouvé");
     $node = $xpath->query("//*[contains(@class, \"recap-clim-resp\")]/tr[".$k."]/td[2]/div");
     $precipitations = $node[0]->nodeValue;
    }
  }
  cmd::byString("#[Météo][Carpentras][Précipitations 24h]#")->event($precipitations);
   
 }

Attention, l’affichage des informations n’est pas toujours exactement le même selon les stations météo et certains colonnes sont ajoutées / supprimées dynamiquement => il faudra peut-être adapter un peu le code.

Edit : code mis à jour suite changement d’affichage avril 2020

1 « J'aime »

Merci Seb821 pour le partage.
Un question complémentaire; Comment fais tu le debuggage de ton code ?
Utilises-tu un logiciel spécifique ?
F12 de Chrome ?
la methodes des Logs ?
merci pour ton retour…

J’utilise le log du scénario avec la commande $scenario->setLog().

Et pour trouver les requêtes qui vont bien, je fais clic droit sur l’élément > Inspecter > Clic droit > Copy > Copy Xpath. Cela donne la chaîne à utiliser. Parfois il faut essayer avec un élément un peu différent (par exemple, le clic droit sélectionne de base la balise TD qui est une cellule du tableau, mais dans certains cas comme pour le vent pas exemple il faut aller sélectionner la balise SPAN qui est un élément de texte).

Edit : dans l’expression obtenue avec « Copy Xpath », il faut remplacer les " par " comme cela est fait dans le code.

Merci a toi.
je viens d’expérimenter et c’est effectivement plus simple pour s’y retrouver

Bonsoir,
j’essaye d’expérimenter mais je ne comprends pas le fonctionnement des virtuels.

Merci beaucoup, cela fonctionne top avec une station météo à quelques centaines de mètre de chez moi

Bonjour Seb821 et merci pour le Tuto. Peux tu être plus précis sur les commandes a créer dans le virtuel ? Type info numérique ? Peux tu nous transmettre un exemple de commande ? D’avance merci

Oui, type numérique. Pour le code que j’ai donné, les commandes se trouvent dans un virtuel nommé « Carpentras » qui est dans un objet nommé « Météo ».

image

Pour info, le site a changé toute sa présentation il y a environ une semaine. Du coup le code ne fonctionnait plus. J’ai mis à jour le code. Si vous voyez une erreur, dites le moi (en fait le nombre de colonnes n’est pas toujours le même et c’est compliqué à gérer ; il faudrait que je refasse à l’occasion ce que j’avais avant et qui regardait le titre de la colonne mais c’est plus lourd).

1 « J'aime »

bonsoir,
Surement une question bête, mais où on trouve le script?

Merci d’avance

Dans le tout premier post de ce sujet.

Pardon je n’avais pas tout lu…
N’y comprenant pas grand chose j’essaye de récupérer la station du mont aigoual, mais pas moyen d’avoir les rafales.
une idée?
Merci

Hello,

Merci pour ta MAJ.
Je n’avais même pas fait attention aux soucis.

Dans les évolutions du code, ce serait bien de mettre un test qui vérifie si l’on récupère bien les données.
Pour ma part je vais mettre en place un test qui me vérifie deux fois dans la journée si l’heure est la même et si la différence d’humidité et de température, par rapport au plugin officiel n’est pas trop grand.

Moi ma station n’existe plus sur le site :frowning:

Idem pour moi la plus proche se trouve désormais à 8km :frowning:

C’est possible, mais si le test échoue que faire ? Mettre la valeur à 0 ou -1 ? Générer une alerte ? Là je pense que c’est le choix de chacun de voir comment il souhaite gérer la surveillance de la remontée d’information.

Avec un virtuel et la fonction valueDate c’est d’ailleurs très facile : (#timestamp#-valueDate(#[Météo][Carpentras][Température]#, U))/60 permet d’avoir le temps en minute depuis le dernier changement de valeur, et si on ajoute < XX on obtient un binaire.

Ou sinon le plugin Watchdog, encore plus simple.

Je pensais tout simplement mettre l’envoi d’un message via Telegram, Pushover, Mail ou autre…
Chacun pourra adapter suivant l’outil qu’il utilise.

Ce ne sera pas plus compliqué qu’adapter le code par rapport à sa station.

En tout cas, voilà comment je voyais les choses.

Mais effectivement, avec Watchdog (que je vais tester du coup), cela peut effectivement être la bonne solution.

Hello,

Pour ma part, aujourd’hui les infos ont été décalées.
La colonne pluie a disparue du site. Si je vais sur le jour précédent, elle est présente.

Il faudrait pouvoir se baser sur le titre de la colonne et non sur le numéro de colonne.
Car corriger le tir est facile mais si chaques x semaines, il faut le faire, cela devient problématique.
Je vais voir à l’occasion avec un ami s’il peut faire cette modification.

Bonjour
J’ai mis votre code sur mon jeedom et changé les numéros de colonne pour que les infos correspondent.
cependant, je bloque sur l’info Vents rafales.
Pouvez vous donner le code pour choper la valeur ?
merci !

Doublon de Extraire valeur vent rafale infoclimat

Faut pas déterrer les anciens posts :wink: