- Platform information:
- Raspberry Pi3B+
- OS: Rasbian Stretch
- java version “1.8.0_201”
- openHAB version: 2.4
I have an alarm clock which by and large works nicely. However, there is one issue I’m struggling with:
Sometimes (not everytime) when I change the waking time (let’s say from 6:00 am to 7:00 am) the alarm still goes off at both times - in the example at 6:00 am and at 7:00 am. Somehow, the timers don’t seem to get reset.
Any hint as to what I’m doing wrong is is appreciated.
Here is the code (shortened)
var Timer timer1 = null
var Timer timer2 = null
var Timer timer3 = null
rule "alarm clock"
when
Item ubHour changed or
Item ubMin changed or
Item ubMo changed or
Item ubDi changed or
Item ubMi changed or
Item ubDo changed or
Item ubFr changed or
Item ubSa changed or
Item ubSo changed or
Item ubWeckeraktiv received command OFF or
System started
then
var java.util.concurrent.locks.ReentrantLock lock1 = new java.util.concurrent.locks.ReentrantLock()
lock1.lock
try{
postUpdate(ubweckerZeitMessage, "-")
var ZonedDateTime dt2 = ZonedDateTime.now(ZoneId.of("Europe/Berlin"))
var ZonedDateTime dt = ZonedDateTime.now(ZoneId.of("Europe/Berlin")) //DateTime dt = new DateTime()
var LocalDate date = LocalDate.now()
var int offsetCoffee = -15*60
var int offsetOff = 30*60
**//Here I try to reset the timer variables**
if (timer1 != null) {
timer1.cancel()
timer1 = null
timer2.cancel()
timer2 = null
timer3.cancel()
timer3 = null
} else {
}
var List<Integer> dayArray = newArrayList(0,0,0,0,0,0,0)
if (ubMo.state == ON) {
dayArray.set(0, 1)
} else {
dayArray.set(0, 0)
}
if (ubDi.state == ON) {
dayArray.set(1, 1)
} else {
dayArray.set(1, 0)
}
if (ubMi.state == ON) {
dayArray.set(2, 1)
} else {
dayArray.set(2, 0)
}
if (ubDo.state == ON) {
dayArray.set(3, 1)
} else {
dayArray.set(3, 0)
}
if (ubFr.state == ON) {
dayArray.set(4, 1)
} else {
dayArray.set(4, 0)
}
if (ubSa.state == ON) {
dayArray.set(5, 1)
} else {
dayArray.set(5, 0)
}
if (ubSo.state == ON) {
dayArray.set(6, 1)
} else {
dayArray.set(6, 0)
}
var hour = (ubHour.state as DecimalType).intValue
var minute = (ubMin.state as DecimalType).intValue
var int i = dt.getDayOfWeek().getValue()
var int daysAdd = 0
var int n = i
var boolean exitFlag = true
while (daysAdd < 8 && exitFlag ) {
logInfo("Exec2", daysAdd.toString + " - " + i.toString)
if (dayArray.get(i-1) == 1) {
if (daysAdd == 0) {
date = LocalDate.now()
dt2 = ZonedDateTime.of(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), hour, minute,0,0, ZoneId.of("Europe/Berlin"))
if (dt2.isBefore(dt)) {
if ((n + daysAdd) >= 7) {
i = 1
} else {
i++;
}
} else {
exitFlag = false
}
} else {
exitFlag = false
}
} else {
if ((n + daysAdd) >= 7) {
i = 1
} else {
i++;
}
}
if (exitFlag == true) {
daysAdd++
}
}
var String msg = ""
var String spk = ""
if (exitFlag == false) {
ubWeckeraktiv.sendCommand(ON)
if (daysAdd == 0) {
date = LocalDate.now()
dt2 = ZonedDateTime.of(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), hour, minute,0,0, ZoneId.of("Europe/Berlin"))
} else {
date = LocalDate.now()
var DayOfWeek dayOfWeek = DayOfWeek.of(i)
var TemporalAdjuster adj = TemporalAdjusters.next(dayOfWeek)
date = date.with(adj)
dt2 = ZonedDateTime.of(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), hour, minute,0,0, ZoneId.of("Europe/Berlin"))
}
switch(dt2.getDayOfWeek().toString) {
case "MONDAY" : ubDummy.sendCommand("Montag")
case "TUESDAY" : ubDummy.sendCommand("Dienstag")
case "WEDNESDAY" : ubDummy.sendCommand("Mittwoch")
case "THURSDAY" : ubDummy.sendCommand("Donnerstag")
case "FRIDAY" : ubDummy.sendCommand("Freitag")
case "SATURDAY" : ubDummy.sendCommand("Samstag")
case "SUNDAY" : ubDummy.sendCommand("Sonntag")
}
spk = "Die nächste Weckzeit ist am " + dt2.getDayOfMonth().toString + "." + dt2.getMonthValue().toString + "." + dt2.getYear().toString + " um " + hour + " Uhr " + minute
ubDummy.sendCommand(spk)
if (hour < 10) {
msg = "0"
}
msg = msg + hour.toString + ":"
if (minute < 10) {
msg = msg + "0"
}
msg = msg + minute.toString
msg = dt2.getDayOfWeek().toString + ", " + dt2.getDayOfMonth().toString + "." + dt2.getMonthValue().toString + "." + dt2.getYear().toString + " - " + msg
postUpdate(ubweckerZeitMessage, msg)
var Duration dur = Duration.between(dt, dt2)
var int diff = dur.getSeconds.intValue
var int sdays = diff / 86400
var int shours = (diff % 86400) / 3600
var int smin = diff % 3600 / 60
var int ssek = diff % 60
pushover("Zeit verbleibend: " + sdays.toString + " T " + shours.toString + ":" + smin.toString + ":" + ssek.toString)
timer1 = createTimer(now.plusSeconds(dur.getSeconds.intValue)) [|
//stuff gets done here correctly
]
timer2 = createTimer(now.plusSeconds(dur.getSeconds.intValue + offsetCoffee)) [|
//stuff gets done here correctly
]
timer3 = createTimer(now.plusSeconds(dur.getSeconds.intValue + offsetOff)) [|
ubWeckeraktiv.sendCommand(OFF)
//stuff gets done here correctly
ubSleeping.sendCommand(OFF)
]
} else {
msg = "- no alarm set -"
postUpdate(ubweckerZeitMessage, msg)
}
} catch(Throwable t) { }
finally {
lock1.unlock()
}
end