Thread::Sleep ersetzen durch createTimer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Thread::Sleep ersetzen durch createTimer

Beitrag von eiGelbGeek »

Alte Rule (Auszüge)

Code: Alles auswählen

rule"Beamer einschalten"
...
    Thread::sleep(1000) // 1 Sekunde
    Airplay_Buero.sendCommand(OFF)
    Thread::sleep(2000) // 2 Sekunden
    Beamer_Status.postUpdate(ON)
    Thread::sleep(8000) // 8 Sekunden
    Beamer_ON.sendCommand(ON)
    if (Nacht_Modus.state == OFF && RL_Buero.state < 75) RL_Buero.sendCommand(75)
    Thread::sleep(5000) // 5 Sekunden
    if (Lautsprecher_Buero.state == OFF) Lautsprecher_Buero.sendCommand(ON)
    Thread::sleep(15000) // 15 Sekunden
    Beamer_VolMin.sendCommand(ON)
    Thread::sleep(5000) // 5 Sekunden
    Beamer_MuteOnOff.sendCommand(ON)
...
Neue Rule (Auszüge)

Code: Alles auswählen

rule"Beamer einschalten"
...
    createTimer(now.plusSeconds(1), [| Airplay_Buero.sendCommand(OFF) ])
    createTimer(now.plusSeconds(3), [| Beamer_Status.postUpdate(ON) ])
    createTimer(now.plusSeconds(11), [| 
      Beamer_Status.postUpdate(ON)
      if (Nacht_Modus.state == OFF && RL_Buero.state < 75) RL_Buero.sendCommand(75)
    ])
    createTimer(now.plusSeconds(16), [| 
      if (Lautsprecher_Buero.state == OFF) Lautsprecher_Buero.sendCommand(ON)
    ])
    createTimer(now.plusSeconds(31), [| Beamer_VolMin.sendCommand(ON) ])
    createTimer(now.plusSeconds(36), [| Beamer_MuteOnOff.sendCommand(ON) ])
...
So müsste es doch richtig sein oder? Ich habe jeweils die Sleep Zeiten Addiert, weil die neue Rule ja in einen durch läuft und immer von der aktuellen Zeit den Timer erstellt. Ich habe es noch nicht getestet, nur auf der Arbeit so zusammen geschrieben ;-) Vielleicht kennt irgendwer ja auch noch eine bessere Lösung ... Ich brauche jeweils die Zeitlichen Abstände beim einschalten des Beamers.

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

Re: Thread::Sleep ersetzen durch createTimer

Beitrag von udo1toni »

Das kann man schon so machen, nur ist es dann halt kacke... :)

Das Ganze ist eine Ablaufsteuerung. Sieht dann so aus:

Code: Alles auswählen

// Globale Variablen zu Beginn der Datei definieren
var nCounter = 0
var Timer tBeamer = null

rule"Beamer einschalten"
when
    // welcher Trigger auch immer
then
    if(tBeamer === null) {
        nCounter = 0
        // Weitere Dinge, die zu Beginn zu erledigen sind...
        tBeamer = createTimer(now.plusSeconds(1), [ |
            var nTime = 0
            nCounter += 1
            switch (nCounter) {
                case 1: {
                    Airplay_Buero.sendCommand(OFF)
                    nTime = 2
                }
                case 2: {
                    Beamer_Status.postUpdate(ON)
                    nTime = 8
                }
                case 3: {
                    Beamer_ON.sendCommand(ON)
                    if (Nacht_Modus.state == OFF && RL_Buero.state < 75)
                        RL_Buero.sendCommand(75)
                    nTime = 5
                }
                case 4: {
                    if (Lautsprecher_Buero.state == OFF)
                        Lautsprecher_Buero.sendCommand(ON)
                    nTime = 15
                }
                case 5: {
                    Beamer_VolMin.sendCommand(ON)
                    nTime = 5
                }
                case 6: {
                    Beamer_MuteOnOff.sendCommand(ON)
                }
            }
            if(nTime > 0)
                tBeamer.reschedule(now.plusSeconds(nTime))
            else
                tBeamer = null
        ])
    }
end
Die Rule verwendet nur einen einzigen Timer. Der Vorteil hierbei (weil der Timer einen Namen hat...) ist, dass die einzelnen Timer nicht durcheinander kommen können. Wenn die Original Rule einmal gestartet ist, kann nichts sie aufhalten. Das ist hier anders. Man kann jederzeit den Timer mittels

Code: Alles auswählen

tBeamer.cancel
tBeamer = null
abbrechen und wieder auf Anfang setzen.
Wenn Die Original Rule mehrfach gestartet wird, werden die Befehle auch mehrfach ausgeführt. da es hier jedes Item nur einmal betrifft, ist das vielleicht nicht weiter schlimm, lästig ist es allemal.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Thread::Sleep ersetzen durch createTimer

Beitrag von eiGelbGeek »

Danke für die "Schlag" gegen den Kopf ;-) Manchmal sieht man den Wald vor lauter Bäumen nicht :lol:

Habe diese Form ja schon in der Rolladensteuerung eingebaut :D

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Thread::Sleep ersetzen durch createTimer

Beitrag von eiGelbGeek »

udo1toni hat geschrieben: 16. Aug 2019 00:45

Code: Alles auswählen

// Globale Variablen zu Beginn der Datei definieren
var nCounter = 0
var Timer tBeamer = null

rule"Beamer einschalten"
when
    // welcher Trigger auch immer
then
    if(tBeamer === null) {
        var nTime = 0
        nCounter = 0
        // Weitere Dinge, die zu Beginn zu erledigen sind...
        tBeamer = createTimer(now.plusSeconds(1), [ |
            nCounter += 1
            switch (nCounter) {
                case 1: {
                    Airplay_Buero.sendCommand(OFF)
                    nTime = 2
                }
                case 2: {
                    Beamer_Status.postUpdate(ON)
                    nTime = 8
                }
                case 3: {
                    Beamer_ON.sendCommand(ON)
                    if (Nacht_Modus.state == OFF && RL_Buero.state < 75)
                        RL_Buero.sendCommand(75)
                    nTime = 5
                }
                case 4: {
                    if (Lautsprecher_Buero.state == OFF)
                        Lautsprecher_Buero.sendCommand(ON)
                    nTime = 15
                }
                case 5: {
                    Beamer_VolMin.sendCommand(ON)
                    nTime = 5
                }
                case 6: {
                    Beamer_MuteOnOff.sendCommand(ON)
                }
            }
            if(nTime > 0)
                tBeamer.reschedule(now.plusSeconds(nTime))
            else
                tBeamer = null
        ])
    }
end
Sitzt die folgende Zeile nicht zweit oben und müsste innerhalb des Timers sein?

Code: Alles auswählen

var nTime = 0
Alternativ wäre ein default setting oder?

Code: Alles auswählen

default: {
                nTime = 0
            }

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

Re: Thread::Sleep ersetzen durch createTimer

Beitrag von udo1toni »

Ups... ja, Du hast natürlich Recht, die gehört in den Timer rein. Ich korrigiere das oben...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten