Here is a version using JSR223-Jython (w/ openhab2-jython modules)…
from org.slf4j import Logger, LoggerFactory
from openhab.triggers import time_triggered
from org.joda.time import DateTime
from org.joda.time import Interval
log = LoggerFactory.getLogger("org.eclipse.smarthome.model.script.Rules")
@time_triggered("0 0 7 * * ?")
@time_triggered("0 0 9 * * ?")
@time_triggered("0 55 17 * * ?")
@time_triggered("0 0 21 * * ?")
@time_triggered("0 0 23 * * ?")
def updateMode():
#log.debug("JSR223: Update Mode")
modeIntervals = {
"Morning" : Interval(DateTime.now().withTime(7,0,0,0),DateTime.now().withTime(9,0,0,0)),
"Day" : Interval(DateTime.now().withTime(9,0,0,0),DateTime.now().withTime(17,55,0,0)),
"Evening" : Interval(DateTime.now().withTime(17,55,0,0),DateTime.now().withTime(21,0,0,0)),
"Night" : Interval(DateTime.now().withTime(21,0,0,0),DateTime.now().withTime(23,0,0,0))
}
newMode = "Late Night"
for mode in list(modeIntervals.keys()):
if modeIntervals.get(mode).contains(DateTime.now()):
newMode = mode
log.debug("JSR223: Update Mode: interval=[{}], name=[{}]".format(modeIntervals.get(mode),mode))
if items["Mode"] != StringType(newMode):
log.debug("JSR223: Update Mode: Mode changed to [{}]".format(newMode))
events.sendCommand("Mode",newMode)
else:
log.debug("JSR223: Update Mode: Job ran but Mode did not need to be changed [{}]".format(newMode))
And I add this to the end of the script file so that this runs on startup and when the file is saved, instead of adding a Startup trigger for it…
updateMode()