Rule Heating | Cannot assign a value in null context even with Number value

Hi All,
I try to write a new rule for my Floorheater. I have some unexpected failure.
For my understanding the error code means that there is something wrong with my Number Values… but I don´t know what the error code means for my case … is there something that I missed?
Thank for your help :slight_smile:

var Number Hysterese_Start = 0.25    //Hysterese in °C anfangen heizen
var Number Hysterese_Ende = 0.4      //Hysterese in °C ende heizen
var Temp_vergleich = 0  //0 = aus, 1 = ein

rule "Bodenheizung"
when
  Item Raumtemperatur received update
then

if(thermostat_target_mode.state.toString == "OFF" && Kueche_Heizung.state == ON) {       //Wenn Heizung Deaktiviert ist aber Heizung noch AN ist
  Heizung_DW3.sendCommand(OFF)
}

else if((Hysterese_Start - Raumtemperatur.state as Number) =< Heizung.state as Number) {                  //Wenn Raumteperatur kleiner ist als Solltemperatur
  Temp_vergleich = 1
}

else((Raumtemperatur.state as Number - Hysterese_Ende) => Heizung.state as Number) {                               //Wenn Raumteperatur größer ist als Solltemperatur
  Temp_vergleich = 0
}

if(Temp_vergleich == 1 && thermostat_target_mode.state.toString == "ON" && (Kueche_Heizung.state == NULL || Kueche_Heizung.state == OFF)){
  Heizung_DW3.sendCommand(ON) + thermostat_current_mode.sendCommand("HEATING")
}

else if(Temp_vergleich == 0 && thermostat_target_mode.state.toString == "ON" && (Kueche_Heizung.state == NULL || Kueche_Heizung.state == ON)) {
  Heizung_DW3.sendCommand(OFF) + thermostat_current_mode.sendCommand("OFF")
}

end

Error

2022-10-07 11:52:26.994 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Bodenheizung-1' failed: An error occurred during the script execution: Cannot assign a value in null context. in Bodenheizung

What exactly is that? Log it out, and find out. I’d guess you are trying to do maths involving units of measurement.

this is my room temperature item (as Number value).

Yes I try to to a little bit math. I want that my heater turn on when my room temperature drops 0.4 °C under my target temperature. And it should turn off when my room temperature rises until it is 0.25 °C under my Target temperature.

Okay, once again, what is your actual state?

You cannot compare 0.4 °C with 1.0, it makes no mathematical sense, it is comparing apples with oranges. 1.0 what? °C, °F, K?

I’m only guessing what your problem is, you need to look at your own actual state.

If it does come with units, this will probably help.

for my understanding it is just a normal Number without a Quantity Type… so that’s the reason why I don’t use units in my rules…

2022-10-10 15:09:28.969 [INFO ] [rugopenhab.core.model.script.testlog] - state contains 22.3

When I leave it like that without the math it work…

else if(Raumtemperatur.state < Heizung.state as Number) {                  //Wenn Raumteperatur kleiner ist als Solltemperatur
  Temp_vergleich = 1
  logInfo("Bodenheizung", "Temp Vergleich = 1 ")
}

but I should look like this withe the Hystereses:

else if((Raumtemperatur.state - Hysterese_Start ) < Heizung.state as Number) {                  //Wenn Raumteperatur kleiner ist als Solltemperatur
  Temp_vergleich = 1
  logInfo("Bodenheizung", "Temp Vergleich = 1 ")
}

but when I try it I receive this error message and I don’t have any idea way…

2022-10-11 15:49:10.051 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Bodenheizung.rules' has errors, therefore ignoring it: [15,64]: mismatched input 'as' expecting '>'
[15,73]: mismatched input ')' expecting 'end'
var Hysterese_Start = 0.25    //Hysterese in °C anfangen heizen
var Hysterese_Ende = 0.4      //Hysterese in °C ende heizen
var Temp_vergleich = 0        //0 = aus, 1 = ein

rule "Bodenheizung"
when
  Item Raumtemperatur received update
then

if((thermostat_target_mode.state.toString == "OFF" || thermostat_target_mode.state.toString == "NULL") && Kueche_Heizung.state.toString == "ON") {       //Wenn Heizung Deaktiviert ist aber Heizung noch AN ist
  Heizung_DW3.sendCommand(OFF)  + thermostat_current_mode.sendCommand("OFF")
  logInfo("Bodenheizung", "Hauptschalter AUS ")
}

else if((Raumtemperatur.state - Hysterese_Start ) < Heizung.state as Number) {                  //Wenn Raumteperatur kleiner ist als Solltemperatur
  Temp_vergleich = 1
  logInfo("Bodenheizung", "Temp Vergleich = 1 ")
}

else if(Raumtemperatur.state - Hysterese_Ende) > Heizung.state as Number) {                     //Wenn Raumteperatur größer ist als Solltemperatur
  Temp_vergleich = 0
  logInfo("Bodenheizung", "Temp Vergleich = 0 ")
}

else {
  Temp_vergleich = 2
  logInfo("Bodenheizung", "Temp Vergleich = 2 ")
}

switch (Temp_vergleich) {

case 0: {
  if(thermostat_target_mode.state.toString == "HEATING" && (Kueche_Heizung.state.toString == "NULL" || Kueche_Heizung.state.toString == "ON") ) {
  Heizung_DW3.sendCommand(OFF) + thermostat_current_mode.sendCommand("OFF")
  logInfo("Bodenheizung", "Heizung AUS ")
  }
  else {
  logInfo("Bodenheizung", "Case 0 nicht bestanden")
  } 
}

case 1: {
  if(thermostat_target_mode.state.toString == "HEATING" && (Kueche_Heizung.state.toString == "NULL" || Kueche_Heizung.state.toString == "OFF")) {
  Heizung_DW3.sendCommand(ON) + thermostat_current_mode.sendCommand("HEATING")
  logInfo("Bodenheizung", "Heizung EIN")
  }
  else {
  logInfo("Bodenheizung", "Case 1 nicht bestanden")
  }
}

case 2: {
  Heizung_DW3.sendCommand(OFF) + thermostat_current_mode.sendCommand("OFF")
  logInfo("Bodenheizung", "Heizung FEHLER kein Temp. Vergleich")

}
default  : {
  logInfo("Bodenheizung", "Heizung nichts zutreffend")
}
}
end

@rossko57 did you saw my last update? Please can you have a look?
Thank you.

No, I’ve been away for a fortnight.

There’s three or four different things going on here. Break it down in smaller steps.
Raumtemperatur.state
What’s that? Log it out.
Raumtemperatur.state - Hysterese_Start
What’s that, can it do the maths here? Perform the calculation outside of the if() so that you can isolate and log out the result.
Heizung.state as Number
What’s that, log it out?
Are these now sensible values to compare?
< Heizung.state as Number
Is that ambiguous? Did we mean
(X < Y) as Number
or did we mean
X < (Y as Number)
Would it help to disambiguate with braces?