To skrypt do gniazdka smart Shelly S MTR Gen3 który ma za zadania restartować router w razie zaniku internetu (zawieszenia routera) a oprócz tego np o 1 w nocy wymusić restart.
To nieco inne podejście do tematu, który w tym miejscu zacząłem: https://www.microgeek.eu/viewtopic.php? ... 940#p17056
Kod: Zaznacz cały
/* jshint esversion: 6 */
/* global Shelly, Timer */
// Konfiguracja Twojego Watchdoga i Restartu Nocnego
let CONFIG = {
// Stabilne serwery DNS (Google i Cloudflare) używane do testu HTTP
endpoints: [
"http://" + "1.1.1.1",
"http://" + "8.8.8.8"
],
maxFailures: 5, // 5 nieudanych prób = brak internetu (5 minut)
checkInterval: 60000, // Sprawdzaj internet co 60 sekund (60000 ms)
relayOffDuration: 60000, // Czas odłączenia prądu: 60000 ms (1 minuta)
// Konfiguracja nocnego restartu (Format: Godzina, Minuta)
nightRebootHour: 1, // Godzina 1 w nocy
nightRebootMinute: 0 // Minuta 00
};
let failureCount = 0;
let isRebooting = false;
let midnightRebootDone = false;
// Funkcja wykonująca twardy reset (wyłącz na 1 minutę, włącz z powrotem)
function doRouterPowerCycle(reason) {
if (isRebooting) return;
isRebooting = true;
print("Uruchamiam restart routera. Powód: " + reason);
// Wyłącz gniazdko
Shelly.call("Switch.Set", { id: 0, on: false }, function() {
print("Zasilanie odcięte. Czekam minutę...");
// Odlicz czas i włącz z powrotem
Timer.set(CONFIG.relayOffDuration, false, function() {
Shelly.call("Switch.Set", { id: 0, on: true }, function() {
print("Zasilanie routera przywrócone.");
// Daj routerowi dodatkowe 5 minut na pełne uruchomienie przed kolejnym testem internetu
Timer.set(300000, false, function() {
failureCount = 0;
isRebooting = false;
print("Watchdog wznawia monitorowanie.");
});
});
});
});
}
// 1. Pętla sprawdzająca internet (co minutę)
Timer.set(CONFIG.checkInterval, true, function() {
if (isRebooting) return;
// Wybieramy losowo jeden z dwóch bezpiecznych serwerów DNS
let url = CONFIG.endpoints.at(Math.floor(Math.random() * CONFIG.endpoints.length));
Shelly.call("HTTP.GET", { url: url, timeout: 15 }, function(response, error_code) {
// Jeśli połączenie się udało (kod błędu 0)
if (error_code === 0 && response) {
failureCount = 0; // Internet działa, zeruj licznik błędów
} else {
failureCount++;
print("Brak odpowiedzi z internetu (" + failureCount + "/" + CONFIG.maxFailures + ")");
// Jeśli uzbiera się 5 minut (5 prób x 60s) ciągłego braku sieci
if (failureCount >= CONFIG.maxFailures) {
doRouterPowerCycle("Wykryto zawieszenie sieci (Watchdog 5 min)");
}
}
});
});
// 2. Pętla sprawdzająca czas do nocnego restartu (co minutę)
Timer.set(60000, true, function() {
let sysStatus = Shelly.getComponentStatus("sys");
if (sysStatus && sysStatus.time) {
let timeParts = sysStatus.time.split(":");
if (timeParts.length >= 2) {
// Pobieranie godziny (indeks 0) i minuty (indeks 1) za pomocą bezpiecznej metody .at()
let currentHour = JSON.parse(timeParts.at(0));
let currentMinute = JSON.parse(timeParts.at(1));
// Sprawdź czy wybiła dokładnie 01:00
if (currentHour === CONFIG.nightRebootHour && currentMinute === CONFIG.nightRebootMinute) {
if (!midnightRebootDone && !isRebooting) {
midnightRebootDone = true;
doRouterPowerCycle("Zaplanowany nocny restart profilaktyczny");
}
} else {
// Resetuj flagę po minięciu godziny 1:00, żeby zadziałało kolejnego dnia
midnightRebootDone = false;
}
}
}
});
print("Skrypt Watchdog + Restart 1:00 został poprawnie zainicjalizowany.");
JSHint nie pokazał błędów.
