log/openhab.log:2018-10-16 18:44:00.002 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule ‘set workstate’: cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.items.Item.getState() on null
I tried to play a bit wiht this formule, but seems I’m getting an error with the ‘*’?
2018-10-16 19:10:00.002 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule ‘set workstate’: Unknown variable or command ‘*’; line 22, column 52, length 16
Well, “wwStartMinute” is a String. How do you multiply a String?
Let’s do some logigng:
rule "set workstate"
when
Time cron "0 0/5 * * * ?" // every day, every 5 minutes
then
val acDay = now.getDayOfWeek.toString
val day = wwDay.members.findFirst[d|d.name == "wwDay"+acDay].state as Number
val sH = wwStartHour.members.findFirst[d|d.name == "wwStartHour"+acDay].state as Number
val sM = wwStartMinute.members.findFirst[d|d.name == "wwStartMinute"+acDay].state as Number
val eH = wwEndHour.members.findFirst[d|d.name == "wwEndHour"+acDay].state as Number
val eM = wwEndMinute.members.findFirst[d|d.name == "wwEndMinute"+acDay].state as Number
logInfo("work","day {} sH {} sM {} eH {} eM {}",day,sH,sM,eH,eM)
if(day == ON) {
if(now.getMinuteOfDay >= sM + sH *60 && now.getMinuteOfDay < eM + eH * 60)
Work.postUpdate(ON)
else
Work.postUpdate(OFF)
}
end
Please be aware that I changed the method to .findFirst[].state
I simplified the setup a bit (to understand it better).
As I get it now, he times are nicely been picked up as numbers, but he can’t multiply it?
items:
Number wwStartHour "Start uur [%d]"
Number wwStartMinute "Start minuut [%d]"
Number wwEndHour "Eind uur [%d]"
Number wwEndMinute "Eind minuut [%d]"
Rule:
rule "set workstate"
when
Time cron "0 0/5 * * * ?" // every day, every 5 minutes
then
val sH = wwStartHour.state
val sM = wwStartMinute.state
val eH = wwEndHour.state
val eM = wwEndMinute.state
logInfo("work","sH {} sM {} eH {} eM {}",sH,sM,eH,eM)
if(WorkWeek.state.toString == "WORK") {
if (now.getMinuteOfDay => sM + sH * 60 && now.getMinuteOfDay < eM + eH * 60)
Work.postUpdate(ON)
else
Work.postUpdate(OFF)
}
end
Log:
[INFO ] [.eclipse.smarthome.model.script.work] - sH 5 sM 15 eH 19 eM 30
[ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule ‘set workstate’: Unknown variable or command ‘*’; line 23, column 41, length 7
Tried that one also. But had suddenly ‘worse’ errors. So came back from it.
Specially because I was under the impression that the numbers came back properly (seen the log output (info)).
018-10-17 09:39:00.002 [INFO ] [.eclipse.smarthome.model.script.work] - sH 5 sM 15 eH 19 eM 30
2018-10-17 09:39:00.003 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule ‘set workstate’: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.ObjectExtensions.operator_doubleArrow(T,org.eclipse.xtext.xbase.lib.Procedures$Procedure1) on instance: null
To summarize, the whole idea works now with following things. I need to overthink the extra start times. It can be useful for different hours on different days. Of different timings per day (morning, afternoon…).
But for now:
I can input days through the sitemap
I can input start and end time through the sitemap
I can use WorkWeek (ON/OFF) and WorkTime (ON/OFF) in rules
rule "Calculate workweek"
when
Member of wwDay changed or
Time cron "0 5 0 ? * *" or
System started
then
val wwDayFlag = wwDay.members.findFirst[ d | d.name == "wwDay"+now.getDayOfWeek.toString ]
val newState = if(wwDayFlag.state == ON) "WORK" else "OFF"
if(WorkWeek.state.toString != newState) WorkWeek.sendCommand(newState)
end
rule "set workstate"
when
Time cron "0 0/5 * * * ?" // every day, every 5 minutes
then
val sH = wwStartHour.state as Number
val sM = wwStartMinute.state as Number
val eH = wwEndHour.state as Number
val eM = wwEndMinute.state as Number
if(WorkWeek.state.toString == "WORK") {
if (now.getMinuteOfDay >= sM + sH * 60 && now.getMinuteOfDay < eM + eH * 60)
WorkTime.postUpdate(ON)
else
WorkTime.postUpdate(OFF)
}
end
Thanks to everybody for their patience and help!!!