REX - comment redémarrer sa jeedom en auto en dernier recours - mon cas "Souci réseau détecté, redémarrage du réseau. Aucune gateway de trouvée"

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 ===");
2 « J'aime »

Bonjour,
Code inutilisable.
Il doit obligatoirement être mis dans un Texte préformaté
image
Sur une nouvelle ligne, tapez Ctrl+e puis Ctrl+v pour coller le code.

Edit: Merci Fabrice pour la correction du formatage du code

ok, merci @jpty pour l’info, @Fabrice pour la correction

1 « J'aime »

Merci pour le partage de ton script :wink:

Cela dit, je suis quand même surpris par ces soucis de perte de réseau régulières …
Tu n’a pas de souci hardware sur la machine qui héberge ton jeedom ou sur ta box internet ?

1 « J'aime »

bonjour @Aurel , j’ai raté ton message.
bien difficile de répondre a ta question. j’ai déeplacé ma jeedom luna, depuis j’ai moins d’erreurs. peut etre des erreurs dans le signal wifi.