Weird behaviour of a condition in DSL rule with OH4

  • Platform information:
    • Hardware: Raspberry 4
    • Openhabian
    • openHAB version: 4 (stable)

Hi,
I’m migrating from OH2 to OH4. I’ve noticed a strange behaviour when writing a rule. This simple code fails and is not executed

val Number ECS_Temp_hyst = 1.0|°C
val Number ECS_Temp_maxvalid = 90|°C
val Number ECS_Temp_minvalid = 0|°C
logInfo ("ECS","Script start")
logInfo ("ECS_Temp_hyst",ECS_Temp_hyst.toString())
var TempCorrect = ( ( ECSTemperatureHaut.state != UNDEF ) && ( ECSTemperatureHaut.state != NULL ) )
TempCorrect = TempCorrect && ( ECSTemperatureHaut.state as Number > ECS_Temp_minvalid )
TempCorrect = TempCorrect && ( ECSTemperatureHaut.state as Number < ECS_Temp_maxvalid )
if (TempCorrect) {logInfo ("ECS","Températures correctes")}

but is I change one comparison ‘<’ to ‘>’ in ECSTemperatureHaut.state as Number < ECS_Temp_maxvalid it works like a charm

val Number ECS_Temp_hyst = 1.0|°C
val Number ECS_Temp_maxvalid = 90|°C
val Number ECS_Temp_minvalid = 0|°C
logInfo ("ECS","Script start")
logInfo ("ECS_Temp_hyst",ECS_Temp_hyst.toString())
var TempCorrect = ( ( ECSTemperatureHaut.state != UNDEF ) && ( ECSTemperatureHaut.state != NULL ) )
TempCorrect = TempCorrect && ( ECSTemperatureHaut.state as Number > ECS_Temp_minvalid )
TempCorrect = TempCorrect && ( ECS_Temp_maxvalid > ECSTemperatureHaut.state as Number  )
if (TempCorrect) {logInfo ("ECS","Températures correctes")}

and I don’t understand why.

Thank you for your help.

Bernard

Error message when it fails

2023-08-26 12:16:15.959 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘c4ee9b610a’ failed: val Number ECS_Temp_hyst = 1.0|°C
val Number ECS_Temp_maxvalid = 90|°C
val Number ECS_Temp_minvalid = 0|°C
logInfo (“ECS”,“Script start”)
logInfo (“ECS_Temp_hyst”,ECS_Temp_hyst.toString())
var TempCorrect = ( ( ECSTemperatureHaut.state != UNDEF ) && ( ECSTemperatureHaut.state != NULL ) )
TempCorrect = TempCorrect && ( ECSTemperatureHaut.state as Number > ECS_Temp_minvalid )
TempCorrect = TempCorrect && ( ECSTemperatureHaut.state as Number < ECS_Temp_maxvalid )
if (TempCorrect) {logInfo (“ECS”,“Températures correctes”)}

// don't force them back to Number. It lost the benefit of the unit. The inferred type is QuantityType, 
val ECS_Temp_hyst = 1.0|°C
val ECS_Temp_maxvalid = 90|°C
val ECS_Temp_minvalid = 0|°C
logInfo ("ECS","Script start")
logInfo ("ECS_Temp_hyst",ECS_Temp_hyst.toString())
var TempCorrect = ( ( ECSTemperatureHaut.state != UNDEF ) && ( ECSTemperatureHaut.state != NULL ) )
val ECSTemp = ECSTemperatureHaut.state as QuantityType<?>
TempCorrect = TempCorrect && ECSTemp.compareTo(ECS_Temp_minvalid) >= 0
TempCorrect = TempCorrect && ECSTemp.compareTo(ECS_Temp_maxvalid) <= 0
if (TempCorrect) {logInfo ("ECS","Températures correctes")}

Thank you for your answer. It work now!

Jetblack