Ausführen eines Bash Skriptes aus OH3 gelingt nicht

Hier bitte alles rein was Off-topic ist.

Moderatoren: Cyrelian, seppy

Antworten
EiGudeWie
Beiträge: 24
Registriert: 27. Apr 2020 19:44

Ausführen eines Bash Skriptes aus OH3 gelingt nicht

Beitrag von EiGudeWie »

Hallo zusammen,

habe ein ganz einfaches Bash Skript mit dem ich meine Synology NAS aufwecke. Hier der Inhalt:

Code: Alles auswählen

#!/bin/bash
wakeonlan xx:xx:xx:xx:xx:xx
(die XX stellen hierbei natürlich meine MAC Adresse dar)

Das Skript funktioniert direkt von der Kommandokonsole super gut, völlig problemlos. Nun würde ich das Ganze gerne über mein OpenHAB (Version 3) haben. Das EXEC Binding dazu habe ich installiert und mir eine RULE angelegt mit folgendem Code:

Code: Alles auswählen

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
Das Bash Skript gehört auch dem OpenHAB User im Linux System und ist mit 777 Rechten wirklich von jedermann ausführbar.

Code: Alles auswählen

linuxadmin@odroidc2:/etc/openhab/scripts$ ls -l
insgesamt 8
-rw-r--r-- 1 openhab openhab 236 27. Jun 2022  readme.txt
-rwxrwxrwx 1 openhab openhab  42 16. Jan 15:58 wolsynology.sh
Leider passiert in OH3 garnix, wenn ich obigen Code ausführen lasse.... Hier die LOGS:

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

2023-01-16 16:22:46.052 [WARN ] [o.internal.handler.SysteminfoHandler] - No information for channel battery#remainingTime with device index: 0
Ich bin wirklich absolut ratlos,wieso das nicht will... Hat jemand ne Idee?

Benutzeravatar
udo1toni
Beiträge: 11105
Registriert: 11. Apr 2018 18:05
Answers: 157
Wohnort: Darmstadt

Re: Ausführen eines Bash Skriptes aus OH3 gelingt nicht

Beitrag von udo1toni »

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:

Code: Alles auswählen

/bin/bash /etc/openhab/scripts/wolsynology.sh
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.
openHAB3.4.1 in einem Debian-Container (Proxmox, LXC)

EiGudeWie
Beiträge: 24
Registriert: 27. Apr 2020 19:44

Re: Ausführen eines Bash Skriptes aus OH3 gelingt nicht

Beitrag von EiGudeWie »

Hallo udo1toni,

danke für die ausführliche Antwort.
Ja, ich hatte es zuerst auf dem herkömmlichen Weg versucht, mittels Netzwerk Binding, da kam aber immer ein Fehler:

Code: Alles auswählen

2023-01-17 20:12:17.105 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - ScriptEngine for language 'application/javascript' could not be found for identifier: e5b41483-e16d-453a-8574-c620792442ff
Deshalb lasse ich es jetzt einfach über ein Shell Skript laufen, hier hatte ich nur noch das Problem dass das noch nicht gewhitelistet war. Isses nun, und damits gehts wunderbar!

vielen dank!

Benutzeravatar
udo1toni
Beiträge: 11105
Registriert: 11. Apr 2018 18:05
Answers: 157
Wohnort: Darmstadt

Re: Ausführen eines Bash Skriptes aus OH3 gelingt nicht

Beitrag von udo1toni »

Aber nein. Das hat nichts mit der whitelist zu tun. deie whitelist spielt nur eine Rolle, wenn Du über das exec Binding und ein Thing ein Script startest.
Die fehlermeldung besagt, dass Du einen Befehl verwendest, welcehr in der verwendeten Sprache javascript nicht bekannt ist.
Der von Dir (und auch von mir) gezeigte Code ist KEIN JavaScript, sondern DSL.
Außerdem weist der Fehler darauf hin, dass Du den Code über die UI eingegeben hast. In der UI dürfen die Schlüsselworte rule, when, then und end nicht in den Rule Code eingegeben werden.

Ich kann Dir versichern, dass das Network Binding hervorragend funktioniert, ganz ohne whitelisting.
openHAB3.4.1 in einem Debian-Container (Proxmox, LXC)

Antworten