Als erstes fehlt beim letzten sendCommand eine schließende Klammer.

Das zweite ist, dass Du besser die Methoden verwenden solltest, statt der Action.
Der dritte Punkt ist, dass Du Thread::sleep() mit sehr langen Zeiten verwendest, was im Zusammenhang mit dem vierten Punkt unangenehme Folgen haben kann, nämlich dass Du zu keinem Zeitpunkt verhinderst, dass die Rule mehrfach ausgeführt wird.
Besser wäre folgende Rule:
Code: Alles auswählen
var Timer myRecordTimer = null // Handle für den Timer
var Number myRecordTimerStep = 0 // Schrittzähler
rule "TV Wohnzimmer RTL Aufnahme starten"
when
Item RTLAufnahme changed to ON // Rule wurde getriggert
then
if(myRecordTimer === null) { // Timer schon gestartet? Dann Ende
myRecordTimerStep = 0 // Zähler auf 0 setzen
myRecordTimer = createTimer(now, [| // Timer initialisieren
myRecordTimerStep = myRecordTimerStep +1 // Zähler erhöhen
switch myRecordTimerStep { // Welcher Schritt soll abgearbeitet werden?
case 1: { // Schritt 1
WohnzimmerOnOff.sendCommand(ON)
myRecordTimer.reschedule(now.plusSeconds(20)) // Timer erneut planen
}
case 2: { // Schritt 2
WohnzimmerMute.sendCommand(ON)
myRecordTimer.reschedule(now.plusSeconds(1)) // Timer erneut planen
}
case 3: { // Schritt 3
WohnzimmerD6.sendCommand(ON)
myRecordTimer.reschedule(now.plusSeconds(6)) // Timer erneut planen
}
case 4: { // Schritt 4
WohnzimmerREC.sendCommand(ON)
myRecordTimer.reschedule(now.plusSeconds(3)) // Timer erneut planen
}
default: { // ansonsten
WohnzimmerOnOff.sendCommand(OFF)
myRecordTimer = null // Timer zurücksetzen
}
}
])
}
end
Wird die Rule exakt einmal getriggert, sollte sich der Code genauso verhalten, wie Dein Code. Jedoch prüft die Rule als erstes, ob der Timer schon besteht. Ist das Der Fall, passiert gar nichts.
Existiert noch kein Timer, wird der Zähler auf 0 gesetzt, der Timer angelegt und sofort ausgeführt.
Im Timer selbst wird zuerst der Zähler erhöht. Anschließend prüft der Code den Zählerstand und führt dann davon abhängig verschiedene Befehle aus. Nach jedem Befehl wird der Timer erneut gestartet, mit jeweils einer anderen Wartezeit. Im letzten Schritt wird der Handle auf den Timer gelöscht, damit die Rule den Timer beim nächsten Trigger wieder anlegen kann.
Der größte sichtbare Unterschied besteht im völligen Fehlen von Thread::sleep(), welches nun durch den Scheduler übernommen wird. Der Vorteil besteht darin, dass der Scheduler keinen Thread verbraucht. Gleichzeitig wird durch das Design von vornherein verhindert, dass die Rule mehrfach parallel ausgeführt wird, das könnte bei Deinem Code durchaus passieren.
Ob Dein grundsätzliches Problem sich damit auflöst, weiß ich aber nicht, ich habe keinen Panasonic und weiß nicht, wie zuverlässig die Steuerung des Power Zustands funktioniert. (Ausschalten geht ja quasi immer, aber hört der Fernseher auch auf Netzwerknachrichten, wenn er ausgeschaltet ist?)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet