Hängenden Router automatisch rebooten

Manchmal hat man da, wo der Pi seinen Dienst als Webcam oder als Home Automation Server versieht, keinen Festnetzanschluß. Die Lösung ist ein Router, an den man einen UMTS Internetstick anschließt oder ein fertiger UMTS (LTE ist natürlich noch besser) Router.

Leider verhält es sich so, dass diese Konfiguration immer mal wieder menschlicher Interaktion bedarf:  Unter Umständen ist das Mobilfunknetz so stark überlastet, dass der Router, bzw. der Internet Stick daran sich einfach nicht verbinden will. Nach zu vielen Fehlversuchen streikt der Router dann – zumindest der von mir verwendete TP-Link Mobilfunk Router TL-MR3420. Dann hilft nur ein physikalischer Reset des Routers. Blöd, wenn man dann nicht vor Ort ist, sondern hunderte Kilometer entfernt.

Man könnte den Router ganz einfach mit einer Zeitschaltuhr irgendwann (nachts) aus- und wieder einschalten. Im schlimmsten Fall wäre der Pi dann 24 Stunden offline.

Viel eleganter ist die Lösung mittels Fernschalt-Steckdosen und einem 433MHz Sender am Pi.

Wie man 433MHz Schaltsteckdosen mit dem Pi ansteuert, ist hier beschrieben.

Dann kommt der von mir “entwickelte” Python Code zum Überwachen und Steuern des Routers. Ich bin leider kein Python Experte, weshalb der Code für Experten wahrscheinlich etwas schlampig aussieht. Für Anregungen wäre ich sehr dankbar!

Den oben abgebildeten Code in den Editor pasten und als checkinet.py im Verzeichnis /home/pi/433mhz abspeichern.

Was passiert da?

Zuerst einmal werden die benötigten Libraries inklusive der Klasse “RemoteSwitch” aus dem in diesem Beitrag besorgten Programm elropi.py geladen.

Die Funktion internet_on funkt eine frei wählbare Internet Adresse an. Sinnvollerweise eine, welche eine schnelle Response zeigt. Den Timeoutwert in Sekunden kann man frei wählen. Ist er zu kurz, wird der Router bei schlechten Empfangsbedingungen entsprechend öfter zurückgesetzt.

Dann werden alle Konstanten gesetzt, inklusive der Konstanten für RemoteSwitch. Die im 433MHz Beitrag vorgenommene Einstellung des GPIO Pins und der Systemadresse der Funkschaltdose in elropi.py keinen Einfluss auf die Einstellungen, die du hier in checkinet.py vornimmst. Deshalb müssen diese Parameter hier noch einmal eingegeben werden.

Zusätzlich wird noch die Python Logging Komponente angesprochen, die es dir erlaubt, die Funktionsweise und ggf. stattgefundene Resets zu überprüfen. Print Statements kannst du natürlich auch einbauen, aber die sind nur sichtbar, wenn man das Programm direkt aufruft. Wir werden das Programm ja automatisch und im Hintergrund laufen lassen. Wer mag, kann anstatt level=logging.WARNING auch level=logging.DEBUG
schreiben; dann wird jedesmal, wenn das Programm läuft eine Zeile “router online” ins Protokoll geschrieben.

Die angegebene Internet Adresse wird angefunkt. Ist alles okay, wird das Programm beendet. Falls nicht, wird die  While Schleife x-mal bis zu einem einstellbaren Maximalwert durchlaufen, zwischen den Versuchen wird immer ein bisschen gewartet. Nach dem x-ten Fehlversuch wird der Schaltdose ein Abschalt-Kommando geschickt. Nach einer einstellbaren Wartezeit wird die Dose wieder eingeschaltet und der Router bootet – natürlich nur, wenn er auch tatsächlich an der Schaltdose hängt 🙂 . Wenn alles klappt, hat sich der Router nach ein paar Minuten mit dem Internet verbunden. Falls nicht, geht beim nächsten Start das Spiel wieder von vorne los.

Regelmäßiger Check? In die Crontab damit!

So, das wars fast schon. Damit die Internetverbindung regelmäßig getestet wird gehen wir wie folgt vor:

Die Crontab wird geladen. Ans untere Ende sollten wir folgenden Befehl schreiben:

2,12,22,32,42,52 * * * * python /home/pi/433mhz/checkinet.py

Das bewirkt, dass das Programm alle 10 Minuten zur 2., 12., 22., 32., 42 und 52. Minute ausgeführt wird. Das mache ich deshalb, weil meine Webcam zu jeder vollen und halben Stunde ein Foto macht und dann etwas Zeit braucht, die Bilder in meinen Webspace hochzuladen. Während dieser Zeit ist der Kanal dicht und es könnte zu einem ungewollten Timeout und Reset kommen – meine Bandbreite ist manchmal echt jämmerlich.
Es ginge natürlich auch

*/10 * * * * python /home/pi/433mhz/checkinet.py

dann würde der Check alle 10 Minuten zur vollen zehnten Minute stattfinden.
Wie oft ihr das Programm laufen lasst, bleibt euch überlassen. Allerdings sollte zwischen den Aufrufen genügend Zeit bleiben, dass sich der Router bzw. Internet Stick wieder mit dem Internet verbindet. Sonst gibt’s eine Endlosschleife.
Stellt man die Crontab mit sudo crontab ein, wird sie immer als Superuser ausgeführt, ihr braucht deshalb den Prefix sudo nicht. python bräuchte man eigentlich auch nicht, wenn man das in diesem Beitrag Beschriebene beachtet. Der Einfachheit halber und wohl eher aus Gewohnheit lasse ich das trotzdem meist drin, da ich anfänglich Schwierigkeiten mit dem impliziten Aufruf des Pythoninterpreters hatte.

Zusätzliche Absicherung und Mail Benachrichtigung

Warum auch immer, manchmal will sich das Edimax USB Dongle (ansonsten wirklich hervorragend) nicht mehr mit dem frisch gestarteten Router verbinden. Das führt dann auch zu einer Endlosschleife, da checkinet.py nix checkt bzw. keine Verbindung zum Router zustande kommt.  Was tun? Ganz einfach: den Raspberry Pi nach erfolgten Reset und ein paar Gedenkminuten durchstarten.

Dazu braucht es noch die os Library und den Befehl os.system("sudo reboot") an geeigneter Stelle.

Hier mein ganzes Programm, was als zusätzliches Komfortfeature noch ein Email an mich schickt, wenn der Router resetted wurde. Die Mailfunktion habe ich von Trevor Appleton’s Website.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Wordpress Anti-Spam durch WP-SpamShield