Je größer die FHEM Installation wird im eigenen Smart Home, desto mehr Fehler sind auch möglich – das kann dann dazu führen, dass FHEM abstürzt und nicht mehr reagiert. In der Regel ist der Rechner, auf dem FHEM läuft, aber noch aktiv – nur FHEM ist abgestürzt. Hier stellen wir eine einfache Möglichkeit vor, um den FHEM Absturz festzustellen und dann den Rechner neu zu starten!
FHEM Absturz: Ist FHEM abgestürzt?
Zunächst muss FHEM regelmäßig mitteilen, dass es noch läuft und nicht abgestürzt ist – eine Möglichkeit ist, dass es alle 10 Minuten mit einem Perl-Kommando die aktuelle Zeit als Linux-Timestamp in eine Datei schreibt – nach 10 Minuten wird der Wert wieder überschrieben:
define FHEM_Online at +*00:10:00 {\
open(TIMESTAMPDATEI, ">/home/pi/fhem_timestamp.txt");;\
print TIMESTAMPDATEI "".time()."";;\
close(TIMESTAMPDATEI);;\
}
attr FHEM_Online alignTime 00:00
(So gibt man die Daten in FHEM ein!)
Die in Zeile 2 angegebene Datei muss dabei unbedingt für FHEM beschreibbar sein und die Rechte 664 oder 666 besitzen – andernfalls wird kein neuer Zeitwert geschrieben und der Rechner startet alle 10 Minuten neu.
Kann FHEM die Datei aber beschreiben, wird dort alle 10 Minuten der aktuelle Timestamp als Wert in einer Text-Datei gespeichert. Der Pfad lautet in unserem Beispiel “/home/pi/fhem_timestamp.txt”, damit wird die Datei im Benutzerordner “pi” auf dem Raspberry Pi gespeichert!
Timestamp Datei auslesen und Rechner neu starten – PHP
In unserem ersten Beispiel lesen wir die von FHEM geschriebene Datei mit PHP aus und starten den Rechner neu, wenn FHEM seit 30 Minuten keinen neuen Zeit-Wert in die Datei geschrieben hat. Da das PHP Skript später direkt per Root-Cronjob ausgeführt wird, gibt es auch keine Rechte-Probleme: Der Rechner lässt sich direkt aus dem PHP Skript neustarten!
Noch kein PHP installiert?
Wenn man bei der Eingabe von PHP die Fehlermeldung “bash: php: command not found” erhält, muss man PHP erst installieren. Anderenfalls beendet man PHP wieder durch Drücken von STRG und C.
PHP Code um den FHEM Wert zu lesen und den Rechner neu zu starten
Mit dem folgenden PHP Code wird die Datei eingelesen und ausgewertet – statt PHP kann man dafür aber auch eine andere Programmiersprache nehmen. Der Code sollte als PHP Datei gespeichert werden – zum Beispiel so:
nano /home/pi/fhem_timestamp.php
Mit STRG + O lässt sich die Datei speichern, nachdem man den Code eingefügt hat, mit STRG + X beendet man den Nano-Editor wieder.
<?php
$aktuell = time();
// FHEM Timestamp aus Datei einlesen
$fhem_timestamp = file('fhem_timestamp.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$fhem_timestamp = $fhem_timestamp[0];
echo '$fhem_timestamp: '.$fhem_timestamp."\n";
// Pruefen, ob Timestamp in Datei vorhanden
if(!isset($fhem_timestamp)) { $fhem_timestamp = 0; }
// Ueberpruefen: Wenn geschriebene Variable vor mehr als 30 Minuten aktualisiert...
if($aktuell > ($fhem_timestamp + 1800)) {
// Datei ist aelter - FHEM scheint abgestuerzt - Reboot!
exec('sudo service fhem stop');
exec('sudo service fhem start');
}
?>
Alternativ kann man auch, wenn das Neustarten des FHEM Dienstes nicht funktioniert, statt den beiden “exex()” Befehlen den Befehl zum Neustart des Rechners geben:
exec('sudo /sbin/reboot');
Dieser PHP Code prüft nun, ob der von FHEM regelmäßig gespeicherte Zeitwert älter als 30 Minuten (1800 Sekunden!) ist. Wenn ja, hat der Smart Home Server nichts mehr gespeichert und scheint abgestürzt zu sein: Dann startet das PHP Skript den Rechner neu.
Das funktioniert, weil PHP nicht über den Webserver, sondern direkt über die Konsole ausgeführt wird: Ansonsten hätte man keine Berechtigung, den Rechner mit dem Skript neu zu starten.
Damit das passiert, muss man sich als Root User anmelden und danach mit dem Befehl “crontab -e” die Root-Cronjobs bearbeiten: Das sind automatisch zu bestimmten Uhrzeiten ausgeführte Befehle oder Programme. Am Ende der crontab Datei fügt man jetzt diese Zeile ein:
1,11,21,31,41,51 * * * * sudo php /home/pi/fhem_timestamp.php
Wichtig ist dabei, dass der Pfad zu dem PHP Programm stimmt – falls es nicht im /home/pi Ordner liegt. Am Ende der Datei muss sich außerdem eine Leerzeile befinden – einmal Enter drücken reicht.
Jetzt sollte der Rechner alle 10 Minuten prüfen, ob FHEM noch läuft oder sonst automatisch neustarten. Alternativ zum Server-Neustart lässt sich meistens auch FHEM alleine neu starten – da das je nach Betriebssystem aber anders aussehen kann, zeigen wir hier im Skript den kompletten Neustart.