Seite 1 von 1

Thread::Sleep ersetzen durch createTimer

Verfasst: 15. Aug 2019 20:44
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.

Re: Thread::Sleep ersetzen durch createTimer

Verfasst: 16. Aug 2019 00:45
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.

Re: Thread::Sleep ersetzen durch createTimer

Verfasst: 16. Aug 2019 01:11
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

Re: Thread::Sleep ersetzen durch createTimer

Verfasst: 16. Aug 2019 02:31
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
            }

Re: Thread::Sleep ersetzen durch createTimer

Verfasst: 16. Aug 2019 14:01
von udo1toni
Ups... ja, Du hast natürlich Recht, die gehört in den Timer rein. Ich korrigiere das oben...