So funktioniert es !!!
Code: Alles auswählen
var Timer tRegner = null
var int iRegner = 0
var Timer tStartRegner = null
rule "Startzeit einstellen"
when
Member of gWeekdays changed or // Wochentag geändert
Item Startzeit_Minuten changed or // Minuten geändert
Item Startzeit_Stunden changed or // Stunden geändert
Time cron "1 0 0 * * ?" // täglich um 00:00:01 Uhr
then
// Alle Wochentag-Items müssen in der Gruppe gWeekdays zusammengefasst sein, damit der Trigger oben funktioniert
var dayOfWeekSetting = newArrayList(
Monday.state,
Tuesday.state,
Wednesday.state,
Thursday.state,
Friday.state,
Saturday.state,
Sunday.state
)
var int minutes = 0 // Initialwert für Minuten definieren
if(Startzeit_Minuten.state instanceof Number) { // Falls das Item eine gültige Zahl enthält
minutes = (Startzeit_Minuten.state as Number).intValue // Setze minutes auf diese Zahl
if(minutes > 59) minutes = 0 // Falls Obergrenze überschritten setze auf 0
if(minutes < 0) minutes = 59 // Falls Untergrente unterschritten setze auf 59
}
Startzeit_Minuten.postUpdate(minutes) // Schreibe Wert in das Item
var int hours = 0 // Initialwert für Sunden definieren
if(Startzeit_Stunden.state instanceof Number) { // Falls das Item eine gültige Zahl enthält
hours = (Startzeit_Stunden.state as Number).intValue // Setze hours auf diese Zahl
if(hours > 23) hours = 0 // Falls Obergrenze überschritten setze auf 0
if(hours < 0) hours = 23 // Falls Untergrente unterschritten setze auf 23
}
Startzeit_Stunden.postUpdate(hours) // Schreibe Wert in das Item
val int startMinutes = hours * 60 + minutes // Zeit in Minuten
tStartRegner?.cancel // geplante Beregnung canceln
if(dayOfWeekSetting.get(now.getDayOfWeek-1) == ON) {
logInfo("watering","Kontrolliere Wochentag") // Falls heute Beregnung gewünscht
if(now.getMinuteOfDay < startMinutes) {
logInfo("watering","Warte auf Startzeit") // Falls Startzeit noch nicht erreicht
tStartRegner = createTimer(now.withTimeAtStartOfDay.plusMinutes(startMinutes),[| // Setze einen Timer auf gewünschte Startzeit
Beregnung.sendCommand(ON) // Starte zur gewünschten Zeit
])
}
}
end
rule "Beregnung EIN"
when
Item Beregnung received command
then
if(receivedCommand == OFF) {
logInfo("watering","Beregnung wird abgebrochen!")
tRegner?.cancel // Timer stoppen
tRegner = null // Variable leeren
gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
//Pumpe.sendCommand(OFF) // Pumpe abschalten
Sperre.postUpdate(OFF) // Bediensperre aufheben
} else {
logInfo("watering","Beregnung gestartet.")
if(tRegner !== null) {
logInfo("watering","Regner scheint noch zu laufen! Abbruch")
return;
}
iRegner = 0
Sperre.postUpdate(ON)
//Pumpe.sendCommand(ON)
tRegner = createTimer(now.plusMillis(10),[|
iRegner++ // nächsten Regener anwählen
logInfo("regner","{}. Durchlauf",iRegner)
gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
val maxRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].size // wieviele Regner sollen insgesamt beregnen?
logInfo("regner","{}. Durchlauf von {} Durchläufen.",iRegner,maxRegner)
if(iRegner > maxRegner) { // letzten Regner schon erreicht?
logInfo("regner","Alle Regner sind schon gelaufen!")
tRegner = null // Dann Schluss!
Sperre.postUpdate(OFF)
Beregnung.postUpdate(OFF)
Berwgnung_manuell.postUpdate(OFF) // Item zurücksetzen
//Pumpe.sendCommand(OFF)
return;
}
Thread::sleep(500) // kleine(!) Pause einlegen
val strRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].sortBy[name].get(iRegner-1).name.split("_").get(2) //Namen des Regner ermitteln
logInfo("regner","Nächster Regner: {}",strRegner)
gRegner.members.filter[i|i.name.contains("Power") && i.name.contains(strRegner)].head.sendCommand(ON) // Regner einschalten
val Dauer =(gRegner.members.filter[i|i.name.contains("Dauer") && i.name.contains(strRegner)].head.state as Number).intValue
logInfo("regner","Regenr wird nach {} Minuten wieder abgeschaltet.",Dauer)
tRegner.reschedule(now.plusMinutes(Dauer)) // Nächste Ausführung planen
])
}
end