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 ♦</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 ♦</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 ♦</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 ♦</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 ♦</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 ♦</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 ♦</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 ♦</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: