Es ist kein Wunder, dass executeCommandLine() nicht ausgeführt wird, denn diese Bedingung:
Code: Alles auswählen
if ((FRITZBox_6660_Cable_Anrufzustand.state.toString == "RINGING") && (FRITZBox_6660_Cable_Anrufzustand.state.toString == "DIALING") && (previousState.toString == "IDLE"))
ist niemals erfüllt. Das Problem ist hier, dass der Bandwurm nicht sonderlich übersichtlich ist.
Um es etwas lesbarer zu gestalten, führe ich mal eine lokale Konstante ein:
Code: Alles auswählen
val myState = FRITZBox_6660_Cable_Anrufzustand.state.toString
if(myState == "RINGING" && myState == "DIALING" && previousState.toString == "IDLE")
Die Bedingung lautet also, dass myState den Wert RINGING
und DIALING gleichzeitig haben muss, zusätzlich zum vorherigen Status IDLE (diese Bedingung ist allerdings immer erfüllt, weil in allen Triggern angegeben)
Mutmaßlich wolltest Du eher so etwas als Bedingung:
Code: Alles auswählen
if((newState.toString == "RINGING" || newState.toString == "DIALING") && previousState.toString == "IDLE")
newState enthält den neuen Status, previousState den alten Status.
Als aktueller Status muss RINING
oder (||) DIALING gesetzt sein, gleichzeitig (&&) muss der alte Status IDLE sein.
Da diese Zeile nun aber immer erfüllt ist (weil dies schon die Einschränkungen durch die Trigger sind) kannst Du die Bedingung auch einfach komplett weg lassen - oder Du änderst den Trigger ab...
Ein anderes Problem ist der eigentliche Befehl executeCommandLine(), der früher
(tm) mal anders verwendet wurde als das aktuell der Fall ist. Insbesondere der Timeout (hinten als Zahl oder vorn als Duration) ist auffällig, aber auch sonst... Früher
(tm) musste man Leerzeichen
innerhalb einer Befehlszeile mit @@ ersetzen, jetzt werden die einzelnen Parameter als einzelne Strings übergeben.
Ein anderer Punkt ist der Speicherort für Dein Script. Der Ordner /etc/openhab/scripts/ ist
ausschließlich für Dateien mit der Endung
.script reserviert. Das trifft auf Dein Shell script nicht zu

Bei *.script Dateien handelt es sich um DSL Rules ohne Rahmen, also ohne
Stattdessen kann man aus jeder DSL Rule heraus per
callScript("scriptname") das DSL Script in der Datei
scriptname.script aufrufen.
Wenn Du selbst Shell Scripte definierst, solltest Du diese besser in einem Verzeichnis
$OPENHAB_USERDATA/shellscripts/ ablegen ($OPENHAB_USERDATA ist gewöhnlich ein Link auf
/var/lib/openhab/). Da es sich bei $OPENHAB_USERDATA um das Home-Verzeichnis des Users openhab handelt (unter dem der Service läuft), kannst Du dann auch den Pfad
shellscripts/fritzbox.sh als Aufruf verwenden.
Der Name
shellscripts ist auch nur beispielhaft, wichtig ist nur, dass Du keine bereits vorhandenen Ordner verwendest
Wenn ich es richtig verstehe, holst Du nach dem Beenden eines Telefonats den letzten Datensatz ab, mutmaßlich um die Gesprächsdauer anzuzeigen?
Code: Alles auswählen
rule "Generate Call-Übersicht"
when
Item FRITZBox_6660_Cable_Anrufzustand changed to IDLE
then
logInfo("FRITZBox", "Anruf: Script wird gestartet, Change von {} nach {}",previousState,newState)
Thread.sleep(500)
val result = executeCommandLine(Duration.ofSeconds(5), "shellscripts/fritzbox.sh", "update")
ListDate.postUpdate(result)
logInfo("FRITZBox", "Anruf: Script wird beendet")
end
Was den Befehl logInfo() betrifft: Dieser Befehl erwartet zwei Strings. dabei ist der erste String der letzte Teil des Loggernamens. Dieser String sollte weder Leerzeichen noch Sonderzeichen oder Umlaute enthalten. Der zweite String ist die eigentliche Logmeldung. Dieser String unterstützt Substitution.
falsch:
richtig:
Code: Alles auswählen
logInfo("fritzbox", "FRITZ!Box Exec Result: {}", result)
Nun wird die Meldung unter dem Logger org.openhab.core.model.script.fritzbox gelistet, mit diesem Loggernamen kann man die Meldung auch über die Karaf Konsole "abschalten".
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet