Ah. Das las sich für mich anders.
Vermutlich ist es nicht unbedingt notwendig, openHAB dafür tatsächlich komplett neu zu starten.
Aber egal, welche Befehle Du dazu auslösen musst, Du musst zwingend (zur Nutzung des Exec Bindings) eine exec.whitelist befüllen.
Extra Ordner musst Du dazu nicht anlegen, openHAB legt bei der Installation die gesamte benötigte Ordnerstruktur an. Auch die exec.whitelist ist bereits angelegt (aber natürlich leer).
Um openHAB sauber neu zu starten, muss der ausführende User (das ist openhab) das Recht haben, den Dienst
openhab.service neu zu starten. Er braucht das Recht,
sudo aufzurufen.
sudo verlangt die Eingabe eines Passworts, und es ist (eigentlich logisch...) nicht vorgesehen, dieses als Parameter zu übergeben, ganz abgesehen davon, dass es dieses Passwort gar nicht gibt (der User openhab hat kein Passwort für die Anmeldung).
Über die Datei
/etc/sudoers kann man aber genau definieren, dass bestimmte User zum Ausführen bestimmter Befehle kein Passwort für
sudo angeben müssen. Da dies, allgemein gesetzt, ein Sicherheitsleck bedeuten würde, muss man möglichst eng eingrenzen, was erlaubt ist, in diesem Fall der Befehl
Um diesen Befehl so zu hinterlegen, dass openhab ihn ohne Eingabe des Passworts ausführen darf, benutzt Du
visudo.
visudo prüft vor dem Speichern der Datei, ob sie gültig ist. Das ist essenziell, denn wenn die Datei kaputt ist, funktioniert
sudo nicht mehr und Du bist administrativ aus dem System ausgesperrt.
Mit dem Befehl
öffnest Du also die Datei zum Bearbeiten (Du kannst nano als Editor beim ersten Aufruf auswählen).
Nun fügst Du unter den Zeilen
eine weitere Zeile ein:
Code: Alles auswählen
openhab ALL=(ALL:ALL) NOPASSWD: /bin/systemctl restart openhab.service
Diese Zeile bedeutet: Der User openhab ist berechtigt, von allen Rechnern aus (ALL=) im Kontext beliebiger User und beliebiger Gruppen (ALL:ALL) ohne Angabe eines Passworts (NOPASSWD) den angegebenen Befehl auszuführen.
Es gibt noch viele weitere Möglichkeiten, sudo so zu konfigurieren, dass das erwünschte Ziel erreicht wird, die Zeile ist aber hinreichend und sollte funktionieren.
Bleibt noch ein Problem, was eventuell auftreten könnte, nämlich, dass es notwendig ist,
sudo einmalig als User
openhab zu starten (beim ersten Mal gibt es eine Meldung (
Aus großer Macht erwächst auch große Verantwortung).
Ob dieser Schritt zwingend notwendig ist, weiß ich nicht sicher
öffnet eine Konsole unter dem Kontext des Users
openhab. Die Verwendung von
sudo ist hier notwendig, da es kein Passwort für den Login gibt. Da für den User
openhab keine login Shell definiert ist, muss diese explizit angegeben werden, was mit dem Parameter -s geschieht.
In der neuen Konsole kannst Du nun den Befehl ausprobieren, also
Entweder kommt der Screen mit der Meldung (den kannst Du dann einfach mit Enter bestätigen), oder auch nicht...
Nach einer kurzen Bedenkzeit, die
systemctl braucht, um openHAB neu zu starten, landest Du wieder in der Konsole, von der Du dich mit
exit abmeldest.
Nun musst Du dafür sorgen, dass Du den Befehl von openHAB starten lassen kannst. Dabei kannst Du den Befehl komplett angeben, oder Du schreibst ein Shellscript, welches den Befehl absetzt. Letztere Variante hat den Vorteil, dass Du in diesem Script zusätzlich eine Ausgabe in eine Datei vornehmen kannst, anhand derer Du testen kannst, ob der Befehl ausgeführt wurde (bei den meisten Leuten funktioniert das Exec Binding nicht auf Anhieb - das ist aber immer auf eine Fehlbedienung zurückzuführen...

).
Den auszuführenden Befehl kannst Du einfach über die Main UI eingeben. Der entstehende yaml Code sollte ungefähr so aussehen:
Code: Alles auswählen
UID: exec:command:restart
label: Restart
thingTypeUID: exec:command
configuration:
transform:
interval: 0
autorun: false
command: sudo /bin/systemctl restart openhab.service
timeout: 15
UID und Label kannst Du natürlich frei wählen. Anschließend verknüpfst Du den
run Channel mit einem Switch Item. Das Switch Item legst Du wiederum auf eine Page mit der Action
sendCommand mit dem Parameter
ON.
Wen Du nun die Cell betätigst, wirst Du zum einen im Log sehen, dass das Item den Befehl empfängt, zum anderen wird openHAB sich beschweren, dass der Befehl nicht in der whitelist hinterlegt ist
Also noch der Eintrag in die exec.whitelist, über
editierst Du die whitelist und trägst dort dieselbe Zeile ein, wie schon im exec Binding.
Es ist essentiell, dass die Zeichenfolge identisch ist. Es darf zu Beginn der Zeile kein Leerzeichen stehen (weder im exec Binding noch in der exec.whitelist)
Ich habe das Ganze bei mir gerade beispielhaft durchgespielt, bis auf die Möglichkeit, dass ich irgendwo einen Tippfehler drin habe, kann ich garantieren, dass der Weg mit openHAB3 exakt so funktioniert.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet