In openHAB2 there is very little you should need to import any more. Joda is imported by default, though Designer sometimes has a hard time recognizing that fact so you can get around that by just importing
import org.joda.datetime.DateTime
I think.
For everything else, just import the specific classes you are actually using. For example, if you have a lambda use:
import org.eclipse.xtext.xbase.lib.Functions
instead of
import org.eclipse.xtext.xbase.lib.*
I just did a grep of my entire ruleset and I now have a grand total of 4 import statements. I would expect you to have a similarly small number of imports.
2017-02-07 23:22:51.190 [ERROR] [.script.engine.ScriptExecutionThread] - Rule ‘Test Rule’: An error occured during the script execution: Could not invoke method: org.joda.time.base.AbstractInstant.isBefore(long) on instance: 2017-02-07T23:22:51.188-05:00
obviously this is deprecated now:
import org.joda.time.*
so what do i need to import to get that to work?
rule "Test Rule"
when
Item TestRule received command ON
then
if (now.isBefore(Sunrise_Time.state as DateTimeType).calendar.timeInMillis){
postUpdate(IsSunset, ON)
sendMail("test@gmail.com", "DeterminSunRiseSet", "Path 1")
}
if (now.isAfter(Sunrise_Time.state as DateTimeType).calendar.timeInMillis){
if (now.isBefore(Sunset_Time.state as DateTimeType).calendar.timeInMillis){
postUpdate(IsSunset, OFF)
sendMail("test@gmail.com", "DeterminSunRiseSet", "Path 2")
}
if (now.isAfter(Sunset_Time.state as DateTimeType).calendar.timeInMillis){
postUpdate(IsSunset, ON)
sendMail("test@gmail.com", "DeterminSunRiseSet", "Path 3")
}
}
2017-02-07 23:30:06.448 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Turn Dining Room Light Off: An error occured during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,java.lang.String) on instance: null
rule “Turn lights off"
when
Time cron “0 00 23 * * ?” or
Time cron “00 00 01 * * ?” or
Time cron “00 00 03 * * ?” /or
Time cron “0 0 3 * * ?”/
then
sendMail("test@gmail.com”, “2:Light:Pre:Light:TurnLightsOff”, “Current State: GuestRoom_PowerStrip:” + GuestRoom_PowerStrip.state + " LivingRoom_PowerStrip: " + LivingRoom_PowerStrip.state + " DiningRoom_Light: " + DiningRoom_Light.state)
if (PowerStripTimerToggles.state == ON) {
sendCommand(GuestRoom_PowerStrip, OFF)
sendCommand(LivingRoom_PowerStrip, OFF)
if (PowerStripEmailToggles.state == ON) {
sendMail("test@gmail.com", “2:Light:Post:Light:TurnLightsOff”, “Current State: GuestRoom_PowerStrip:” + GuestRoom_PowerStrip.state + " LivingRoom_PowerStrip: " + LivingRoom_PowerStrip.state + " DiningRoom_Light: " + DiningRoom_Light.state)
}
}
end
I actually gave the wrong rule, but I implemented your change and am still seeing the error:
2017-02-08 10:11:08.208 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Test Cron: An error occured during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,java.lang.String) on instance: null
rule “Test Cron”
when
Time cron “0 11 10 * * ?” //or
//Time cron “0 0 1 * * ?” or
//Time cron “0 0 2 * * ?” or
//Time cron “0 0 3 * * ?” or
//Time cron “0 0 4 * * ?” or
//Time cron “0 0 5 * * ?” or
//Time cron “0 0 6 * * ?”
then
sendMail(“test@gmail.com”, “Dining Room PRE Email”, "Dining room light Cron Has Been Reached. Current state = " + DiningRoom_Light.state)
if (DiningRoom_Light.state != 0) {
//sendCommand(DiningRoomLight, 0)
DiningRoom_Light.sendCommand(0)
DiningRoomLightRuleTriggered.sendCommand(ON)
//sendCommand(DiningRoomLightRuleTriggered, ON)
sendMail(“test@gmail.com”, “Dining Room Off Conditional if”, "Dining room light Cron Has Been Reached. Current state = " + DiningRoom_Light.state)
if (DiningRoomLightEmailToggle.state == ON) {
sendMail(“test@gmail.com”, “2:Light:Cron:1:00:DiningRoom Light Off”, “Dining Room Light was turned off at 1:00 AM timer” + now)
}
//sendCommand(DimLevel, DiningRoom_Light.state)
DimLevel.sendCommand(DiningRoom_Light.state)
Thread::sleep(5000)
//sendCommand(DiningRoomLightRuleTriggered, OFF)
DiningRoomLightRuleTriggered.sendCommand(OFF)
}
I had the same issue and just defined a int variable to pass the state to first and used that variable in my sendCommand.
I think you can define the state using a (DiningRoom_Light.state as DecimalType) (or something similar) appended to it but haven’t had time to play with it yet to test.
I changed DimLevel to a string item…still errors out in the log.
Still nothing i stripped it down to this:
rule "Test Cron"
when
Time cron "0 54 10 * * ?“
then
var int intDimLevel
intDimLevel = DiningRoom_Light.state
sendMail("miltyzwave@gmail.com”, “Dining Room PRE Email”, "Dining room light Cron Has Been Reached. Current state = " + DiningRoom_Light.state + " " + intDimLevel)
DimLevel = intDimLevel
end
I still get the null errors and still parsing errors on loading the rule file
2017-02-08 10:53:57.797 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'CronTest.rules’
2017-02-08 10:53:57.804 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model ‘CronTest.rules’ is either empty or cannot be parsed correctly!
2017-02-08 10:53:58.621 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'CronTest.rules’
2017-02-08 10:54:02.140 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Test Cron: An error occured during the script execution: Cannot assign a value in null context.
I think i figured this out.
DImLevel was being set from another rule as well…possible race condition.
I’m going to remove it from this one.
I still can’t figure out why on load, the rule file doesn’t parse correctly
2017-02-08 11:09:04.773 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'CronTest.rules’
2017-02-08 11:09:04.787 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model ‘CronTest.rules’ is either empty or cannot be parsed correctly!
2017-02-08 11:09:07.217 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model ‘CronTest.rules’
rule “Test Cron”
when
Time cron "0 10 11 * * ?“
then
if (DiningRoom_Light.state != 0) {
//sendCommand(DiningRoomLight, 0)
DiningRoom_Light.sendCommand(0)
DiningRoomLightRuleTriggered.sendCommand(ON)
//sendCommand(DiningRoomLightRuleTriggered, ON)
sendMail("miltyzwave@gmail.com”, “Dining Room Off Conditional if”, “Dining room light Cron Has Been Reached. Current state = " + DiningRoom_Light.state)
if (DiningRoomLightEmailToggle.state == ON) {
sendMail("miltyzwave@gmail.com”, “2:Light:Cron:1:00:DiningRoom Light Off”, “Dining Room Light was turned off at 1:00 AM timer” + now)
}
Thread::sleep(5000)
//sendCommand(DiningRoomLightRuleTriggered, OFF)
DiningRoomLightRuleTriggered.sendCommand(OFF)
}
I’m seeing those same error codes about cannot be parsed correctly but so far it doesn’t seem to be impacting my rules running. Haven’t yet looked around to see if others are having the same issue.
I assume the underlying rule is now running correctly?