Maintenir les esp en ligne

Bonjour,

J’ai un paquet d’esp avec espeasy chez moi et je remarque que parfois, sans qu’on ne sache pourquoi le wifi devient instable. De fait, l’esp reste en actif mais hors ligne. Pour ceux qui sont accessible physiquement, pas de soucis, mais pour les autres cela peut vite devenir la misère. J’en avais marre de bricoler pour accéder un esp afin de le relancer. J’ai donc chercher une solution pour que cela devienne automatique.
Ce n’est peut être pas la meilleure solution, programmée de la meilleure manière car je ne suis pas un spécialiste du PHP, elle existe peut-être déjà, mais ça fonctionne !

Il suffit de copier le code dans un script nommé espeasy.php (via le plugins script) et de faire les modifications en insérant le code indiqué dans les rules de vos esp.
Cela permet aux esp de faire un « ping » vers le script et le script renvoie un « pong » vers l’esp. Si rien n’est reçu après x sec, l’esp reboot.

<?php
// (c) Lenif -- V1.5 (2020-04-26)
// Keepalive script pour espeasy. Si network hors ligne pour x sec, espeasy reboot
// 
// utilisation: placer ce code dans un script jeedom (ou ailleurs). 
//        http://ipserver/espeasy.php?mode=view      pour afficher les espeasy
//        http://ipserver/espeasy.php                pour afficher l'ip du client
//       Accès depuis jeedom:
//        http://ipdejeedom/plugins/script/core/ressources/espeasy.php?mode=view
//
//
//   Compatible avec le plugin CLINK.
//   !!! Non compatible avec le bouton TESTER du plugin script !!!
//
//
// Dans l'exemple ci-dessous, un accès est réalisé toutes les deux minutes(120) vers le script sur Jeedom
// Si le script n'a rien envoyé après 400s, espeasy reboot
//
//
// *******************************
// modification dans votre espeasy
// ajouter ceci dans les rules:
//
/*
on system#boot do
  timerset,7,10
endon
on Rules#Timer=7 do //envoie un ping toutes les 120sec
  SendToHTTP IP_JEEDOM,80,/plugins/script/core/ressources/espeasy.php?mode=update
  timerset,7,120 
endon
on Pong do // pong receive
  timerset,8,400
endon
on Rules#Timer=8 do // no pong, reboot
  reboot
endon
*/
  $debut = microtime(true);
  $space = '  *  ';
  $page = strtok("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", "?");
  $savefile = "espList.json"; 
  $sec = "10";
  $Pong = '/control?cmd=event,Pong';
  $mode = $_GET["mode"];
  $espIP = $_SERVER['REMOTE_ADDR'];
  $espDateTime = date('d-m-Y H:i:s');
  
  // envoyer tout de suite le pong
  if ($mode == 'update'){
    echo 'Send back pong to:</br>';
    //send pong
    $PongURL = 'http://'.$espIP.$Pong;
    echo $PongURL;
	$cURL = curl_init($PongURL); //Initialise cURL 
    curl_setopt($cURL, CURLOPT_PORT, 80); //Set the port to connect to
    curl_setopt($cURL, CURLOPT_CONNECTTIMEOUT, 1);
    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); //Get cURL to return the HTML from
    $PongResult = curl_exec($cURL); //Execute the request and store the result in $HTML
    if (strstr($PongResult, "OK")) 
    {
	  $espPong = 'OK';
    }
    else
    {
	  $espPong = 'NOK';
    }
	echo '<p>'.$espPong.'</p>';
  }	

  // Récuper les infos espeasy
  $cURL = curl_init('http://'.$espIP.'/json'); //Initialise cURL 
  curl_setopt($cURL, CURLOPT_PORT, 80); //Set the port to connect to
  curl_setopt($cURL, CURLOPT_CONNECTTIMEOUT, 2);
  curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); //Get cURL to return the HTML from
  $espJSON = json_decode(curl_exec($cURL)); //Execute the request and store the result in $HTML
  if (is_null($espJSON))
  {
	  $espName   = 'N/A';
	  $espBuild  = 'N/A';
	  $espSSID   = 'N/A';
	  $espRSSI   = 'N/A';
	  $espUptime   = 0;
  } else
  {
	  $espName  = $espJSON->{'WiFi'}->{'Hostname'};
	  $espBuild = $espJSON->{'System'}->{'Git Build'};
	  $espSSID  = $espJSON->{'WiFi'}->{'SSID'};
	  $espRSSI  = $espJSON->{'WiFi'}->{'RSSI'}.'db';
	  $espUptime  = $espJSON->{'System'}->{'Uptime'};
  }

  // on charge le contenu du fichiers avec les esp
  $espList = json_decode(file_get_contents($savefile), true);
  if (!is_array($espList))
  {
    $espList =array();
  }
  
  if (($mode == 'delete') and isset($_GET['ip'])){
	//on supprime l'ip transmise  
	$ipToDelete = str_replace("-",".",$_GET['ip']); 
    echo '<head><meta http-equiv="refresh" content="4;'.$page.'?mode=view"></head>';
    foreach ($espList as $index => $esp) 
	{
      if ($esp[0] == $ipToDelete) {
	    echo "Je supprime: ".$ipToDelete;
	    array_splice($espList, $index, 1);
		$result = file_put_contents($savefile,json_encode($espList));		
		echo "<p>Modification enregistrée</p>";
		exit();	  
	  }
	}
	echo "Pas trouvé !";
  }
  elseif ($mode == 'update')
	  // **************** UPDATE *************
  {
	$replaced = False;
	// si il existe on modifie
    foreach ($espList as $index => $esp) 
	{
	  if ($esp[0] == $espIP) 
	  { 
		$espList[$index][1] = $espDateTime;
	    if ($espName != 'N/A') { $espList[$index][2] = $espName; }
	    $espList[$index][3] = $espBuild;
	    $espList[$index][4] = $espSSID;
	    $espList[$index][5] = $espRSSI;
	    $espList[$index][6] = $espUptime;
		$espList[$index][7] = $espPong;
		$replaced = true;
		break;
	  }
	} 

	if (!$replaced){
      array_push($espList, array($espIP, $espDateTime, $espName, $espBuild, $espSSID, $espRSSI, $espUptime, $espPong));	
	} else
	{
	  echo 'Update date/time for '.$espIP.'</br>';
	}
	
	$result = file_put_contents($savefile,json_encode($espList));
  } elseif ($mode == 'clear') 
	  // **************** CLEAR *************
  {
    echo '<head><meta http-equiv="refresh" content="2;'.$page.'?mode=view"></head>';
	if (!unlink($savefile)) {  
      echo ("Erreur lors de l\effacement du fichier ".$savefile);  
    }  
    else {  
      echo ("Fchier supprimé");  
    } 
	unlink("espList.json");  
  } elseif ($mode == 'view') {
	  // **************** VIEW *************
    if ($espList == '')
    {
	  $html = '<p>Vide</p>';	
	} else 
	{
	  $sortID = isset($_GET['sort']) ? $_GET['sort'] : 0;	
	  //trier
      if ($sortID == 0) {
	    usort($espList, function ($a, $b)
        {
          $aip = sprintf('%u', ip2long($a[0]));
          $bip = sprintf('%u', ip2long($b[0]));
          return $aip <=> $bip;
		  //return ($aip < $bip) ? -1 : (($aip > $bip) ? 1 : 0);
        });
	  }	else
      {
		$columns = array_column($espList, $sortID);
        array_multisort($columns, SORT_ASC, SORT_NATURAL|SORT_FLAG_CASE, $espList);	  
	  }		  
	  
      // afficher	  
	  $html = '<html>
               <head>';
	  $html .= '<meta http-equiv="refresh" content="10">';
      $html .= '<style>
               body {
	 		     font-family: Verdana, "trebuchet ms", Arial;
	 		   }
			   table {
                 border-collapse: collapse;
                 width: 840px;
                 font-size: 12px;
                 border: 5px solid #656cb2;				
               }
               tr.enhaut {
                 background-color: #9ba3ff;
                 padding: 5px;
                 text-align: center;
               }
               th {
			   	 border-bottom: 5px solid #656cb2;
			  	 border-right: 2px solid #656cb2;
			   }
			   tfoot {
                 border: 5px solid #656cb2;
               }
			   tr.offline {
	             background: #ff0000;
                 transition: 0.3s;
			   }
			   tr.red {
	             background: #f28c8c;
                 transition: 0.3s;
			   }
			   tr.green {
	             background: #8cf296;
                 transition: 0.3s;
	           }
			   tr.orange {
	             background: #f7902d;
                 transition: 0.3s;
	           }
			   tr.yellow {
	             background: #ffe56e;
                 transition: 0.3s; 
	           }
			   tr.enbas {
	             background: #656cb2;
                 color: #ffffff;				
	           }
		 	   td {
                 padding: 4px;
                 text-align: left;
                 border-bottom: 1px solid #ffffff;
			  	 border-right: 2px solid #656cb2;
               }
			   td[colspan="9"] {
                 text-align: center;
				 border-bottom: 5px solid #656cb2;
               }
			   tr.enbas:hover {
                 filter: brightness(100%);
			   }
			   tr.enhaut:hover {
                 filter: brightness(100%);
			   }
			   tr:hover {
                 filter: brightness(75%);
			   }
			   tr.enbas a:link, tr.enbas a:visited {
                 text-decoration: none;
				 color: white;
               }
               tr.enbas a:hover, tr.enbas a:active {
                 text-decoration: underline;
			  	 font-weight: bold;
               }
			   th a:link, th a:visited {
                 text-decoration: none;
				 color: black;
               }
			   td.lien a:hover, td.lien a:active {
                 text-decoration: underline;
				 font-weight: bold;
               }
			   tbody a:link, tbody a:visited {
                 text-decoration: none;
				 color: black;
               }
               tbody a:hover, tbody a:active {
                 text-decoration: underline;
               }
			  
               </style>
               </head>
               <body>';
 	  $html .= '<table>';
      $html .= '<thead><tr class="enhaut">';
	  if ($sortID == 0) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=0">IP &diams;</a></th>'; //0 sort
	  } else {
  	    $html .=     '<th><a href="'.$page.'?mode=view&sort=0">IP</a></th>'; //0 sort
	  }	  
	  if ($sortID == 1) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=1">Date &diams;</a></th>'; // 1
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=1">Date</a></th>'; // 1
	  }	  
	  if ($sortID == 2) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=2">Nom &diams;</a></th>'; // 2 
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=2">Nom</a></th>'; // 2 
	  }	  
	  if ($sortID == 3) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=3">Build &diams;</a></th>';// 3
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=3">Build</a></th>';// 3
	  }	  
	  if ($sortID == 4) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=4">SSID &diams;</a></th>'; // 4
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=4">SSID</a></th>'; // 4
	  }	  
	  if ($sortID == 5) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=5">RSSI &diams;</a></th>'; // 5
	  } else {
  	    $html .=     '<th><a href="'.$page.'?mode=view&sort=5">RSSI</a></th>'; // 5
	  }	  
	  if ($sortID == 6) {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=6">UpTime &diams;</a></th>'; // 6
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=6">UpTime</a></th>'; // 6
	  }	  
	  if ($sortID == 7) {
  	    $html .=     '<th><a href="'.$page.'?mode=view&sort=7">Pong &diams;</a></th>'; // 7
	  } else {
	    $html .=     '<th><a href="'.$page.'?mode=view&sort=7">Pong</a></th>'; // 7
	  }	  
	  $html .=     '<th>Sup</th>';
	  $html .=     '</tr></thead><tbody>'; // 8
	  foreach($espList as $rowkey=>$row) 
	  {
		$timeDif = (strtotime($espDateTime)-strtotime($row[1]))/60;
		if ($timeDif > 10) {
		  $html .= '<tr class="offline">';
        } elseif ($row[7] == 'NOK') {
		  $html .= '<tr class="red">';			
		} elseif (preg_replace('/[^0-9]/', '', $row[5]) > 75) {   
		  $html .= '<tr class="yellow">';
		} elseif  (preg_replace('/[^0-9]/', '', $row[6]) < 100) {   
		  $html .= '<tr class="orange">';
		} else {
		  $html .= '<tr class="green">';
		}
        foreach ($row as $cellkey=>$cell) {
          $html .= '<td>';
		  if ($cellkey == 6){
		    $d = floor ($cell / 1440);
            $h = floor (($cell - $d * 1440) / 60);
			if ($h < 10) { $h = '0'.$h; }
			$m = $cell - ($d * 1440) - ($h * 60);
			if ($m < 10) { $m = '0'.$m;}
			if ($d == 0) {
			  $espUptimeText = $h.':'.$m;
			} else {
			  $espUptimeText = $d.'j. '.$h.':'.$m;  
			}
		    $html .= '<a href="http://'.$row[0].'"  target="_blank">'.$espUptimeText.'</a>';  
		  } else {
		    $html .= '<a href="http://'.$row[0].'"  target="_blank">'.$cell.'</a>';  
		  }
        }
        $html .= '<td class="lien" style="text-align: center;">';		
		$html .= '<a href="'.$page.'?mode=delete&ip='.str_replace(".","-",$row[0]).'">X</a>';
		$html .= '</td></tr>';
      }
      $html .= '</tbody>';
	  $html .= '<tfoot>';
      $html .= '<tr class="offline"><td colspan="9">Hors ligne</td></tr>';	  
      $html .= '<tr class="red"><td colspan="9">ESP n\'a pas reçu le PONG</td></tr>';	  
      $html .= '<tr class="yellow"><td colspan="9">Signal wifi faible</td></tr>';	  
      $html .= '<tr class="orange"><td colspan="9">ESP a booté récemment</td></tr>';	  
      $html .= '<tr class="green"><td colspan="9">ESP normal</td></tr>';	  
      $html .= '<tr class="enbas"><td colspan="9"><a href="'.$page.'?mode=clear">Supprimer le l\'historique</a></td></tr>';	  
	  $html .= '</tfoot>';		
	  $html .= '</table></body></html>';
	}
	echo $html;

  } else
	  // **************** NO MODE *************
  {
	  echo $espIP;
  }
  echo '<p><span style="color:#757575;font-size:small">Script exécuté en '. number_format((microtime(true) - $debut),3).' msec</span></p>';
?>

a+
Aperçu des esp en ligne:
screenshot362

4 « J'aime »

Bonjour
Au votre script, ça mis en place dans l’après midi, et ça fonctionne bien. ça permet facilement de voir les ESP qui capte mal.
Un grand merci
Nico

1 « J'aime »

Pour info, à une époque je perdais aussi certains ESP de temps en temps. En fait, c’est la table arp (lien MAC / IP) qui ne se mettait pas à jour (taper arp -a en ligne de commande).

Dans ESP EAsy, dans « Advanced » il y a l’option « Periodical send Gratuitous ARP » qui avait été introduite et a réglé ce problème.

Après, c’est peut-être autre chose. Globalement, il y a aussi eu pas mal de progrès sur la gestion du wifi dans les dernières versions d’ESP Easy (depuis décembre) et il me semble aussi avec la dernière version du core (2.6.3).

1 « J'aime »

Merci pour cette précision, le fait est que certains esp tournent depuis 2018 sans que je ne change de build, en plus ils sont difficile d’accès. L’options arp n’y est pas. D’autres plus récents perdent quand même le wifi malgré les options de reconnexions apportées au firmware.
J’ai ajouté des couleurs en fonction du RSSI, uptime et dernière vue en ligne. Ca donne un aperçu direct dans un des mes designs.

