Das hast Du konfiguriert:
Code: Alles auswählen
command: C:\\Windows\\System32\\cmd.exe /c "D:\\Write.bat", "chn3", %2$s
// ^ ^^ ^ ^^
// keine Anführungszeichen! Keine Kommata!
Die vollständige Zeile mit dem statischen Parameter
chn3 muss stattdessen so aussehen:
Code: Alles auswählen
command: C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat chn3 %2$s
Und in die
exec.whitelist gehört dann entsprechend diese Zeile
Code: Alles auswählen
C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat chn3 %2$s
Es sei denn, die Batchdatei selbst verlangt Anführungszeichen um den Parameter, dann allerdings müssen die Anführungszeichen escaped werden (was auch der Grund ist, warum die Backslashes doppelt angegeben werden müssen - der Backslash ist das Excape-Zeichen). Das sähe dann so aus:
Code: Alles auswählen
command: C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat \"chn3\" \"%2$s\"
Die whitelist müsste entsprechend angepasst werden.
Anschließend musst Du den Input Channel mit einem Switch Item verlinken.
Aber noch mal einen Schritt zurück (auch auf die Gefahr hin, wieder Verwirrung zu stiften...) chn3 klingt für mich danach, als gäbe es noch mehr Channel, die identisch gesteuert werden. Da wäre vermutlich die Rule tatsächlich die bessere Option, denn man kann es so drehen, dass man einen Teilstring aus dem Itemnamen als Parameter verwenden kann. Wenn Du also z.B. acht Switch Items hast, die die Namen
Switch_chn1 bis
Switch_chn8 haben, könntest Du diese in einem Group Item zusammenfassen (z.B.
gSwitches) und dann diesen Code verwenden (Hier als DSL in einem Textfile):
Code: Alles auswählen
rule "sende an Switches"
when
Member of gSwitches received command
then
val strCh = triggeringItem.name.split("_").get(1)
executeCommandLine(Duration.ofSeconds(2),"C:\\Windows\\System32\\cmd.exe", "/c", "D:\\Write.bat", strCh, receivedCommand.toString)
end
Diese eine Rule kümmert sich ab sofort um ALLE 8 Switch Items.
Zwischen den Schlüsselworten
when und
then stehen alle Trigger, die diese Rule auslösen, in diesem Fall also "ein Angehöriger der Gruppe gSwitches hat einen Befehl empfangen" (Das Umlegen eines Schalters in der UI wäre so ein Befehl)
Zwischen den Schlüsselworten
then und
end steht der gesamte auszuführende Code.
In der ersten Zeile wird aus dem Namen des Items, welches die Rule getriggert hat (das ist NICHT gSwitches, sondern der Member) der Teilstring zwischen dem 1. und dem 2. Unterstrich ermittelt und in einer lokalen Konstanten strCh gespeichert. Da es keinen zweiten Unterstrich gibt, ist das also der restliche String bis zum Ende des Namens, also chn1 bis chn8.
In der zweiten Zeile wird die Batchdatei aufgerufen, mit einer Wartezeit von zwei Sekunden, d.h. wenn das Script nicht nach zwei Sekunden fertig ist, wertet openHAB das als Fehler und protokolliert diesen.
Im Aufruf werden die lokale Konstante
strCh sowie der empfangene Befehl zusammen mit dem Befehl übergeben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet