Die rule habe ich analog für alle 4 Rollos so durchprogrammiert. Da die Rollos alle unterschiedlich groß sind und damit auch unterschiedliche Fahrzeiten aufweisen, muss hierbei natürlich für jedes Rollo seine eigene individuelle Fahrzeit gemessen und zugewiesen werden. Das war’s dann aber auch schon, das Ganze funktioniert auf dieser Basis soweit einwandfrei. Jetzt kommt aber wie gesagt der Wunsch, möglichst alle 4 Rollos gleichzeitig auf eine bestimmte Position fahren zu können, also z.B. alle Rollos gleichzeitig auf 50%. Wie könnte ich das möglichst elegant auf Basis des o.g. Ansatzes umsetzen? Ich hatte da an eine Art Programmschleife gedacht, in welcher für alle 4 Rollos individuell die betreffenden Positions-Vergleiche und Fahrzeit-Berechnungen durchgeführt und dann die Timer-basierten Fahrbefehle ausgelöst werden. Wäre das ein möglicher Lösungsansatz? Leider bin ich mit meinen Programmier-Kenntnissen an dieser Stelle am Ende der Fahnenstange angelangt, so dass ich Euch für entsprechende Unterstützung sehr dankbar wäre.val Number WZ_Rollo_01_100 = 20 // gemessene Zeit in Sekunden, die das Rollo von komplett offen auf komplett geschlossen fährt (hier 20sek)
var Number RolloTime_01 = -1 // das wird die Länge der Fahrt von der aktuellen bis zur gewünschten Position
var Number RolloDifference = NULL // Delta der Rollofahrt
var String RolloDirection = NULL // rauf oder runter
rule "WZ_Rollo_01_Alexa"
when
Item WZ_Rollo_01_Alexa received command
then
logInfo("Rollo 1 Alexa", "Actual Rollo Position: " + WZ_Rollo_01_Pos.state)
logInfo("Rollo 1 Alexa", "receivedCommand: " + receivedCommand)
var Timer timer = null
if ((receivedCommand as DecimalType).intValue == 100) {
// wenn Befehl 100%, dann Rollo ganz runter, ohne Timer (zum Reset)
RolloDirection = "DOWN"
RolloTime_01 = NULL
}
if ((receivedCommand as DecimalType).intValue == 0) {
// wenn Befehl 0%, dann Rollo ganz hoch, ohne Timer (zum Reset)
RolloDirection = "UP"
RolloTime_01 = NULL
}
if (receivedCommand > WZ_Rollo_01_Pos.state) {
// wir vergleichen die gewünschte neue Rollo-Position mit der aktuellen Rollo-Position, wenn „Neu“ größer „Ist“, muss das Rollo also runterfahren
RolloDifference = ((receivedCommand as DecimalType).intValue - (WZ_Rollo_01_Pos.state as DecimalType).intValue) // wir ermitteln den Abstand zwischen der aktuellen Position und der neuen Position als Prozent-Wert)
logInfo("Rollo 1 Alexa", "Rollo Difference: " + RolloDifference)
RolloDirection = "DOWN"
}
if (receivedCommand < WZ_Rollo_01_Pos.state) {
// wir vergleichen die gewünschte neue Rollo-Position mit der aktuellen Rollo-Position, wenn „Neu“ kleiner „Ist“, muss das Rollo also rauffahren
RolloDifference = ((WZ_Rollo_01_Pos.state as DecimalType).intValue-(receivedCommand as DecimalType).intValue) // wir ermitteln den Abstand zwischen der aktuellen Position und der neuen Position als Prozent-Wert)
logInfo("Rollo 1 Alexa", "Rollo Difference: " + RolloDifference)
RolloDirection = "UP"
}
if (RolloTime_01 === NULL) {
logInfo("Rollo 1 Alexa", "Rollo received command: " + RolloDirection)
WZ_Rollo_01.sendCommand(RolloDirection)
WZ_Rollo_01_Pos.sendCommand(receivedCommand) // wir geben die aktuelle Position ans Item.
RolloTime_01 = -1
logInfo("Rollo 1 Alexa", "Rollo Time: " + RolloTime_01)
} else {
RolloTime_01 = (RolloDifference/100) * WZ_Rollo_01_100 // wir errechnen die Fahrtlänge in Sekunden
logInfo("Rollo 1 Alexa", "Rollo received command: " + RolloDirection)
WZ_Rollo_01.sendCommand(RolloDirection)
logInfo("Rollo 1 Alexa", "Rollo Time: " + RolloTime_01)
timer = createTimer(now.plusSeconds(RolloTime_01.intValue), [|
logInfo("Rollo 1 Alexa", "Timer expired and Rollo set to STOP") // wenn Timer abgelaufen ist, stoppt die Rollofahrt
WZ_Rollo_01.sendCommand(STOP)
])
WZ_Rollo_01_Pos.sendCommand(receivedCommand) // wir geben die aktuelle Position ans Item.
}
end
VG