bonjour
on peux avoir le code stp (pour la couleur)

pour info j’ai simplement mis à la racine jeedom ton script
et un lien via le plug click link via modale
./espeasy.php?mode=view
accès interne et externe

merci

Pour info, publié hier sur le forum par le développeur actuel :

Just for reference, the problems with WiFi instability started around 201803, so builds between March 2018 and roughly Sept 2019 were less stable regarding WiFi.

La mise à jour peut se faire depuis l’interface web même s’il est vrai qu’il y a toujours un petit risque, surtout pour les équipements à 1M de flash où il faut passer par un flash en deux étapes. D’ailleurs pour ma part, pour ces derniers maintenant plutôt que le fichier fourni par ESP Easy (ESPEasy_2step_UploaderMega_1024.bin) j’utilise le script d’exemple WebUpdate avec les codes wifi en dur et compilé en Generic ESP8266, flash size 1MB FS:none, flash mode DOUT. Cela limite grandement les surprises.

En tout cas merci pour script, c’est pas mal pour avoir une vue rapide des ESP Easy.

Bonjour Lenif,
pourrais-tu réaliser un tuto (détaillé pour les jardiniers comme moi !!) pour la mise en place du script?
pour les « rules » pas de problème j’ai trouvé facilement la coche!!!
Merci
Doudou

Bonjour,
Voici ma dernière version avec l’ajout des couleurs, des liens pour effacer une ligne ou tout vider. Prochaine étape le tri. Sinon; ne jugez pas trop le css qui, je l’avoue, je l’ai sorti comme un bourrin !
Dans mes esp, je teste actuellement en passant le pong à 200 car parfois ca force le reboot alors que c’est pas toujours nécessaire …

  <?php
// (c) Lenif 2020
// Keepalive procedure pour espeasy. Si network hors ligne pour 120 sec, espeasy reboot
// 
// utilisation: placer ce script sur un serveur php ou dans un script jeedom. 
//        http://ipserver/espeasy.php?mode=view      pour afficher les espeasy
//        http://ipserver/espeasy.php?mode=clear     pour effacer les espeasy 
//        http://ipserver/espeasy.php?mode=update    pour mettre à jour les espeasy 
//        http://ipserver/espeasy.php                pour afficher l'ip du client
//  depuis un script dans jeedom: 
//                  http://ipdejeedom/plugins/script/core/ressources/espeasy.php?mode=view
//         
//
// modification dans votre espeasy
// ajouter ceci dans les rules:
//
/*
on system#boot do
  timerset,7,60
endon
on Rules#Timer=7 do // ping
  SendToHTTP ip_de_jeedom,80,/plugins/script/core/ressources/espeasy.php?mode=update
  timerset,7,60
endon
on Pong do // pong receive
  timerset,8,130
endon
on Rules#Timer=8 do // no pong, reboot
  reboot
endon
*/
  $space = '  *  ';
  $page = strtok("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", "?");
  $savefile = "espList.json"; 
  $sec = "10";
  $Pong = '/control?cmd=event,Pong';
  $mode = $_GET["mode"];
  $espList = json_decode(file_get_contents($savefile), true);
  $espIP = $_SERVER['REMOTE_ADDR'];
  $espDateTime = date('d-m-Y H:i:s');
  
  if ($mode == 'update'){
    echo 'Send back pong to:</br>';
    //send pong
    $PongURL = 'http://'.$espIP.$Pong;
    $cURL = curl_init($PongURL); //Initialise cURL 
    curl_setopt($cURL, CURLOPT_PORT, 80); //Set the port to connect to
    curl_setopt($cURL, CURLOPT_CONNECTTIMEOUT, 1);
    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); //Get cURL to return the HTML from
    $PongResult = curl_exec($cURL); //Execute the request and store the result in $HTML
    if (strstr($PongResult, "OK")) 
    {
	  $espPong = 'OK';
    }
    else
    {
	  $espPong = 'NOK';
    }
  }	

  // Get esp infos
  $cURL = curl_init('http://'.$espIP.'/json'); //Initialise cURL 
  curl_setopt($cURL, CURLOPT_PORT, 80); //Set the port to connect to
  curl_setopt($cURL, CURLOPT_CONNECTTIMEOUT, 2);
  curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); //Get cURL to return the HTML from
  $espJSON = json_decode(curl_exec($cURL)); //Execute the request and store the result in $HTML
  if (is_null($espJSON))
  {
	  $espName = 'N/A';
	  $espBuild = 'N/A';
	  $espSSID = 'N/A';
	  $espRSSI = 'N/A';
	  $espUptime = 'N/A';
  } else
  {
	  $espName  = $espJSON->{'WiFi'}->{'Hostname'};
	  $espBuild = $espJSON->{'System'}->{'Git Build'};
	  $espSSID  = $espJSON->{'WiFi'}->{'SSID'};
	  $espRSSI  = $espJSON->{'WiFi'}->{'RSSI'}.'db';
	  $minutes  = $espJSON->{'System'}->{'Uptime'};
      $d = floor ($minutes / 1440);
      $h = floor (($minutes - $d * 1440) / 60);
	  if ($h < 10) { $h = '0'.$h; }
      $m = $minutes - ($d * 1440) - ($h * 60);
	  if ($m < 10) { $m = '0'.$m; }
	  if ($d == 0) {
	    $espUptime = $h.':'.$m;
	  } else {
		$espUptime = $d.'j. '.$h.':'.$m;  
	  }
//
	  
  }


  if (!is_array($espList))
  {
    $espList =array();
  }
  
  if ($mode == 'update')
	  // **************** UPDATE *************
  {
	$replaced = False;
    foreach ($espList as $index => $esp) 
	{
	  if ($esp[0] == $espIP) 
	  { 
		$espList[$index][1] = $espDateTime;
	    $espList[$index][2] = $espName;
	    $espList[$index][3] = $espBuild;
	    $espList[$index][4] = $espSSID;
	    $espList[$index][5] = $espRSSI;
	    $espList[$index][6] = $espUptime;
		$espList[$index][7] = $espPong;
		$replaced = true;
		break;
	  }
	} 

	if (!$replaced){
      array_push($espList, array($espIP, $espDateTime, $espName, $espBuild, $espSSID, $espRSSI, $espUptime, $espPong));	
	} else
	{
	  echo 'Update date/time for '.$espIP.'</br>';
	}
	
	$result = file_put_contents($savefile,json_encode($espList));
  } elseif ($mode == 'clear') 
	  // **************** CLEAR *************
  {
    echo '<head><meta http-equiv="refresh" content="2;'.$page.'?mode=view"></head>';
	if (!unlink($savefile)) {  
      echo ("Erreur lors de l\effacement du fichier ".$savefile);  
    }  
    else {  
      echo ("Fchier supprimé");  
    } 
	unlink("espList.json");  
  } elseif ($mode == 'view') 
	  // **************** VIEW *************
  {
    if ($espList == '')
    {
	  $html = '<p>Vide</p>';	
	} else 
	{
	  //trier
      usort($espList, function ($a, $b)
      {
        $aip = sprintf('%u', ip2long($a[0]));
        $bip = sprintf('%u', ip2long($b[0]));
        return $aip <=> $bip;
      });	  
	  
      // afficher	  
	  $html = '<html>
               <head>';
	  $html .= '<meta http-equiv="refresh" content="10">';
      $html .= '<style>
               body {
	 		     font-family: Verdana, "trebuchet ms", Arial;
	 		   }
			   table {
                 border-collapse: collapse;
                 width: 840px;
                 font-size: 12px;
                 border: 5px solid #656cb2;				
               }
               tr.enhaut {
                 background-color: #9ba3ff;
                 padding: 5px;
                 text-align: center;
               }
               th {
			   	 border-bottom: 5px solid #656cb2;
			  	 border-right: 2px solid #656cb2;
			   }
			   tfoot {
                 border: 5px solid #656cb2;
               }
			   tr.offline {
	             background: #ff0000;
                 transition: 0.3s;
			   }
			   tr.red {
	             background: #f28c8c;
                 transition: 0.3s;
			   }
			   tr.green {
	             background: #8cf296;
                 transition: 0.3s;
	           }
			   tr.orange {
	             background: #f7902d;
                 transition: 0.3s;
	           }
			   tr.yellow {
	             background: #ffe56e;
                 transition: 0.3s; 
	           }
			   tr.enbas {
	             background: #656cb2;
                 color: #ffffff;				
	           }
		 	   td {
                 padding: 4px;
                 text-align: left;
                 border-bottom: 1px solid #ffffff;
			  	 border-right: 2px solid #656cb2;
               }
			   td[colspan="9"] {
                 text-align: center;
				 border-bottom: 5px solid #656cb2;
               }
			   tr.enbas:hover {
                 filter: brightness(100%);
			   }
			   tr.enhaut:hover {
                 filter: brightness(100%);
			   }
			   tr:hover {
                 filter: brightness(75%);
			   }
			   tr.enbas a:link, tr.enbas a:visited {
                 text-decoration: none;
				 color: white;
               }
               tr.enbas a:hover, tr.enbas a:active {
                 text-decoration: underline;
			  	 font-weight: bold;
               }
			   td.lien a:hover, td.lien a:active {
                 text-decoration: underline;
				 font-weight: bold;
               }
			   tbody a:link, tbody a:visited {
                 text-decoration: none;
				 color: black;
               }
               tbody a:hover, tbody a:active {
                 text-decoration: underline;
               }
			  
               </style>
               </head>
               <body>';
 	  $html .= '<table>';
      $html .= '<thead><tr class="enhaut"><th>IP</th>'; //0
	  $html .=     '<th>Date</th>'; // 1
	  $html .=     '<th>Nom</th>'; // 2 
	  $html .=     '<th>Build</th>';// 3
	  $html .=     '<th>SSID</th>'; // 4
	  $html .=     '<th>RSSI</th>'; // 5
	  $html .=     '<th>UpTime</th>'; // 6
	  $html .=     '<th>Pong</th>'; // 7
	  $html .=     '<th>Sup</th></tr></thead><tbody>'; // 8
	  foreach($espList as $rowkey=>$row) 
	  {
		$timeDif = (strtotime($espDateTime)-strtotime($row[1]))/60;
		if ($timeDif > 10) {
		  $html .= '<tr class="offline">';
        } elseif ($row[7] == 'NOK') {
		  $html .= '<tr class="red">';			
		} elseif (preg_replace('/[^0-9]/', '', $row[5]) > 75) {   
		  $html .= '<tr class="yellow">';
		} elseif  (preg_replace('/[^0-9]/', '', $row[6]) < 100) {   
		  $html .= '<tr class="orange">';
		} else {
		  $html .= '<tr class="green">';
		}
        foreach ($row as $cellkey=>$cell) {
          $html .= '<td>';
		  //if ($cellkey == 0){
			$html .= '<a href="http://'.$row[0].'"  target="_blank">'.$cell.'</a>';  
		  //} else {
			//$html .= $cell.'</td>';  
		  //}
        }
        $html .= '<td class="lien" style="text-align: center;">';
		$html .= '<a href="'.$page.'?mode=update&delete='.$row[0].'">X</a>';
		$html .= '</td></tr>';
      }
      $html .= '</tbody>';
	  $html .= '<tfoot>';
      $html .= '<tr class="offline"><td colspan="9">Hors ligne</td></tr>';	  
      $html .= '<tr class="red"><td colspan="9">PONG pas reçu par l\'ESP</td></tr>';	  
      $html .= '<tr class="yellow"><td colspan="9">Signal wifi faible</td></tr>';	  
      $html .= '<tr class="orange"><td colspan="9">l\'ESP a rebooter récemment</td></tr>';	  
      $html .= '<tr class="green"><td colspan="9">ESP en pleine forme</td></tr>';	  
      $html .= '<tr class="enbas"><td colspan="9"><a href="'.$page.'?mode=clear">Supprimer le l\'historique</a></td></tr>';	  
	  $html .= '</tfoot>';		
	  $html .= '</table></body></html>';
	}
	echo $html;

  } else
	  // **************** NO MODE *************
  {
	  echo $espIP;
  }
