Hier stelle ich euch meine Lösung vor, wie ich aus FHEM heraus meinen Server (lokal) und meine(n) Raspberry Pi(’s) per FHEM2FHEM (remote) neu starte.
Grundvorraussetzungen:
FHEM braucht Zugriff auf die Shell des Linux-Systems sowie die Rechte „sudo“ benutzen zu dürfen!
Dazu müssen zwei System-Dateien bearbeitet werden.
1. /etc/passwd
sudo nano /etc/passwd
Hier wird folgendes geändert:
fhem:x:999:20::/opt/fhem:/bin/none
in:
fhem:x:999:20::/opt/fhem:/bin/bash
Mit „Strg+O“ speichern und mit „Strg+X“ schließen.
2. /etc/sudoers
sudo nano /etc/sudoers.d/fhem
In diese Datei fügt ihr folgende Zeile ein:
fhem ALL=(ALL) NOPASSWD: ALL
Mit „Strg+O“ speichern und mit „Strg+X“ schließen.
Jetzt fehlt nur noch ein:
sudo reboot
Nach dem Neustart hat der User „fhem“, vollen Zugriff auf das System und kann Befehle per sudo ausführen.
Lokales System neustarten
Hier reicht ein einfacher Befehl über die FHEM-Commandozeile oder z.B. FTUI.
Bei dem Befehl „system(“);“ handelt sich um einen in FHEM integrierten Perl-Befehl. Darum muss dieser Befehl in der Commando-Zeile mit geschwungenen Klammern {} geschrieben werden.
{ system('sudo reboot &') }
Das System sollte nun neustarten.
Remote System über FHEM2FHEM neustarten
Vorrausetzung hierfür ist ein funktionierendes FHEM2FHEM-Device auf dem Remote-System
define [NAME] FHEM2FHEM [IP:TELNETPORT] LOG: [PASSWORT]
[IP] und [TELNETPORT] stammen vom Haupt-System. [PASSWORT] wird benötigt falls der Telnet-Port des FHEM auf dem Haupt-System mit einem Passwort geschützt ist.
Hierzu schaut ihr aber am Besten in die commandRef!
Auf dem Haupt-System definieren wir in FHEM einen Dummy, welcher später getriggert wird.
define reboot_remote dummy
Auf dem Remote-System definieren wir ein notify welches auf den Dummy des Haupt-System’s lauscht:
define reboot_per_remote notify reboot_remote:reboot.* { system('sudo reboot &') }
Nun muss noch die Definition des FHEM2FHEM-Devices ergänzt werden:
Ich mache diesen Schritt gern über FHEM-WEB, indem ich das FHEM2FHEM-Device öffne und links neben der Device-Definition auf „DEF“ klicke.
Die Defnition sollte dann minimal so aussehen:
[IP]:[TELNETPORT] LOG:reboot_remote [PASSWORT]
Mit einem klick auf „modify [NAME]“ speichern!
Um jetzt das Remote-System vom Haupt-System aus neu zu starten reicht auf dem Haupt-System der Befehl:
trigger reboot_remote reboot
Der Dummy im Hauptsystem wird getriggert.
Wer jetzt den EventMonitor verfolgt, sieht, dass auf beiden Systemen ein Event ähnlich
XXXX dummy reboot_remote reboot
erzeugt wird. Dieses wird vom notify „abgefangen“ und löst den „System-Befehl“ zum neustarten aus.