Herzlich willkommen im openHAB Forum!
Zunächst einmal musst Du zwei Dinge auseinander halten, nämlich GNU/Linux Scripte und openHAB (Scripte).
Du kannst über das Exec Binding oder auch per Rule Befehl ein GNU/Linux Shell Script ausführen, immer gegeben, dass im Container alle Voraussetzungen vorhanden sind. Und da ist schon die erste ernsthafte Hürde.
Ich denke nämlich nicht, dass ein Paket wie curl im offiziellen openHAB Container eingebaut ist, das wäre im Zweifel nur unnötiger Ballast.
openHAB kann Scripte ausschließlich im eigenen Container laufen lassen, dort muss also auch curl installiert sein.
Du kannst testen, ob Du den curl Befehl erfolgreich von dort starten kannst (als User openhab, nicht als root), dazu musst Du Dich über docker mit dem Container verbinden, damit Du den fraglichen Befehl senden kannst.
Nur falls Du das Exec Binding verwendest, musst Du exakt den Befehl, den Du auch im Exec Thing hinterlegt hast, zusätzlich in der whitelist eintragen.
Aber es gibt noch ein paar weitere Punkte:
Dein gezeigtes Script
Code: Alles auswählen
#!/bin/bash
var Exec = Java.type("org.openhab.core.model.script.actions.Exec");
Exec.executeCommandLine(Duration.ofSeconds(5),"/etc/openhab/scripts/lineDetectOn.sh")
ist Unsinn.
Zeile 1 weist darauf hin, dass
/bin/bash zur Ausfürung verwendet werden soll. Das ist im Grunde genommen passend, aber leider steht
/bin/bash im openHAB Container nicht zur Verfügung. Wenn, dann müsstest Du also
/bin/sh verwenden.
Zeile 2 ist eine Definition, die sich auf JavaScript Scripting innerhalb openHAB bezieht. in einem Shell Script hat diese Zeile nichts zu suchen.
Zeile 3 könnte theoretisch auch in einem JavaScript vorkommen, ist dann allerdings fehlerhaft (es fehlt hinten ein Semikolon). Du könntest unter Umständen aber die Zeile so in einer DSL Rule verwenden.
Allerdings: Der Befehl bewirkt dann nur, dass ein Shell Script ausgeführt wird, welches im Verzeichnis
/etc/openhab/scripts/ liegt und den Namen
lineDetectOn.sh trägt.
ACHTUNG! Das Verzeichnis
/etc/openhab/scripts/ ist NICHT für Shell Scripte gedacht. Hier dürfen streng genommen ausschließlich Dateien mit der Endung
.script liegen, und diese Dateien dürfen ausschließlich jeweils ein einzelnes DSL Script enthalten, denn nur dafür ist dieses Verzeichnis da.
Also... zunächst musst Du sicherstellen, dass der Befehl curl überhaupt zur Verfügung steht, und zwar innerhalb des Containers. Ist das nicht der Fall, so scheidet der Weg über curl direkt aus.
Steht curl wider Erwarten im Container zur Verfügung, brauchst Du ein Script mit folgendem Inhalt:
Code: Alles auswählen
#!/bin/sh
curl --digest -X PUT "http://<Name>:<Passw>@<IP>/ISAPI/Smart/linedetection" -d "<LineDetectionList xmlns=\"http://www.hikvision.com/ver20/XMLSchema\" version=\"2.0\"><LineDetection><id>1</id><enabled>true</enabled></LineDetection></LineDetectionList>"
Wo Du dieses Script hin legst, ist relativ egal, mein Tipp wäre aber der userdata Zweig (der sollte als Volume im Container gemountet sein). Der Name des Scripts wäre dann wie gehabt
lineDetectOn.sh.
Nun musst Du dieses Script von openHAB aus starten, vorzugsweise über das exec Binding. Dazu legst Du zunächst ein exec Thing an (hier als Textdefinition, kannst Du aber auch über die UI erstellen):
Code: Alles auswählen
Thing exec:command:lineDetectOn "Linie einschalten" [
command="/pfad/zur/datei/lineDetectOn.sh",
interval=0,
timeout=5,
autorun=false
]
Exakt die command-Zeile trägst Du zusätzlich in die Datei /etc/openhab/misc/exec.whitelist als einzelne Zeile ein. Exakt heißt in diesem Falle, dass die Zeile identisch sein muss, kein Leerzeichen vorne dran, keines hinten dran, kein Kommentar oder sonst was. Also so:
Natürlich musst Du
/pfad/zur/datei/ jeweils mit dem echten Pfad ersetzen, und ja, es muss der absolute Pfad sein, so, wie er innerhalb des Containers gilt, zumindest, wenn Du willst, dass es funktioniert.
Hast Du mehrere exec Things, so legst Du für jedes command eine neue Zeile an.
Nun legst Du ein Switch Item an, welches mit dem run-channel verknüpft wird:
Code: Alles auswählen
Switch LineDetectArm "LineDetection scharf schalten" {channel="exec:command:lineDetectOn:run"}
Jedes Mal, wenn Du den Schalter auf ON schaltest, sollte nun das Script gestartet werden. Schau dazu in das events.log, dort sollte es einen entsprechenden Eintrag geben.
Zum Ausschalten müsstest Du nun ein zweites Script, ein zweites Thing und ein zweites Switch Item anlegen, was mir reichlich umständlich erscheint. Besser wäre also, das Script mit einem Parameter zu versehen:
Code: Alles auswählen
#!/bin/sh
curl --digest -X PUT "http://<Name>:<Passw>@<IP>/ISAPI/Smart/linedetection" -d "<LineDetectionList xmlns=\"http://www.hikvision.com/ver20/XMLSchema\" version=\"2.0\"><LineDetection><id>1</id><enabled>$1</enabled></LineDetection></LineDetectionList>"
Dieses Script nennst Du nun
linedetect.sh (ohne das On). Beim Aufruf wird $1 durch den ersten übergebenen Parameter substituiert.
Du musst dieses Script mit einem Parameter true oder false aufrufen:
Entsprechend muss der Aufruf im exec command angepasst werden:
Code: Alles auswählen
Thing exec:command:lineDetect "Linie schalten" [
command="/pfad/zur/datei/linedetect.sh %2$s",
interval=0,
timeout=5,
autorun=true
]
die Whitelist nicht vergessen
Nun brauchst Du statt des Switch Items ein String Item:
Code: Alles auswählen
String commandInput "Command" {channel="exec:command:lineDetect:input"}
Und dieses Item muss entweder "true" oder "false" als Text enthalten, was am einfachsten über ein Sitemap Mapping erfolgen kann:
Code: Alles auswählen
Switch item=commandInput mappings=[true="ON",false="OFF"]
openHAB erstellt damit zwei Schaltflächen ON und OFF, welche dann jeweils true bzw. false in das Input Item schreiben, was wiederum das exec command auslöst.
Sollte der curl-Weg ausfallen (wie von mir befürchtet), dann wäre das http Binding die beste Option, denn mit dem http Binding kann man auch PUT Befehle senden. Das ist aber ein anderes Kapitel dieses Romans
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet