il existe de nombreux messages aux sujets d’erreurs qui nécessitent un redémarrage jeedom pour au moins solutionner le problème de façon courtermiste quand on n’arrive pas à trouver la vrai raison du problème.
c’est mon cas, de temps en temps, ma jeedom luna devient inaccessible, après reboot manuel, je trouve dans les logs « Souci réseau détecté, redémarrage du réseau. Aucune gateway de trouvée ». c’est carrément bloquant quand je ne suis pas à la maison.
j’ai fini par combiner les infos de plusieurs messages pour en arriver à la conception de ce bloc code (non je ne suis pas développeur, j’ai utilisé l’IA pour corriger)
au final, j’ai un scenario qui tourne toute les 5 minutes
le bloc code contient 4 points clés
- détecte la freq d’occurrence de l’erreur : si occasionnel, RAS, si répété alors reboot
- clean les logs
- reboot max une fois par jour (une sécurité pour moi)
- inscrit le reboot dans un log
en espérant que cela aide les personnes en galères
$scenario->setLog("=== Début du contrôle réseau ===");
// Configuration
$logName = 'network';
$cheminLog = log::getPathToLog($logName);
$erreurCible = "Souci réseau détecté, redémarrage du réseau. Aucune gateway de trouvée";
$seuilMinutes = 20;
$seuilOccurrences = 2;
$fichierTimestampReboot = '/tmp/dernier_reboot_jeedom.txt';
// Lecture du log
if (!file_exists($cheminLog)) {
$scenario->setLog("Log '$logName' introuvable !");
return;
}
$logLines = file($cheminLog);
$scenario->setLog("Log chargé, " . count($logLines) . " lignes lues.");
// Récupération des timestamps des erreurs
$erreurTimestamps = [];
foreach ($logLines as $line) {
if (stripos($line, $erreurCible) !== false) {
if (preg_match('/\[(.*?)\]/', $line, $matches)) {
$timestamp = strtotime($matches[1]);
if ($timestamp !== false) {
$erreurTimestamps[] = $timestamp;
}
}
}
}
$scenario->setLog("Occurrences trouvées : " . count($erreurTimestamps));
// Vérifie s'il y a 2 erreurs rapprochées dans le temps
$erreursRecentes = false;
for ($i = 0; $i < count($erreurTimestamps) - 1; $i++) {
$delta = abs($erreurTimestamps[$i + 1] - $erreurTimestamps[$i]);
if ($delta <= ($seuilMinutes * 60)) {
$erreursRecentes = true;
$scenario->setLog("Erreur répétée détectée : intervalle de $delta secondes");
break;
}
}
if ($erreursRecentes) {
// Vérifie si un redémarrage a déjà eu lieu aujourd’hui
$rebootAutorise = true;
if (file_exists($fichierTimestampReboot)) {
$dernierReboot = (int)trim(file_get_contents($fichierTimestampReboot));
if (date('Y-m-d', $dernierReboot) == date('Y-m-d')) {
$rebootAutorise = false;
$scenario->setLog("Redémarrage déjà effectué aujourd’hui.");
}
}
if ($rebootAutorise) {
$scenario->setLog(">>> Redémarrage Jeedom déclenché par le scénario !");
log::add('reboot_network', 'info', ">>> Reboot déclenché automatiquement");
// Nettoyage du log
file_put_contents($cheminLog, '');
$scenario->setLog("Log '$logName' nettoyé.");
// Reboot
$scenario->setLog("Reboot Jeedom...");
system::reboot();
file_put_contents($fichierTimestampReboot, time());
}
} else {
$scenario->setLog("Aucune erreur répétée détectée dans les $seuilMinutes dernières minutes.");
}
$scenario->setLog("=== Fin du contrôle réseau ===");

