Problems with setting temperatures triggered by window sensor and timer

Hello All,
I managed to install and run a few MAX! Thermostates on my raspi3 with openhabian.
Automation works pretty well with rules setting the temperature at certain times during the day with a rule I adapted from
https://openhabforum.de/viewtopic.php?t=405

My problem is the following: starting a timer and lowering/rising the temperature triggered by a window sensor creates an error in the log and nothing happens.

Here is the log entry:
`

2019-01-25 15:21:01.326 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Event_WCDoor_open': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on instance: doorOpenTimerWC (Type=NumberItem, State=NULL, Label=null, Category=null)

Here is my rule:

 var Timer doorOpenTimerWC = null

rule "Cron_Heating_WC"
when
	Time cron "0 0/5 * * * ?" or
	System started
then
	var Integer hour = now.getHourOfDay
	var Integer min = now.getMinuteOfHour
	var Integer wd = now.getDayOfWeek
	//Prüfen ob Job läuft
	logDebug("HomeBox.HeatingRules:Cron_Heating_WC", "JOB läuft")
	//Sicherstellen, dass die Temperaturstufen gesetzt sind
	if (GlobalHeatingSetBackTemp.state !== NULL && GlobalHeatingComfortTemp1.state !== NULL && GlobalHeatingComfortTemp2.state !== NULL){
		// Wochentags (Mo - Fr)
		if (GlobalHeatingPeriod.state.equals(ON) && wd <= 5){
			logDebug("HomeBox.HeatingRules:Cron_Heating_WC", "Parameter für Heizungssteuerung: Heizperiode=ON, Wochentag=" + wd + ", Uhrzeit: " + hour + ":" + min)
			//7:00 Uhr Aufheizperiode WC
			if (hour == 7 && min <= 5)  {
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Setze Temperatur WC auf Komforttemperatur " + GlobalHeatingComfortTemp2.state.toString + "°C geregelt")
				EG_WC_Target_Temp.sendCommand(GlobalHeatingComfortTemp2.state as Number)
        }
			//23:00 Uhr außer Freitag Absenktemperatur zur Nacht
			else if (hour == 23 && min <= 5 && wd < 5) {
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Setze Temperatur WC auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
        EG_WC_Target_Temp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
        }
			//23:00 Uhr Freitag Absenktemperatur zur Nacht
			else if (hour == 23 && min <= 5 && wd == 5) {
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Setze Temperatur WC auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
				EG_WC_Target_Temp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
        }
		}
		// Wochenende (Sa - So)
		else if (GlobalHeatingPeriod.state.equals(ON) && wd >= 6){
			logDebug("HomeBox.HeatingRules:Cron_Heating_WC", "Parameter für Heizungssteuerung: Heizperiode=ON, Wochentag=" + wd)
			//8:00 Uhr Aufheizperiode WC
			if ((hour == 8 && min <= 05) && EG_WZ_Target_Temp2.state != GlobalHeatingComfortTemp1.state) {
				EG_WC_Target_Temp.sendCommand(GlobalHeatingComfortTemp2.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Temperatur WC auf Komforttemperatur " + GlobalHeatingComfortTemp2.state.toString + "°C geregelt")
			}
			//Samstag 23:50 Uhr Absenktemperatur zur Nacht
			else if (hour == 23 && min <= 5 && wd == 6) {
				EG_WC_Target_Temp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Temperatur WC auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
			}
			//Sonntag 23:00 Uhr Absenktemperatur zur Nacht
			else if (hour == 23 && min <= 5 && wd == 7) {
				EG_WC_Target_Temp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_WC", "Temperatur WC auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
			}
		}
		logDebug("HomeBox.HeatingRules:Cron_Heating_WC", "Prüfung erfolgreich")
	}
end

/***********************************************************************************
 * Ereignissteuerung bei geöffneter Tür im WC
 *
 * Wird im WC eine Tür während der Heizperiode geöffnet und ist länger als
 * 30 Sekunden geöffnet, werden alle Heizkörper abgeschaltet.
 * Sobald alle Türen wieder geschlossen sind, wird die ursprüngliche Temperatur
 * wieder hergestellt.
 */
rule "Event_WCDoor_open"
when
	Item Toilette changed
then
		// Kein Timer läuft und alle Fenster sind geschlossen --> Wiederherstellen der letzten Temperatur
		if (previousState == OPEN && doorOpenTimerWC === null && Toilette.state == CLOSED){
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Alle Fenster und Türen im WC geschlossen, setze letzte Zieltemperatur")
			//States wiederherstellen
			EG_WC_Target_Temp.sendCommand(sysWCTargetTempState.state as Number)
		}
		// Kein Timer läuft und ein Fenster wird geöffnet
		else if (doorOpenTimerWC === null && (Toilette.state == OPEN)){
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Fenster oder Tür im WC geöffnet")
			//Aktuelle Zieltemperatur speichern
			//States speichern
			sysWCTargetTempState.postUpdate(EG_WC_Target_Temp.state as Number)
      logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "	EG_WC_Target_Temp " + sysWCTargetTempState.state.toString + "°C gespeichert")
			//Timer mit gewünschtem Delay (doorOpenDelay) setzen
			doorOpenTimerWC = createTimer(now.plusSeconds(30)) [|
				logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Delay " + 30 + " verstrichen ,schalte Heizkörper aus")
        EG_WC_Target_Temp.sendCommand(12)
				doorOpenTimerWC.cancel()
			]
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Starte Timer mit Delay " + 30)
		}
		// Timer läuft und alle Türen sind wieder geschlossen
		else if (previousState == OPEN && doorOpenTimerWC !== null && Toilette.state == CLOSED && WZ_1.state == CLOSED && WZ_2.state == CLOSED && WZ_3.state == CLOSED){
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Alle Fenster und Türen im WC geschlossen, setze letzte Zieltemperatur (" + sysWCTargetTempState.state.toString + "°C)")
			//States wiederherstellen
			EG_WC_Target_Temp.sendCommand(sysWCTargetTempState.state as Number)
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Beende laufenden Timer")
			doorOpenTimerWCdoorOpenTimerWC.cancel()
			doorOpenTimerWC = null
		}
		// Timer läuft und weitere Tür wird geöffnet
		else if (previousState == CLOSED && doorOpenTimerWC !== null) {
			logInfo("HomeBox.HeatingRules:Event_WCDoor_open", "Laufenden Timer gefunden, starte erneut mit Delay  " + 30)
			doorOpenTimerWC.reschedule(now.plusSeconds(30))
		}
end

Closing the window creates the following log entry:

2019-01-25 15:05:58.378 [INFO ] [meBox.HeatingRules:Event_WCDoor_open] - Alle Fenster und Türen im WC geschlossen, setze letzte Zieltemperatur (NULL°C)
2019-01-25 15:05:58.388 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Event_WCDoor_open': Could not cast NULL to java.lang.Number; line 104, column 34, length 36

Toilette is the window sensor (I know, naming needs some improvement)
EG_WC_Target_Temp is the thermostate

sysWCTargetTempState is an item defined as number to save the temperature set before opening the window.

GlobalHeatingSetBackTemp and GlobalHeatingComfortTemp2 are number /setpoint items to change general
temperature setting without opening the rule.

Any help is appreciated.

Thanks in advance
Florian

The first error is saying that doorOpenTimerWC is not a Timer but a NumberItem whose state is NULL.

Just searching through the code for doorOpenTimerWC I find one line that looks wrong:

doorOpenTimerWCdoorOpenTimerWC.cancel()

but that doesn’t appear to be the line that it is complaining about. But the previous error could be messing things up Are you using VSCode? It should be highlighting that line as an error.

The second error is because the Number Item you are trying to use on line 104’s state is NULL (i.e. uninitialized). You cannot cast a NULL to a Number. You need to check that these Items are not NULL before blindly trying to cast them.

Hello Rich,
thanks for the help. I corrected the error and deleted an item with the same name from my .items. Now it works like a charm.

Regards
Florian

Now it works, you should consider looking at Design Pattern: How to Structure a Rule.

You can cut 50% or more of the lines of code in the above which will make it easier to read, easier to understand, and easier to change in the future.