Regel für Panasonic TV funktioniert nur zum Teil

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

Regel für Panasonic TV funktioniert nur zum Teil

Beitrag von Joe »

Hallo zusammen,
hat jemand eine Idee warum meine Regel zum starten der Aufnahme des TVs nur zum Teil funktioniert?

Code: Alles auswählen

rule "Tv_Wohnzimmer_RTL_Aufnahme_starten" 
when
	Item RTLAufnahme changed to ON // Starte Aufnahme Prozess
then
	sendCommand(WohnzimmerOnOff, ON) //TV on
	Thread::sleep(20000) // Warte 20 Sek.
		sendCommand(WohnzimmerMute, ON) //Ton aus
	Thread::sleep(1000) // Warte noch 1 Sek.
		sendCommand(WohnzimmerD6, ON) //Programm 6 an
	Thread::sleep(6000) // Warte noch 6 Sek.
		sendCommand(WohnzimmerREC, ON) //Aufnahme starten
	Thread::sleep(3000) // Warte noch 3 Sek.
		sendCommand(WohnzimmerOnOff, OFF //TV aus
end
Die einzelnen Prozesse müssen mit einer gewissen Zeitverzögerung starten.
Es gibt einen Schalter "RTLAufnahme" der den Prozess startet, das ganze funktioniert super wenn der TV an ist. Sobald ich jedoch die Zeile..

Code: Alles auswählen

sendCommand(WohnzimmerOnOff, ON) //TV on
in die Regel einbau, reagiert der Schalter nicht mehr.
Wenn ich das ganze umdrehe und die Zeilen nach der ersten Zeile rausnehme geht der TV an.

Code: Alles auswählen

rule "Tv_Wohnzimmer_RTL_Aufnahme_starten" 
when
	Item RTLAufnahme changed to ON // Starte Aufnahme Prozess
then
	sendCommand(WohnzimmerOnOff, ON) //TV on
end
Wo liegt mein Fehler?

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Regel für Panasonic TV funktioniert nur zum Teil

Beitrag von udo1toni »

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

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

Re: Regel für Panasonic TV funktioniert nur zum Teil

Beitrag von Joe »

Hi Udo,
mega vielen Dank für Deine Hilfe sowie die gute Erklärung was bei mir nicht so 100% korrekt war und natürlich die Arbeit die Du Dir mit dem Beispiel der korrekten Rule gemacht hast.
Ich habe das ganze natürlich gleich ausprobiert, leider hat Deine Rule nur den TV eingeschaltet jedoch die weiteren Schritte nicht gestartet.
Kannst Du mir bitte erklären, was die beiden Zeichen "[|" nach dem Wort "now" bedeuten und was diese genau machen?
VG
Joe

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Regel für Panasonic TV funktioniert nur zum Teil

Beitrag von udo1toni »

zwischen [| und ] steht das Lambda, das ist der Codeblock, der dem Timer übergeben wird.
openHAB kopiert diesen Teil des Codes in seinen Scheduler und definiert die Startzeit. Der Scheduler ruft diesen Code zum festgelegten Zeitpunkt auf.

Wenn der erste Schritt ausgeführt wird, es danach aber nicht mehr weiter geht, funktioniert das reschedule nicht. Hast Du die Variablen ganz am Anfang der Datei stehen? Die beiden Zeilen außerhald der Rule mit var zu Beginn müssen vor der ersten Rule platziert werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten