Plugin vigilance météo : les horaires de marée ne fonctionnent plus depuis 48h

bonjour,

dans le plugin vigilance météo : les horaires de marée et coefficient ne fonctionnement plus depuis 48h
malgré le bon fonctionnement du site où les informations sont récupérées : http://maree.info/

essayé sur plusieurs ports

log debug : [2021-11-28 13:02:22][DEBUG] : Marée , Pleine , Basse

Merci

1 « J'aime »

+1 même probleme et même log

Bonjour,

Le plugin récupère les données à cette URL:
http://horloge.maree.frbateaux.net/ws52.js?col=1&c=0
52 pour Saint Malo
Pour le moment, les données ne remontent plus.

Ce qui est bizarre c’est que pour le code 134 (Lacanau si ce numero est le meme que celui utilisé pour maree.info) j’obtiens :

//Horloge
c=1;if(window.ver==1){
dp=d0=Math.floor(new Date().getTime()/1000);
window.HorlogeTicTac = function ()
{
 var m=Math.floor(new Date().getTime()/1000);
 if((m-dp<0)||(m-dp>=60)) return HorlogeSynchro("&e="+(m-dp));
 dp=m;m=1638182110+(m-d0);
 if(m>=1638189120) return HorlogeSynchro("&n="+1638189120);
 m=Math.floor((m-1638166140)/766)+30;
 document.getElementById( "Aiguille" ).style.backgroundPosition=(-84*(m%15))+"px "+(-84*Math.floor(m/15))+"px";
 document.getElementById( "Aiguille" ).style.visibility="visible";
 window.setTimeout("HorlogeTicTac()",10000);
}
HorlogeTicTac();
document.getElementById( "Coeff" ).innerHTML="Coef.<br>47";
document.getElementById( "PMBM" ).title="UTC+1"; 
document.getElementById( "PMBM" ).innerHTML="BM 06h09<br><b>PM 12h32</b>";
}

Le plugin avec l’instruction php file('http://horloge.maree.frbateaux.net/ws52.js?col=1&c=0'); n’obtient que :

ERROR session_start : false

En faisant du web scraping sur maree.info, j’obtiens ça:
image

Je peux faire une PR sur le plugin si ça intéresse.

Ca semble résoudre le pb ! Note d’un ignare : c’est quoi PR ? Progress Report ?

Un truc de développeur pour pousser du code en correction…

Ce serait génial, Merci à toi !!! :wink:

Fin de la partie de web scraping pour moi:
image

bonjour, cela signifie quoi du coup ?

Ca me paraît clair.

Le site n’accepte plus les requêtes. Donc ou c’est devenu payant ou ils ne veulent plus voir ce genre de requêtes saturer leur serveur

2 « J'aime »

j’y connais pas grand choses en web scraping, en essayant directement (sans passer avec marée info) sur le site officiel du Shom ?
exemple marée du croisic

Faut pas confondre l’utilisation d’une api et le reste…

1 « J'aime »

Une API sinon rien.

1 « J'aime »

section api du shom malheureusement sous abonnement :frowning_face:
https://services.data.shom.fr/support/fr/services/spm

Selon ce post du dev des plugins vigilancemeteo et meteofrance: Vigilance Météo : évolutions suite aux changement du site Météo France le plugin meteofrance devrait faire l’affaire pour les marées.

Il faut créer un équipement avec une geoloc du port que vous voulez surveiller.
Puis ensuite dans un virtuel, vous pourrez sélectionner les commandes Marine et Marée de l’équipement meteofrance.
image
C’est un assemblage des commandes disponibles.

Pour contourner le problème en attendant une mise à jour du plugin par le développeur, je vous propose la solution suivante.

Elle nécessite de modifier quelques lignes du code du plugin.

C’est sans danger car en cas de problème ou d’erreur, vous n’aurez qu’à réinstaller le plugin depuis le Market Jeedom.

Voici la procédure pas à pas pour les non initiés au développement.

  • Allez dans le menu REGLAGESSYSTEMCONFIGURATION_OS/DB puis cliquez sur le bouton OUVRIR de l’option EDITEUR DE FICHIER.

  • Dans la partie DOSSIERS (liste de gauche), cliquez sur PLUGINSVIGILANCEMETEOCODECLASS

  • Dans la partie FICHIERS (liste du milieu), cliquez sur VIGILANCEMETEO.CLASS.PHP afin d’afficher le code du plugin dans la partir droite.

  • Recherchez le texte suivant avec CTRL-F (ou CMD-F sous Mac) : function getmaree

  • L’éditeur affiche la ligne: public function getMaree() {

  • Supprimez la ligne : $result = file($url);

  • Copiez à la place les lignes suivantes :
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, ‹ Jeedom ›);
    $result = curl_exec ($ch);
    curl_close($ch);

  • Supprimez toutes les lignes suivantes :
    $maree = explode(’
    ’, $result[15]);
    $maree = explode(’"’, $maree[1]);
    $maree = $maree[0];
    $pleine = explode('PM ', $result[17] );
    $pleine = substr($pleine[1], 0, 5);
    $pleine = str_replace(‹ h ›, ‹  ›, $pleine);
    $basse = explode('BM ', $result[17]);
    $basse = substr($basse[1], 0, 5);
    $basse = str_replace(‹ h ›, ‹  ›, $basse);

  • copiez à la place les lignes suivantes :
    preg_match(’((Coef.
    )([0-9]{2,3}))’, $result, $data);
    $maree = $data[2];
    preg_match(’((innerHTML="PM )([0-9]{2}h[0-9]{2}))’, $result, $data);
    $basse = str_replace(‹ h ›,’’,$data[2]);
    preg_match(’((

    BM )([0-9]{2}h[0-9]{2}))’, $result, $data);
    $pleine= str_replace(‹ h ›,’’,$data[2]);

Il ne vous reste plus qu’à cliquer sur le bouton SAUVEGARDER (en haut à droite).
Vous devriez retrouver l’horaire des marées.

Exemple du code obtenu après modifications (vous pouvez aussi remplacer la totalité de la fonction par le code ci-dessous mais attention à bien prendre l’accolade de fin)

public function getMaree() {
  $port = $this->getConfiguration('port');
  if ($port == '') {
    log::add(__CLASS__, 'error', 'Marée : Port non saisi');
    return;
  }
  $url = 'http://horloge.maree.frbateaux.net/ws' . $port . '.js?col=1&c=0';
  log::add(__CLASS__, 'debug', $url); // JYQ
  
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_USERAGENT, 'Jeedom');
	$result = curl_exec ($ch);
	curl_close($ch);


  log::add(__CLASS__, 'debug', $result); // JYQ

  if ($result === false) {
    return;
  }

  //log::add(__CLASS__, 'debug', 'Log ' . print_r($result, true));
	preg_match('((Coef.<br>)([0-9]{2,3}))', $result, $data);
	$maree = $data[2];
	preg_match('((innerHTML="<b>PM )([0-9]{2}h[0-9]{2}))', $result, $data);
	$basse = str_replace('h','',$data[2]);
	preg_match('((</b><br>BM )([0-9]{2}h[0-9]{2}))', $result, $data);
	$pleine= str_replace('h','',$data[2]);


  log::add(__CLASS__, 'debug', 'Marée ' . $maree . ', Pleine ' . $pleine . ', Basse ' . $basse);
  $this->checkAndUpdateCmd('maree', $maree);
  $this->checkAndUpdateCmd('pleine', $pleine);
  $this->checkAndUpdateCmd('basse', $basse);

  return ;
}
2 « J'aime »

Merci ça fonctionne pour moi avec votre modification.
N’hésitez pas à faire un PR sur le github du dev:

C’est fait !