?>

1 « J'aime »

Salut,
Tu installes le plugin Script. Sur Script, tu ajoutes un script, je l’ai appelé espAlive.
Une fois fait, tu l’actives et dans les commandes, tu ajoutes une commande, tu lui donnes un nom, j’ai mis « espeasy » (on s’en fou), type script/info/autre, tu clic sur nouveau, tu donnes un nom pour le script: « espeasy.php », tu enregistres. Tu clic sur parcourir pour vérifier si il est bien créé et tu le sélectionne.
Tu fais éditer et un gros copier coller du script devrait faire l’affaire. Pour accèder à la page, j’utilise un lien direct comme indiqué au début du script
a+

je passe à 320s pour le pong avec un ping toutes les 60s
sinon, c’est trop sensible et des reboot intempestifs ont lieu

Slt,
poue les ESP j’ai ajouter l’ip de jeedom==> OK
mais pour le script je pense que ca coince un peu !!!

@Doudou
Je ne me suis pas cassé la tête avec le plugin script, j’ai simplement déposé espeasy.php dans /var/www/html avec les droits qui vont bien et c’est tout.
Pour l’affichage de la santé dans Jeedom , j’utilise le plugin click link avec une fênetre nodale et le lien http://192.168.1.100/./espeasy.php?mode=view.
C’est simple et ça marche du premier coup.

Merci Kerdale,
jai installe click link, et realiser le lienpour la fenetre.
mais pour le script a coller je n’ai pas trouver le chemin sous Jeexplorer.
Doudou

petite correction de type autour de la ligne 66:

après:
$espJSON = json_decode(curl_exec($cURL)); //Execute the request and store the result in $HTML
remplacer:
 if ($espJSON == 0)
par: 
  if (is_null($espJSON))

clic sur le bouton parcourir, selectionne ton script à nouveau et sauve
screenshot2

ça peux venir du fait que les accès script sont interdit de l’extérieur (il y a un fichier .htaccess dans le répertoire par defaut)
le moyen que j’ai trouver pour garder l’édition par jeedom, c’est de déplacer le repertoire dans /var/www/html directement.
Nico

Slt,
j’ai realisé le script, mais lors du « test » j’ai des erreures :


je pense qu’il ne trouve pas les variables.
qd je recherche « espList.json » dans jeexplorer il ne trouve rien.
Doudou

Hello,

Très bonne idée ce script… j’en ai un qui m’ennuie régulièrement, je vais essayer.

ça a l’air top comme script! Pensez-vous qu’il soit possible d’adapter tous ca pour Tasmota?

Si tu passes par le bouton test du script c’est normal.
Essaie l’url directement dans le navigateur !
http://ipdejeedom/plugins/script/core/ressources/espeasy.php?mode=view