Da kommen vermutlich einige Fehler zusammen...
Punkt 1: Das hier:
Code: Alles auswählen
2023-01-16 16:22:26.667 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'BashSkript' failed: Shell Script Item:
String WakeOnLanScript "Wake On LAN Script" {shell="/bin/bash","/etc/openhab/scripts/wolsynology.sh"}
Rule Item:
rule "Wake On LAN"
when
Item WakeOnLanScript received command
then
executeCommandLine(WakeOnLanScript.state.toString)
end
weist darauf hin, dass Du die Rule über die UI erstellt hast. Die Notation ist aber die einer .rules Datei im Ordner $OPENHAB_CONF/rules/.
Wenn Du in der UI eine Rule anlegst, wählst Du den oder die Trigger für die Rule direkt in der UI aus. Entsprechend ergibt es keinen Sinn, diese nochmals im Rulecode angeben zu müssen. Der eigentliche Code der Rule befindet sich
zwischen den Schlüsselworten
then und
end (die beiden Worte gehören also ebenfalls nicht zum Code und dürfen auch nicht mit angegeben werden).
Außerdem stehen da noch weitere Dinge drin, die in einer Rule nichts zu suchen haben.
Das hier:
Code: Alles auswählen
String WakeOnLanScript "Wake On LAN Script" {shell="/bin/bash","/etc/openhab/scripts/wolsynology.sh"}
scheint eine Item Definition aus openHAB1 zu sein, wobei ich mich nicht mal wirklich an ein shell-Binding erinnern kann.
Das hier:
Rule Item:
hat ebenfalls nichts in einer Rule verloren. Also, abgesehen davon, dass es so etwas wie ein Rule Item in openHAB gar nicht gibt.
Dann die Rule an sich (im Textdatei Format):
Code: Alles auswählen
rule "Wake On LAN"
when
Item WakeOnLanScript received command
then
executeCommandLine(WakeOnLanScript.state.toString)
end
Wenn das Item (!) WakeOnLanScript einen Befehl empfängt, soll es den Inhalt des Status (!) zeichengenau als Kommando ins System absetzen. Es mag ja sein, dass Du den eigentlichen Befehl tatsächlich irgendwie als Befehl an das Item senden kannst, aber: 1. ist der Status nicht der Befehl und 2. sehe ich auch hier den tieferen Sinn nicht. Möchtest Du tatsächlich diesen String:
als Befehl in das Item eingeben?
Und wo wir schon dabei sind... Der Ordner
/etc/openhab/scripts/ ist
NICHT für shell-Scripte gedacht. Im Ordner
/etc/openhab/scripts/ liegen stattdessen
ausschließlich Dateien mit der Endung
.script (also abgesehen von der readme.txt)
Diese Dateien dürfen ausschließlich DSL Scripte enthalten, welche dann mit
callScript(<datei>) aus einer DSL Rule heraus aufgerufen werden können, wobei
<datei> der Dateiname
ohne die Endung
.script ist.
executeCommandLine() ist im übrigen eine Action, die zum Core von openHAB gehört. Das exec Binding hat damit nichts zu tun.
Aber weiter geht's
Die Frage, die ich mir nämlich schon zu Beginn gestellt habe: Warum nutzt Du dafür überhaupt ein Shellscript?
openHAB hat ein Network Binding. Wenn Du das installierst, kannst Du Things anlegen. Ich gebe hier die Textdatei Schreibweise an:
Code: Alles auswählen
Thing network:pingdevice:server "NH Server"[
hostname="server-ip",
port=0,
retry=1,
timeout=5000,
refreshInterval=60000,
macAddress="12:34:56:78:9a:bc" ]
Das Interessante an diesem Thing: es erfüllt mehrere Funktionen. Zum Einen kann ich ein Item zum Überwachen des Status anlegen:
Code: Alles auswählen
Switch Server_NH "Server ist [%s]" { channel="network:pingdevice:server:online"}
Dieses Item zeigt mir also an, ob der Server gerade ON oder OFF ist. Es sendet dazu alle
<refreshInterval> Millisekunden ein Ping an das Gerät, welches innerhalb
<timeout> Millisekunden antworten muss. In der Konfiguration oben also alle 60 Sekunden, wenn die Antwort mehr als 5 Sekunden auf sich warten lässt, springt der Schalter auf OFF um.
Zum Anderen kann man in einer Rule nun eine Action aufrufen:
Code: Alles auswählen
rule " wake on lan"
when
Item Server_NH received command ON
then
val actions = getActions("network", "network:pingdevice:server")
actions.sendWakeOnLanPacketViaMac()
end
Der Code ist für openHAB ab Version 2 (bzw. eben das Network Binding)
Willst Du die Rule über die UI erzeugen, so gibst Du als Trigger received command ON an, mit dem passenden Switch Item, als Action definierst Du eine DSL Rule und verwendest lediglich die beiden Zeilen
Code: Alles auswählen
val actions = getActions("network", "network:pingdevice:server")
actions.sendWakeOnLanPacketViaMac()
Die erste Zeile stellt Die Verbindung zum Thing her, die zweite Zeile ruft den eigentlichen Befehl auf.
Wenn Du noch eine zweite Rule mit received command OFF definierst, könntest Du die Synology auch noch über den selben Schalter ausschalten. Nicht davon irritieren lassen, dass der Schalter nach dem Betätigen seine Position wechselt, das kommt vom Network Binding. Sobald der neue Zustand erreicht ist, springt der Schalter auch in die gewünschte Position und bleibt dort.
openHAB4.0.3 in einem Debian-Container (bookworm) (Proxmox 8.0.4, LXC), mit openHABian eingerichtet