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

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 !

extra, merci beaucoup !!!

Je ne le vois pas.
Il faudrait peut-être mettre un USERAGENT moins repérable. :thinking:

Je confirme, je vois pas de PR :slight_smile:

De mon coté, apres la modif, cela ne fonctionne pas pour les horaires de marée. Le coef est bon

[2021-12-07 12:00:28]DEBUG : Marée , Pleine , Basse
[2021-12-07 13:00:19]DEBUG : Marée , Pleine , Basse
[2021-12-07 14:00:26]DEBUG : Marée , Pleine , Basse
[2021-12-07 15:00:28]DEBUG : Marée , Pleine , Basse
[2021-12-07 16:00:45]DEBUG : Lancement de : /var/www/html/core/class/../../core/php/jeePlugin.php  plugin_id=vigilancemeteo function=pre_update callInstallFunction=1
[2021-12-07 16:00:47]INFO : Début d'activation du plugin
[2021-12-07 16:00:48]INFO : Info sur le démon : {"launchable_message":"","launchable":"nok","state":"nok","log":"nok","auto":0}
[2021-12-07 16:00:48]DEBUG : Lancement de : /var/www/html/core/class/../../core/php/jeePlugin.php  plugin_id=vigilancemeteo function=update callInstallFunction=1
[2021-12-07 16:02:58]DEBUG : http://horloge.maree.frbateaux.net/ws131.js?col=1&c=0
[2021-12-07 16:02:58]DEBUG : //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=1638892978+(m-d0);  if(m>=1638905040) return HorlogeSynchro("&n="+1638905040);  m=Math.floor((m-1638881820)/774)+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.
90"; document.getElementById( "PMBM" ).title="UTC+1";  document.getElementById( "PMBM" ).innerHTML="BM 12h57
PM 19h24"; }
[2021-12-07 16:02:58]DEBUG : Marée 90, Pleine , Basse
[2021-12-07 16:03:14]DEBUG : http://horloge.maree.frbateaux.net/ws131.js?col=1&c=0
[2021-12-07 16:03:14]DEBUG : //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=1638892994+(m-d0);  if(m>=1638905040) return HorlogeSynchro("&n="+1638905040);  m=Math.floor((m-1638881820)/774)+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.
90"; document.getElementById( "PMBM" ).title="UTC+1";  document.getElementById( "PMBM" ).innerHTML="BM 12h57
PM 19h24"; }
[2021-12-07 16:03:14]DEBUG : Marée 90, Pleine , Basse
[2021-12-07 16:03:19]DEBUG : Link value : https://maree.info/131
[2021-12-07 16:04:46]DEBUG : http://horloge.maree.frbateaux.net/ws131.js?col=1&c=0
[2021-12-07 16:04:46]DEBUG : //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=1638893086+(m-d0);  if(m>=1638905040) return HorlogeSynchro("&n="+1638905040);  m=Math.floor((m-1638881820)/774)+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.
90"; document.getElementById( "PMBM" ).title="UTC+1";  document.getElementById( "PMBM" ).innerHTML="BM 12h57
PM 19h24"; }
[2021-12-07 16:04:46]DEBUG : Marée 90, Pleine , Basse

j’ai fait un copier/coller de toute la fonction pour eviter les erreurs.

@Jyq
Ça ne fonctionne pour les marées qu’à marée descendante.
En ce moment (marée montante), le document récupéré contient:

document.getElementById( "PMBM" ).innerHTML="BM 16h02<br><b>PM 21h26</b>";

et le plugin ne trouve pas innerHTML="<b>PM pour la marée haute ni </b><br>BM pour la marée basse

Il y a effectivement un petit problème avec l’expression régulière de preg_match.

Voici la correction :

preg_match('((Coef.<br>)([0-9]{2,3}))', $result, $data);
$maree = $data[2];
preg_match('((innerHTML="BM |</b><br>BM )([0-9]{2}h[0-9]{2}))', $result, $data);
$basse = str_replace('h','',$data[2]);
preg_match('((<br><b>PM |innerHTML="<b>PM )([0-9]{2}h[0-9]{2}))', $result, $data);
$pleine= str_replace('h','',$data[2]);

Et la procédure complète :

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="BM |</b><br>BM )([0-9]{2}h[0-9]{2}))', $result, $data);
	$basse = str_replace('h','',$data[2]);
	preg_match('((<br><b>PM |innerHTML="<b>PM )([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 ;
}

Je ne suis pas un habitué de GitHub et je ne vois pas ce que j’ai loupé.
Je me suis identifié, effectué la modif et lorsque j’ai validé j’ai eu un message m’indiquant que la modif était soumise.
Qu’ai-je mal fait ?

Vous n’avez fait que le commit sur votre fork.
Il manque le PR sur le github de Lunarok.
N’oubliez pas d’intégrer les nouveaux preg_match avant le PR

Impeccable, merci.

Ne fonctionne plus de nouveau.
Le plugin récupère:

document.getElementById( "PMBM" ).title="UTC+1"; 
/*
document.getElementById( "Coeff" ).innerHTML="Coef.<br>00";
document.getElementById( "PMBM" ).innerHTML="<b>PM 99h99</b><br>BM 99h99";
*/
document.getElementById( "Coeff" ).innerHTML="Coef.<br>84";
document.getElementById( "PMBM" ).innerHTML="<b>PM 09h45</b><br>BM 16h48";
}

et affiche donc les premières valeurs:
image

Perso, je ne vais plus utiliser maree.info ni frbateaux.net pour respecter leur CGU mais une des sources de HA.
En une requête, les infos de maree sur 15 jours sont disponibles en json.
image

Reste à voir comment le publier dans vigilancemeteo qui est un peu sinistré depuis le plugin meteofrance ou autrement.
Lunarok un avis sur le devenir de vigilancemeteo ?

Vigilance Météo est toujours utilisé pour les plages, alertes globales …
Les marées ne marchent plus avec maree.info dedans ?