Re: Mal wieder eine "rule" Frage
Verfasst: 16. Aug 2019 16:09
Die Variante ist zugegebenermaßen kurz, aber schön ist das auch nicht.
Vermutlich könnte man auf das sortBy[name] verzichten, das ist nur zur Sicherheit, dass die Läden in einer festgelegten Reihenfolge durchlaufen werden.
Diese Variante hat den Vorteil, dass die Rule (auch während sie ausgeführt wird) beliebig oft getriggert werden darf, ohne dass dies Auswirkungen hat, schließlich wird der Timer nur erstellt, wenn noch keiner angelegt wurde.
Es wird auch nur ein Platz im Scheduler benötigt. Auch wenn mir nicht bewusst wäre, dass es hier eine Grenze gibt, so könnte eine lange Liste im Scheduler doch Auswirkungen haben. Das Lambda wird pro Timer hinterlegt und der Code ist identisch - Platzverschwendung (RAM).
Code: Alles auswählen
// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tRoll = null
var nRoll = 0
rule "Alle Rolladen ohne Ausnahmen öffnen"
when
Item <TRIGGER> changed from OFF to ON
then
if(tRoll === null) { // nur falls die Rule noch nicht getriggert wurde
nRoll = 0 // Zähler auf 0
tRoll = createTimer(now.plusMillis(100), [| // Timer initialisieren
nRoll += 1 // Zähler hochzählen
if(nRoll <= gBlinds.members.size) { // Falls noch nicht am Ende der Liste angekommen
if(gBlinds.members.sortBy[name].get(nRoll).state > 0) { // aktuelles Element > 0 ?
gBlinds.members.sortBy[name].get(nRoll).sendCommand(0) // Laden hoch
tRoll.reschedule(now.plusMillis(200)) // warten und nächster Laden
} else {
tRoll.reschedule(now.plusMillis(10)) // nächster Laden
}
} else { // Liste komplett durchlaufen
tRoll = null // timer löschen
}
])
}
end
Diese Variante hat den Vorteil, dass die Rule (auch während sie ausgeführt wird) beliebig oft getriggert werden darf, ohne dass dies Auswirkungen hat, schließlich wird der Timer nur erstellt, wenn noch keiner angelegt wurde.
Es wird auch nur ein Platz im Scheduler benötigt. Auch wenn mir nicht bewusst wäre, dass es hier eine Grenze gibt, so könnte eine lange Liste im Scheduler doch Auswirkungen haben. Das Lambda wird pro Timer hinterlegt und der Code ist identisch - Platzverschwendung (RAM).