Norick hat geschrieben: ↑3. Okt 2023 05:58
Ich möchte einen Schalter (switch) mit OH 4 erstellen welches jedoch nicht über KNX o.ä. verknüpft ist. Das heisst der Schalter soll einfach "verlinkt" werden mit einem exec-binding um ein batch-file zu starten.
Das exec Binding ist ein Binding, genau wie das knx Binding. Es besteht hier insofern überhaupt kein Unterschied zu knx.
Das Switch Item musst Du mit dem
Input Channel verknüpfen (NICHT mit run), denn Du möchtest den Zustand des Schalters an das Script übergeben, das läuft über den Input Channel.
Im exec Thing setzt Du
Autorun auf true und
Intervall belässt Du auf 0. Außerdem fügst Du im Aufruf noch
%2$s hinzu, dieser Platzhalter wird beim Ausführen mit dem empfangenen Befehl aus dem Input Channel ersetzt.
Autorun = true sorgt dafür, dass der Befehl ausgeführt wird, sobald im Input Channel ein Befehl eintrifft.
Sollte das Script eine Ausgabe liefern, so bekommst Du diese über den Output Channel (ebenfalls vom Typ String).
Der run Channel gibt einerseits Auskunft darüber, ob das Script gerade läuft, zum anderen kann man darüber das Script auch manuell starten (hier unwichtig).
Weiterhin gibt es den Rückgabestatus, ein Number Channel. Bash Scripte liefern eine 0, wenn alles in Ordnung war oder eine von 0 abweichende Zahl, wenn Fehler aufgetreten sind. Je nach Script kann man am Wert eventuell sogar auf die Art des Fehlers schließen.
Und dann gibt es noch einen Datetime Channel, mit dem der letzte Zeitpunkt der Ausführung geliefert wird (natürlich nur, solange openHAB nicht zwischendurch neu gestartet wurde).
Beachte, dass Du das Command zwingend
exakt wie hinterlegt zusätzlich noch in
$OPENHAB_CONF/misc/exec.whitelist eintragen musst.
Für jedes Exec Thing kannst Du dort eine Zeile nutzen. Die Zeile muss genau die als Command angegebene Zeichenkette abbilden, also mit dem Platzhalter.
Alternativ kannst Du den Switch auch ungebunden nutzen und das Script über eine Rule starten, z.B. so (DSL Code):
Code: Alles auswählen
rule "starte Bash Script"
when
Item MeinSwitch received command
then
val output = executeCommandLine(Duration.ofSeconds(5), "/bin/bash","/pfad/zum/script.sh",receivedCommand.toString)
end
Statt Leerzeichen wird jeweils ein weiterer String angegeben.
receivedCommand enthält bei Rules, die auf
received commend getriggert wurden das empfangene Kommando. Wir brauchen dieses als String, was mit .toString sichergestellt wird.
Die Variante über executeCommandLine hat den Charme, dass man auf die
exec.whitelist verzichten kann. Dafür fehlt allerdings der Rückgabewert als Zahl.
Egal ob über
executeCommandLine oder über das
exec Binding, es ist empfehlenswert, immer absolute Pfade zum Befehl und zum Script anzugeben.
Es ist möglich, dass die Ausführung auch ohne Angabe der Shell (hier
/bin/bash) funktioniert, darauf verlassen würde ich mich aber nicht, da man die Standard Shell für jeden User individuell festlegen kann, das kann also jederzeit bei einem Update geändert werden.
Wenn die Shell explizit genannt wird, ist man hier sicher.