sendCommand .previousState

Hello,

I would like to change the stage of my ventilation to the last stage after 7 minutes.
This is the relevant code in my rule:

var Timer dusch_timer            = null
...

if(OG_KINDER_BAD_LICHT2.state == ON ||
	   OG_KINDER_BAD_LICHT3.state == ON ||
       OG_ELTERN_BAD_LICHT2.state == ON ||
       OG_ELTERN_BAD_LICHT3.state == ON){
	   
			    /****L?FTUNG****/
				sendCommand(ZF_LUEFTUNG_STUFE, "3")
						
				if (dusch_timer != null){
					dusch_timer.cancel
					dusch_timer = null
				}
		
	   
	}else{ 
	
		if (dusch_timer === null){

		    //SETTINGS_LUEFTUNG_DUSCHE_NACHLAUFZEIT = 7
dusch_timer = createTimer(now.plusMinutes((SETTINGS_LUEFTUNG_DUSCHE_NACHLAUFZEIT.state as DecimalType).intValue))  
		    [|
			

			sendCommand(ZF_LUEFTUNG_STUFE, ZF_LUEFTUNG_STUFE.previousState(true).state) 

			
			dusch_timer.cancel
			dusch_timer = null
			] 

		}

Now I have a problem with the last sendCommand statement. Log:

2018-10-15 07:33:19.595 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-10-15T07:33:19.581+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  sendCommand(<XFeatureCallImplCustom>,<XMemberFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.cancel
  <null>.dusch_timer = <XNullLiteralImplCustom>
} ] threw an unhandled Exception: 
java.lang.UnsupportedOperationException: rrd4j does not allow querys without a begin date, unless order is descending and a single value is requested
	at org.openhab.persistence.rrd4j.internal.RRD4jService.query(RRD4jService.java:225) [217:org.openhab.persistence.rrd4j:1.12.0]
	at org.openhab.core.persistence.internal.QueryablePersistenceServiceDelegate.query(QueryablePersistenceServiceDelegate.java:47) [213:org.openhab.core.compat1x:2.3.0]
	at org.eclipse.smarthome.model.persistence.extensions.PersistenceExtensions.previousState(PersistenceExtensions.java:703) [131:org.eclipse.smarthome.model.persistence:0.10.0.oh230]
	at org.eclipse.smarthome.model.persistence.extensions.PersistenceExtensions.previousState(PersistenceExtensions.java:677) [131:org.eclipse.smarthome.model.persistence:0.10.0.oh230]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:759) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1115) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1045) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [156:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]
	at com.sun.proxy.$Proxy3935.apply(Unknown Source) [?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [137:org.eclipse.smarthome.model.script:0.10.0.oh230]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]
2018-10-15 07:33:19.610 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.2018-10-15T07:33:19.581+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  sendCommand(<XFeatureCallImplCustom>,<XMemberFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.cancel
  <null>.dusch_timer = <XNullLiteralImplCustom>
} ] threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh230]
Caused by: java.lang.UnsupportedOperationException: rrd4j does not allow querys without a begin date, unless order is descending and a single value is requested
	at org.openhab.persistence.rrd4j.internal.RRD4jService.query(RRD4jService.java:225) ~[?:?]
	at org.openhab.core.persistence.internal.QueryablePersistenceServiceDelegate.query(QueryablePersistenceServiceDelegate.java:47) ~[?:?]
	at org.eclipse.smarthome.model.persistence.extensions.PersistenceExtensions.previousState(PersistenceExtensions.java:703) ~[?:?]
	at org.eclipse.smarthome.model.persistence.extensions.PersistenceExtensions.previousState(PersistenceExtensions.java:677) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:759) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1115) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1045) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:223) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]
	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.$Proxy3935.apply(Unknown Source) ~[?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
	... 1 more

Anybody got an idea?

You haven’t shown us the whole rule, but guessing: declaring variable dusch_timer within the rule will mean that it goes away when the rule exits.
Later, when the timer expires and the code runs, it won’t find a reference to dusch_timer.

You could declare it globally (outside the rule)

Hi,

dusch_timer is declared globally already…

Hard to help without seeing the whole rule. Are you missing an extra close bracket, maybe?

Hi,

here is the whole rule: Please ignore my comments…


/******** IMPORTS ******************************/
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import java.lang.Math.*
//import org.openhab.model.script.actions.Timer


/******** VARIABLEN ****************************/
var Timer dusch_timer            = null
var Timer warte_timer            = null



//***********************************************
//** L?ftungstufe / Zirkulationspumpe umschalten wenn das Duschlicht angeschaltet wird
//***********************************************
rule "LUEFTUNG_DUSCHE"
when 
    Item OG_KINDER_BAD_LICHT2 received update or
	Item OG_KINDER_BAD_LICHT3 received update or
	Item OG_ELTERN_BAD_LICHT2 received update or
	Item OG_ELTERN_BAD_LICHT3 received update

then

	//Log Rules Start wegschreiben
	logInfo("RULES","LUEFTUNG_DUSCHE")

	//warte und pr?fe in x Sekunden ob der Status wirklich auf EIN ist...
    Thread::sleep((SETTINGS_LUEFTUNG_DUSCHE_WARTEN.state as DecimalType).longValue * 1000)


	logInfo("RULES","Wartezeit vorbei")
	
		
    if(OG_KINDER_BAD_LICHT2.state == ON ||
	   OG_KINDER_BAD_LICHT3.state == ON ||
       OG_ELTERN_BAD_LICHT2.state == ON ||
       OG_ELTERN_BAD_LICHT3.state == ON){
	   
	   
	    	//Log wegschreiben
				logInfo("RULES","L??ng auf Stufe 3 geschaltet")


				/****L?FTUNG****/
				sendCommand(ZF_LUEFTUNG_STUFE, "3")
				

				if (dusch_timer != null){
					dusch_timer.cancel
					dusch_timer = null
				}
		
	   
	}else{ 
		
	//Log wegschreiben
		logInfo("PRAESENZ","L?ftung umschalten in" + SETTINGS_LUEFTUNG_DUSCHE_NACHLAUFZEIT.state.toString + "Minute")	
		
		
		if (dusch_timer === null){

		    dusch_timer = createTimer(now.plusMinutes((SETTINGS_LUEFTUNG_DUSCHE_NACHLAUFZEIT.state as DecimalType).intValue))  
		    [|
			
                //L?ftung zur?ckschalten
                
                logInfo("RULES","kurz vor dem Umschalten auf alten Wert")

             
                //sendCommand(ZF_LUEFTUNG_STUFE, ZF_LUEFTUNG_STUFE.previousState(true).state.toString) 
                sendCommand(ZF_LUEFTUNG_STUFE, ZF_LUEFTUNG_STUFE.previousState(true).state) 

                logInfo("RULES","kurz nach dem Umschalten auf alten Wert")
                
                dusch_timer.cancel
                dusch_timer = null
			] 

		}
		
    }	   
end

Visual Studio Code show me an error in the last sendCommand = “Type mismatch: cannot convert from State to Command”

items:

Number ZF_LUEFTUNG_STUFE    			"Stufe"                  {knx="18.001:3/1/24"}

Its a number item so you’ll need to transform that to something else or use the number in the sendCommand. Also, the previousState usually works with restoreState.

The log above does not show the logInfo in the rule, are you sure it’s firing?

Just a wild guess…

As far as I know, sendCommand only accepts strings and conversion to string by the interpreter doesn’t always work well.
The ZF_LUEFTUNG_STUFE.sendCommand(…) could be the better option, as it can handle type conversion and checking much better.

ok. I will try it… thank

@dimes Use var to store the state like:

var VolumeStates = storeStates(Echo_Volume,Echo_B_Volume)

then restore the var with:

restoreStates(VolumeStates)

More info on store and restore here https://www.openhab.org/docs/configuration/actions.html

1 Like