Hallo,
ich kann gern versuchen zu helfen, den Watchdog zum Laufen zu bekommen. Ist zwar eher für Raspberry Pi optimiert, sollte aber mit minimalsten Anpassungen auch auf anderen Unix-basierten Systemen funktionieren.
Das Ganze besteht aus zwei Teilen. Einmal eine Log-Datei in FHEM, die per AT-Befehl minütlich beschrieben wird. Demgegenüber steht ein Bash-Script, das in einer Schleife prüft, wann die letzte 'Lebensmeldung' von FHEM vorlag. Unterbleibt diese länger als 5 Minuten, wird die ggf. vorhandene FHEM-Instanz gekillt und eine neie gestartet. Dann gibt es not etwas Visualisierung mit FHEM, ist aber nicht wesentlich.
Zum Installieren müssen zunächt einige Dateien aus dem GitHub geholt werden. Sie gehören ins FHEM-Hauptverzeichnis.
- killfhem.sh
Dieses Script beendet FHEM. Wird in anderen Scripten genutzt.
Ich sehe gerade einen kleinen Fehler drin, auch wenn dieser normalerweise nicht zum Vorschein kommen dürfte, werde ich ihn gleich fixen... - killwatchdog.sh
Beendet Watchdog. Wird in Scripten benutzt. - runfhem.sh
Startscript für FHEM. Prüft, ob der Server ggf. bereits ausgeführt wird. - runwatchdog.sh
Startet Watchdog. Sorgt dafür, dass nur eine Instanz aktiv ist. - watchdogloop.sh
Der eigentliche Watchdog. - startfhem
Dieses Script startet Watchdog und FHEM-Server. Darf auch 'per Hand' aufgerufen werden. - stopfhem
Dieses Script beendet Watchdog und FHEM-Server. Allei FHEM zu beenden führt ja nicht zum Erfolg ;-) Darf auch 'per Hand' aufgerufen werden.
Bis auf die letzten zwei sollten die Scripte nicht manuell gerufen werden.
Auchtung! Fast alle diese Scripte haben ein fest 'verdrahtetes' Home-Verzeichnis:
home=/opt/fhem
Bitte ggf. anpassen. Ich werde das vielleicht bei Gelegenheit umbauen und etwas flexibler gestallten.
Die Datei etc_init.d_fhem_script.txt ist kein ausführbares Script! Es hält den Inhalt des FHEM-Verwaltungs-Scriptes /etc/init.d/fhem, damit ich alles an einer Stelle (in GutHub) habe. Es ist nur ein Beispiel, das zeigt, wie man den Startscript umbauen soll, damit beim Start von Betriebssystem auch Watchdog hochgefahren wird. Beim Start/Stop-Vorgang sollen die startfhem / stopfhem Scripte genutzt werden. Das ist alles.
Bei den Scripten ist sicherzustellen, dass diese ausführbar sind: chmod a+x <Dateiname>
Und sie sollten einem passenden Benutzer gehören (z.B. fhem): chown fhen:fhen <Dateiname>
Der Benutzer, unter dessen Account FHEM ausgeführt wird, muss in die sudo-Gruppe. Damit stellen die Scripte sicher, dass sie die Prozesse in jedem Fall benden können: sudo usermod -aG sudo fhem
Und noch muss dieser User diese Scripte ohne Abfrage mit hohen Rechten ausführen dürfen. Dafür muss die Datei /etc/sudoers ergänzt werden:
fhem ALL=(ALL) NOPASSWD: /opt/fhem/runwatchdog.sh, /opt/fhem/killwatchdog.sh, /opt/fhem/watchdogloop.sh, /opt/fhem/runfhem.sh, /opt/fhem/killfhem.sh
Bitte vorsichtig mit dieser Datei! Das sind sicherheitsrelevante Einstellungen! Ist sie kaputt und auch noch der Root-User deaktiviert, hat man sich ausgesperrt.
Bevor man Watchdog aktiviert, sollte man sicherstellen, dass FHEM-Teil richtig läuft, ansonsten wird der FHEM alle 5 Minuten immer und immer wieder restartet.
in fhem.cfg wird folgendes ergäntz:
# Definition eines Dummy-Objektes fuer 'Alive'-Meldungen
define NN_TE_DMST01.Server_Heartbeat dummy
# Protokoliert Zeitpunkt der letzten Änderung (in Objekt-Eigenshaften)
attr NN_TE_DMST01.Server_Heartbeat userReadings lastChange { CurrentTime() }
# Definition der Log-Datei
define FileLog_NN_TE_DMST01.Server_Heartbeat FileLog ./log/NN_TE_DMST01.Server_Heartbeat-%Y-%m.log NN_TE_DMST01.Server_Heartbeat
attr FileLog_NN_TE_DMST01.Server_Heartbeat logtype myServerHeartbeat:Plot,text
# Visualisierung mittels eines Diagramms
define 0.wlHeartbeat SVG FileLog_NN_TE_DMST01.Server_Heartbeat:myServerHeartbeat:CURRENT
# Routine zur regelmaessigen Änderungen des Wertes des Dummy-Objektes
define tickHeartbeat at +*00:01:00 {tickHeartbeat('NN_TE_DMST01.Server_Heartbeat');;}
attr tickHeartbeat alignTime 00:00
# Log-Datei des Watchdogscriptes verfügbar machen
define FileLog_wathdog FileLog ./log/watchdog.log fakelog
# Visualisierung für Watchdog-Log
define 0.wlWatchdog SVG FileLog_wathdog:myWatchdog:CURRENT
Hier wird eine Methode 'tickHeartbeat' genutzt, die irgendwo abgelegt werden muss. Bei mir liegt diese in der Datei <FHEM-Root>/FHEM/99_MyUtils.pm
Dort ist folgendes hinzufügen:
# Liefert aktueller Zeitstempel
sub
CurrentTime()
{
return strftime("%H:%M:%S", localtime());
}
# --- server heartbeat / watchdog ---
sub tickHeartbeat($)
{
my ($device) = @_;
my $v = _getDeviceValueNumeric($device);
$v = $v+1;
if($v>=60) {$v=0;}
fhem("set $device $v");
}
# Liefert den aktuelen numerisschen Wert eines Ger?tezustandes.
# Setzt bei Bedarf die symbolische Werte (up, down) in ihre
# Zahlenwertrepresentationen um.
sub
_getDeviceValueNumeric($)
{
return _convertSymParams(Value($_[0]));
}
# Setzt Parameter-Werte fuer symbolische Werte in ihre Zahlenwerte um.
# up = 100, down = 0
sub
_convertSymParams($)
{
my $value = $_[0];
# Endwerte und andere symbolischen Konstanten beruecksichtigen,
# Gross-/Kleinschreibung ignorieren
$value = lc($value);
if($value eq "down" || $value eq "runter" || $value eq "off") { return 0; }
elsif($value eq "up" || $value eq "hoch" || $value eq "on") { return 100; }
elsif($value =~ /schatten.*/) { return 80; }
elsif($value =~ /halb.*/ ) { return 60; }
# Numerische Werte erwartet
my $ivalue = int($value);
if($ivalue < 0) { return 0; }
elsif($ivalue > 100) { return 100; }
elsif($ivalue > 0) { return $ivalue; }
# Pruefung, ob bei 0 da wirklich eine Nummer war
if($value eq $ivalue or $value eq "0 %" or $value eq "0%") { return 0; }
# Default-Fall: Bei unbekannten Werten soll Rollo offen sein
return 100;
}
Man könnte das auch einfacher realisieren, fand ich aber schöner fürs Plot.
Dann haben wir nur noch
und
Das sind die Plots und gehören natürlich nach <FHEM-Root>/www/gplot
So, da habe ich bestimmt noch etwas vergessen.

Bitte ausprobieren und ggf. melden, wenns nicht laufen will.
Grüße,
Alexander
Links:
http://s6z.de/cms/index.php/homeautomation/fhem/23-fhem-watchdoghttps://github.com/hexenmeister/MyFHEM