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
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.
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
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.