OpenHab 3 Rule conversion problem

I migrated recently to OH3 and still trying to get some of the OH2 rules back working.
most of them i got up and running, also because of the help of this community, bur now im a bit lost with the below rule.

im getting the below error when the rule gets executed.

error

2021-04-03 13:02:24.346 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Muellkalender-2' failed: Unknown variable or command '>'; line 104, column 7, length 33 in Muellkalender

so its related to lines like this, but why. or do i still have some generall issues with the rule?:

if (varAbfall1Datum > varAbfall2Datum) {

full rule

rule "Abfalltermine sortieren"
when
	Item Restmuell received update or
	Item Biomuell received update or
	Item Papiermuell received update or
	Item GelberSack received update or
	Item RestmuellTage changed or
	Item PapiermuellTage changed or
	Item BiomuellTage changed or
	Item GelberSack changed or
	//Time cron "0 8 0 1/1 * ? *" or
	Item DelayedStartup changed from OFF to ON
then
	Thread::sleep(3000)
// old OH2 entries	
// var DateTime varTempDatum
	// var DateTime varAbfall1Datum = new DateTime((Restmuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall2Datum = new DateTime((Biomuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall3Datum = new DateTime((Papiermuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall4Datum = new DateTime((GelberSack.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	
	var DateTime varAbfall1Datum = Restmuell.getStateAs(DateTimeType).zonedDateTime.toInstant.toEpochMilli
	var DateTime varAbfall2Datum = Biomuell.getStateAs(DateTimeType).zonedDateTime.toInstant.toEpochMilli
	var DateTime varAbfall3Datum = Papiermuell.getStateAs(DateTimeType).zonedDateTime.toInstant.toEpochMilli
	var DateTime varAbfall4Datum = GelberSack.getStateAs(DateTimeType).zonedDateTime.toInstant.toEpochMilli
	
	var String varTempArt
	var String varAbfall1Art = "Restmuell"
	var String varAbfall2Art = "Biomuell"
	var String varAbfall3Art = "Papiermuell"
	var String varAbfall4Art = "GelberSack"
	var String varTempTage
	var String varAbfall1Tage = RestmuellTage.state.toString
	var String varAbfall2Tage = BiomuellTage.state.toString
	var String varAbfall3Tage = PapiermuellTage.state.toString
	var String varAbfall4Tage = GelberSackTage.state.toString
	var i = 1

	while ((i=i+1) < 6) {
		if (varAbfall1Datum > varAbfall2Datum) {
			varTempDatum = varAbfall1Datum
			varAbfall1Datum = varAbfall2Datum
			varAbfall2Datum = varTempDatum
			varTempArt = varAbfall1Art
			varAbfall1Art = varAbfall2Art
			varAbfall2Art = varTempArt
			varTempTage = varAbfall1Tage
			varAbfall1Tage = varAbfall2Tage
			varAbfall2Tage = varTempTage
			if (varAbfall2Datum > varAbfall3Datum) {
				varTempDatum = varAbfall2Datum
				varAbfall2Datum = varAbfall3Datum
				varAbfall3Datum = varTempDatum
				varTempArt = varAbfall2Art
				varAbfall2Art = varAbfall3Art
				varAbfall3Art = varTempArt
				varTempTage = varAbfall2Tage
				varAbfall2Tage = varAbfall3Tage
				varAbfall3Tage = varTempTage
				if (varAbfall3Datum > varAbfall4Datum) {
					varTempDatum = varAbfall3Datum
					varAbfall3Datum = varAbfall4Datum
					varAbfall4Datum = varTempDatum
					varTempArt = varAbfall3Art
					varAbfall3Art = varAbfall4Art
					varAbfall4Art = varTempArt
					varTempTage = varAbfall3Tage
					varAbfall3Tage = varAbfall4Tage
					varAbfall4Tage = varTempTage
				}
			}
		}
		if (varAbfall2Datum > varAbfall3Datum) {
				varTempDatum = varAbfall2Datum
				varAbfall2Datum = varAbfall3Datum
				varAbfall3Datum = varTempDatum
				varTempArt = varAbfall2Art
				varAbfall2Art = varAbfall3Art
				varAbfall3Art = varTempArt
				varTempTage = varAbfall2Tage
				varAbfall2Tage = varAbfall3Tage
				varAbfall3Tage = varTempTage
				if (varAbfall3Datum > varAbfall4Datum) {
					varTempDatum = varAbfall3Datum
					varAbfall3Datum = varAbfall4Datum
					varAbfall4Datum = varTempDatum
					varTempArt = varAbfall3Art
					varAbfall3Art = varAbfall4Art
					varAbfall4Art = varTempArt
					varTempTage = varAbfall3Tage
					varAbfall3Tage = varAbfall4Tage
					varAbfall4Tage = varTempTage
				}
			}
		if (varAbfall3Datum > varAbfall4Datum) {
					varTempDatum = varAbfall3Datum
					varAbfall3Datum = varAbfall4Datum
					varAbfall4Datum = varTempDatum
					varTempArt = varAbfall3Art
					varAbfall3Art = varAbfall4Art
					varAbfall4Art = varTempArt
					varTempTage = varAbfall3Tage
					varAbfall3Tage = varAbfall4Tage
					varAbfall4Tage = varTempTage
				}
	}
	Abfall_1_Datum.postUpdate(varAbfall1Datum.toString)
	Abfall_2_Datum.postUpdate(varAbfall2Datum.toString)
	Abfall_3_Datum.postUpdate(varAbfall3Datum.toString)
	Abfall_4_Datum.postUpdate(varAbfall4Datum.toString)
	Abfall_1_Art.postUpdate(varAbfall1Art)
	Abfall_2_Art.postUpdate(varAbfall2Art)
	Abfall_3_Art.postUpdate(varAbfall3Art)
	Abfall_4_Art.postUpdate(varAbfall4Art)
	Abfall_1_Tage.postUpdate(varAbfall1Tage)
	Abfall_2_Tage.postUpdate(varAbfall2Tage)
	Abfall_3_Tage.postUpdate(varAbfall3Tage)
	Abfall_4_Tage.postUpdate(varAbfall4Tage)
end

thanks a lot for any help or pointing me in the right direction

Matt

I’m surprised the rule isn’t failing sooner.

  • there is no such thing as DateTime in OH anymore

  • even if it did, toEpochMilli returns a lon’, not a DateTime

  • The replacement for DateTme is ZonedDateTime, so you don’t even need to go down to epoch in the first place.

So the root of the problem is you are defining these datum variables as a type that doesn’t exist and when you get to compare them it can’t figure out what to do.

So redefine your datum variables as

var varAbfall1Datum = Restmuell.getStateAs(DateTimeType).zonedDateTime

And change your comparison to

if(varAbfall1Datum.isAfter(varAbfall2Datum)){

Some other comments:

  • a three seconds sleep was a really bad idea in OH 2.5. It’s a mess bad idea in OH 3 but still troublesome for a rule like this that has so many triggers. If the rule is triggered a bunch of times in that three seconds, the triggers queue up. It could be a long time before the queue works down.

  • Why not a for loop instead of a while loop? For that matter why run the loop six times at all? It doesn’t appear to do anything different reach time through the loop.

  • The postUpdates at end will probably fail too. But I think you can just pass the ZonedDateTimes without calling to string.

Thanks a lot for all your suggestions.
I’ll look into each of them to see how I can implement them.

i did your recommended changes for the var and if entrie and also removed the loop for now.
however as soon as the IF is getting executet and reached the
varTempDatum = varAbfall1Datum
im getting the below error. any idea what the reason could be?

2021-04-04 23:09:03.759 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Muellkalender-2' failed: An error occurred during the script execution: Couldn't invoke 'assignValueTo' for feature JvmVoid: (eProxyURI: Muellkalender.rules#|::0.2.1.2.0.20.1.0.0::0::/1) in Muellkalender

current rule

rule "Abfalltermine sortieren"
when
	Item Restmuell received update or
	Item Biomuell received update or
	Item Papiermuell received update or
	Item GelberSack received update or
	Item RestmuellTage changed or
	Item PapiermuellTage changed or
	Item BiomuellTage changed or
	Item GelberSack changed or
	//Time cron "0 8 0 1/1 * ? *" or
	Item DelayedStartup changed from OFF to ON
then
	Thread::sleep(3000)
	// var DateTime varTempDatum
	// var DateTime varAbfall1Datum = new DateTime((Restmuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall2Datum = new DateTime((Biomuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall3Datum = new DateTime((Papiermuell.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	// var DateTime varAbfall4Datum = new DateTime((GelberSack.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
	
	var varAbfall1Datum = Restmuell.getStateAs(DateTimeType).zonedDateTime
	logInfo("all.rules", "Restmuell" + Restmuell.toString())
	var varAbfall2Datum = Biomuell.getStateAs(DateTimeType).zonedDateTime
	logInfo("all.rules", "Biomuell" + Biomuell.toString())
	var varAbfall3Datum = Papiermuell.getStateAs(DateTimeType).zonedDateTime
	logInfo("all.rules", "Papiermuell" + Papiermuell.toString())
	var varAbfall4Datum = GelberSack.getStateAs(DateTimeType).zonedDateTime
	logInfo("all.rules", "GelberSack" + GelberSack.toString())


	var String varTempArt
	var String varAbfall1Art = "Restmuell"
	var String varAbfall2Art = "Biomuell"
	var String varAbfall3Art = "Papiermuell"
	var String varAbfall4Art = "GelberSack"
	var String varTempTage
	var String varAbfall1Tage = RestmuellTage.state.toString
	var String varAbfall2Tage = BiomuellTage.state.toString
	var String varAbfall3Tage = PapiermuellTage.state.toString
	var String varAbfall4Tage = GelberSackTage.state.toString
	//var i = 1

	// while ((i=i+1) < 6) {
		if(varAbfall1Datum.isAfter(varAbfall2Datum)){
			varTempDatum = varAbfall1Datum
			varAbfall1Datum = varAbfall2Datum
			varAbfall2Datum = varTempDatum
			varTempArt = varAbfall1Art
			varAbfall1Art = varAbfall2Art
			varAbfall2Art = varTempArt
			varTempTage = varAbfall1Tage
			varAbfall1Tage = varAbfall2Tage
			varAbfall2Tage = varTempTage
			logInfo("all.rules", "1. If executed")
			if(varAbfall2Datum.isAfter(varAbfall3Datum)){
				varTempDatum = varAbfall2Datum
				varAbfall2Datum = varAbfall3Datum
				varAbfall3Datum = varTempDatum
				varTempArt = varAbfall2Art
				varAbfall2Art = varAbfall3Art
				varAbfall3Art = varTempArt
				varTempTage = varAbfall2Tage
				varAbfall2Tage = varAbfall3Tage
				varAbfall3Tage = varTempTage
				logInfo("all.rules", "2. If executed")
				if(varAbfall3Datum.isAfter(varAbfall4Datum)){
					varTempDatum = varAbfall3Datum
					varAbfall3Datum = varAbfall4Datum
					varAbfall4Datum = varTempDatum
					varTempArt = varAbfall3Art
					varAbfall3Art = varAbfall4Art
					varAbfall4Art = varTempArt
					varTempTage = varAbfall3Tage
					varAbfall3Tage = varAbfall4Tage
					varAbfall4Tage = varTempTage
					logInfo("all.rules", "3. If executed")
				}
			}
		}
	// 	if(varAbfall2Datum.isAfter(varAbfall3Datum)){
	// 			varTempDatum = varAbfall2Datum
	// 			varAbfall2Datum = varAbfall3Datum
	// 			varAbfall3Datum = varTempDatum
	// 			varTempArt = varAbfall2Art
	// 			varAbfall2Art = varAbfall3Art
	// 			varAbfall3Art = varTempArt
	// 			varTempTage = varAbfall2Tage
	// 			varAbfall2Tage = varAbfall3Tage
	// 			varAbfall3Tage = varTempTage
	// 			if(varAbfall3Datum.isAfter(varAbfall4Datum)){
	// 				varTempDatum = varAbfall3Datum
	// 				varAbfall3Datum = varAbfall4Datum
	// 				varAbfall4Datum = varTempDatum
	// 				varTempArt = varAbfall3Art
	// 				varAbfall3Art = varAbfall4Art
	// 				varAbfall4Art = varTempArt
	// 				varTempTage = varAbfall3Tage
	// 				varAbfall3Tage = varAbfall4Tage
	// 				varAbfall4Tage = varTempTage
	// 			}
	// 		}
		// if(varAbfall3Datum.isAfter(varAbfall4Datum)){
		// 			varTempDatum = varAbfall3Datum
					// varAbfall3Datum = varAbfall4Datum
					// varAbfall4Datum = varTempDatum
					// varTempArt = varAbfall3Art
					// varAbfall3Art = varAbfall4Art
					// varAbfall4Art = varTempArt
					// varTempTage = varAbfall3Tage
					// varAbfall3Tage = varAbfall4Tage
					// varAbfall4Tage = varTempTage
				// }
	// }
	Abfall_1_Datum.postUpdate(varAbfall1Datum.toString)
	Abfall_2_Datum.postUpdate(varAbfall2Datum.toString)
	Abfall_3_Datum.postUpdate(varAbfall3Datum.toString)
	Abfall_4_Datum.postUpdate(varAbfall4Datum.toString)
	Abfall_1_Art.postUpdate(varAbfall1Art)
	Abfall_2_Art.postUpdate(varAbfall2Art)
	Abfall_3_Art.postUpdate(varAbfall3Art)
	Abfall_4_Art.postUpdate(varAbfall4Art)
	Abfall_1_Tage.postUpdate(varAbfall1Tage)
	Abfall_2_Tage.postUpdate(varAbfall2Tage)
	Abfall_3_Tage.postUpdate(varAbfall3Tage)
	Abfall_4_Tage.postUpdate(varAbfall4Tage)
end

Add logging to see what the values of the variables are.

the variables for the 4 dates (varAbfall1Datum till varAbfall4Datum are getting set.
the Error message changed a bit, in my last post i still had the varTempDatum comented out.
To much changes at once.

2021-04-05 18:33:03.401 [INFO ] [.openhab.core.model.script.all.rules] - Date1: 2021-04-07T00:00+02:00
2021-04-05 18:33:03.406 [INFO ] [.openhab.core.model.script.all.rules] - Date2: 2021-04-10T00:00+02:00
2021-04-05 18:33:03.408 [INFO ] [.openhab.core.model.script.all.rules] - Date3: 2021-04-30T00:00+02:00
2021-04-05 18:33:03.409 [INFO ] [.openhab.core.model.script.all.rules] - Date4: 2021-04-28T00:00+02:00
2021-04-05 18:33:03.417 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Muellkalender-2' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.ObjectExtensions.operator_plus(java.lang.Object,java.lang.String) on instance: null in Muellkalender

however the rule is not reaching the point to set varTempDate

Seeing log statements that do not correspond with the code that has been posted are basically useless. About all I can say is the error takes place on line five or later in the rule and it’s involved with a + operation involving a String.