[SOLVED] Rule throws a unhandled exception (NullPointerException: null)

All,

I am using a Raspberry pi 3B with openhabian, but don’t get the following rule solved (I guess it’s since 2.5 stable).

The rule tries to get the distance between the car and two potential drivers:

rule "Check for Driver (Engine ON)"
when
	Item CarEngine changed to ON
then
	logInfo("*** DEBUG ***", "*** Pulpo Engine STARTED ***")
	if(previousState == NULL) return; // failing fast
// set distance threshold
	val int dist = 400
// create a delay for the distance values to settle !?
	createTimer(now.plusSeconds(60)) [
	// ***************** Trip START *************************
		val Number distDNA = (CarDistDNA.minimumSince(now.minusMinutes(10)).state as DecimalType)
		val Number distNCO = (CarDistNCO.minimumSince(now.minusMinutes(10)).state as DecimalType)

/	// Plausibiilty Check
		if(distDNA < 0 && distNCO < 0) {
			logInfo("CAR_TRIP:", "Engine started Dist calc returned -1\nNo valid Vehicle position?")
			return;
		}
		logInfo("CAR_TRIP:", "Pulpo STARTED - distDNA: " + distDNA + " distNCO: " + distNCO)
	// initialize Driver
		CarTripDriver.postUpdate("-")
	// both leaving...
		if(distDNA <= dist && distNCO <= dist) {
			CarTripDriver.postUpdate("DNA & NCO")
		}
	// DNA leaving...
		else if(distDNA <= dist && distNCO > dist) {
			CarTripDriver.postUpdate("DNA")
		}
	// NCO leaving...
		else if(distDNA > dist && distNCO <= dist) {
			CarTripDriver.postUpdate("NCO")
		}
	// driver unknown	
		else {
			CarTripDriver.postUpdate("unbekannt")
		}
		logInfo("CAR_TRIP:", "Pulpo START - CarTripDriver: " + CarTripDriver.state.toString + " distDNA: " + distDNA + " distNCO: " + distNCO)
	]
end

When the rule is triggered (and the timer expired), I get:

2020-01-20 12:34:38.508 [INFO ] [smarthome.model.script.*** DEBUG ***] - *** Pulpo Engine STARTED ***
2020-01-20 12:35:38.568 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 8 2020-01-20T12:35:38.515+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ {
  val distDNA
  val distNCO
  logInfo(<XStringLiteralImpl>,<XBinaryOperationImplCustom>)
  <XFeatureCallImplCustom>.postUpdate(<XStringLiteralImpl>)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@18830d0 (conditionalExpression: false)
  logInfo(<XStringLiteralImpl>,<XBinaryOperationImplCustom>)
} ] threw an unhandled Exception:
java.lang.NullPointerException: null
        at org.eclipse.smarthome.core.library.types.QuantityType.divide(QuantityType.java:396) ~[?:?]
        at org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(NumberExtensions.java:290) ~[?:?]
        at org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(NumberExtensions.java:286) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1175) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:916) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:275) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy151.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

I have looked into the history of this rule and this setup used to work

EDIT:
I guess it’s related to the persistence request!?
(default is influxdb, the dist items are member of Group G_Dist, which is persisted on everyChange)

Are distDNA and distNCO string variables? If they are numeric they may need to be converted first.

No I define them as Numbers:
val Number distDNA = …

I would try converting them to strings. That may be your issue.

hmm…

But I need to compare them numerically:
if(distDNA <= dist &&…

I believe you can only concatenate strings for the loginfo message though.

Now I got your point.
You suspect the loginfo to be the culprit.

Thanks - I will give it a try.

EDIT:
Another thing caught py eye (how embarrassing):

I will try both

1 Like
        at org.eclipse.smarthome.core.library.types.QuantityType.divide(QuantityType.java:396) ~[?:?]
        at org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(NumberExtensions.java:290) ~[?:?]
        at org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(NumberExtensions.java:286) ~[?:?]

Given that it’s complaining about division, I suspect this might be the issue.

1 Like

Sorry.
For some reason, before sufficient :coffee: thought I saw a loginfo error.

:rofl:
I know exactly what you mean!

Thanks, Bruce!

By the way:
It WAS the “/” - I just di not see this - how embarrassing!

Anyway: the loginfo works well:
2020-01-20 19:22:57.840 [INFO ] [pse.smarthome.model.script.CAR_TRIP:] - Pulpo STARTED - distDNA: 67.0 distNCO: 6509.0

1 Like

and 3 hours jet-lagged

Uh, that’s even worse :grimacing: