Viele Wege führen nach Rom...
Grundsätzlich braucht man für einen Funkschalter ein Item. Mit dem exec Binding kann man es so drehen, dass der Zustand des Items von der Rückmeldung eines (zyklisch ausgeführen) Scripts gesetzt wird, während ein Schaltbefehl ein (anderes) Script aufruft. Dabei ist das exec2 Binding mächtiger als das exec1 Binding, dafür ist es leider auch grottig zu konfigurieren.
Wer das exec2 Binding verwenden will, kann es direkt installieren. Wer exec1 verwenden will, muss zuerst Legacy Bindings aktivieren, anschließend sollte exec1 in der Liste installierbarer Bindings auftauchen.
Das exec1 Binding wird direkt in der Item Definition konfiguriert, die Konfiguration muss zwingend über Textdatei erfolgen und sieht dann so aus:
Code: Alles auswählen
Switch mySwitch "Mein Exec Switch [%s]" {exec="<[<commandLine to execute>:<refreshintervalinmilliseconds>:(<transformationrule>)] >[ON:<commandLine to execute>] >[OFF:<commandLine to execute>]"}
Wahlweise kann man auch statt ON und OFF ein * mit angeben und muss dann halt im Aufruf einen Platzhalter verwenden, um den Befehl an das Script zu übergeben. Jeder der Parameter ist optional, man muss also nicht zwingend eine Rückmeldung abholen oder einen (oder mehrere) Schaltbefehl(e) senden.
Im vorliegenden Fall könnte man ein Item so definieren:
Code: Alles auswählen
Switch CasSW08 "3. Casa 08[%s]" <wallswitch> (gCasa,gNew) {exec=">[*:bash /etc/openhab2/scripts/casa.sh 08 %2$s]"}
Leider bekommt man aber keine Rückmeldung, es sei denn, man baut das im externen script extra ein und ruft es entsprechend auch extra auf. An dieser Stelle ist das exec2 Binding im Vorteil, denn es kann den Rückgabewert eines Scripts auswerten.
Damit das aber möglichst universell funktioniert, ist hier die Herangehensweise komplett anders.
Bei exec2 wird ein Thing definiert, das enthält das Script. Dazu gibt es definierte Channel, nämlich input, output, exit, run und lastexecution.
Über den input Channel wird der Parameter übergeben, mit dem das Script aufgerufen wird (natürlich kann man mehrere Parameter übergeben, man muss sie aber zuerst zu einem Parameter zusammenfassen, mit Leerzeichen als Trenner)
Über den Output Channel bekommt man die Ausgabe des letzten Aufrufs, falls das Script eine Ausgabe hatte.
Über Exit bekommt man den Exit-Status des letzten Aufrufs, allgemein ist 0 ein OK und alles ungleich 0 ein Fehler.
Mit dem run Channel wird das Script gestartet bzw. kontrolliert, ob es gerade läuft.
Mit dem lastexecution Channel schließlich bekommt man den Zeitstempel des letzten Aufrufs.
Man kann das Thing so konfigurieren, dass bei Update des input Channels automatisch ein run erfolgt, dann reicht es also, den Switch mit dem input Channel zu verlinken, und das Script wird jedesmal beim Betätigen des Switches entweder mit dem Parameter ON oder mit dem Parameter OFF aufgerufen.
Eines der Probleme dabei ist, dass der Input Channel vom Typ String ist, man kann also den Input Channel gar nicht direkt mit einem Switch Item verbinden. Die Rückmeldung kommt auf einem anderen Channel an, auch das verursacht eventuell Kopfschmerzen. Man wird vermutlich eine openHAB Rule verwenden, um ein ungebundenes Switch Item jeweils auf den korrekten Stand zu bringen (mit .postUpdate) und eine weitere Rule, um bei Betätigen des ungebundenen Items den Input zu setzen und gegebenenfalls auch den run-Befehl zu schicken.
Ich habe selbst bisher exec2 auch gemieden, wie der Teufel das Weihwasser

aber grundsätzlich funktioniert das schon.
Die Alternative, das Ganze mit Rules und der executeCommandline Action zu erledigen, funktioniert natürlich auch, allerdings sollte man dann zumindest die Rule etwas eleganter gestalten.
Pro Schalter ein Item, die Namen sind dabei so gewählt, dass alle Items den Anfang ihres Namens mit einem _ von einer fortlaufenden Nummer trennen. Alle Items befinden sich in der Gruppe gCasa (der Name ist selbstverständlich frei wählbar), also etwa so:
Code: Alles auswählen
Group gCasa
Switch CasSW_08 "3. Casa 08[%s]" <wallswitch> (gCasa,gNew)
Switch CasSW_09 "4. Casa 09[%s]" <wallswitch> (gCasa,gNew)
Switch nochEiner_10 "5. Casa 10[%s]" <wallswitch> (gCasa)
und eine (1) Rule (!)
Code: Alles auswählen
rule "execute commandlines"
when
Member of gCasa received command // Member of gibt es seit OH2.3
then
// triggeringItem gibt es schon länger, das Item, welches die Rule getriggert hat
val String mySwitch = triggeringItem.name.split("_").get.(1) // es darf nur exakt ein _ vorkommen, dafür ist der Code simpel ;)
val String myCommand = "bash /etc/openhab2/scripts/casa.sh " + mySwitch + " " + receivedCommand.toString
executeCommandLine(myCommand)
end
Wahlweise kann man das auch auf eine (lange) Zeile bringen

, der Punkt ist aber, man braucht nur diese eine Rule für alle gleich zu steuernden Funkschalter.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet