Error during the execution of rule 'calculatePMV': Problem with rule : Could not invoke method: java.lang.Math.exp(double) on instance: null

Hi
I’m having a problem with this rule

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import java.lang.Math// gia to Math::exp
import java.lang.Integer
import java.lang.Double

//PMV rule

rule "calculatePMV"
when 
        Item Temperature_thermistor changed or
        Item RH changed 

then

//function calculatePMV(Ta, Tr, Vel, RH, CLO, MET, EW)   
 //Definition of the function "PMV" by 7 factors
  //
  
//  Ta  : Air Temperature,                [deg.C]
// @Tr@: Mean Radiant Temperature, @    [deg.C]
// @Vel : Relative Air Velocity,          [m/s]
//  RH  : Relative Humidity,              [%]
//  CLO : Clothing,                       [clo]
//  MET : Metabolic Rate,                 [met]
 
//  EW : External Work,                   [met] (=normally around 0)
//  PA  : Water Vapor Pressure,          [Pa]


var Number Vel=0.5//Vel : Relative Air Velocity,          [m/s]
var Number CLO=0.35//CLO : Clothing,
var Number MET=1.1// Metabolic Rate,                 [met]
var Number EW=0// External Work,                   [met] (=normally around 0)
var Number flag=0 // checking for closing the function


var Number RH_value=(RH.state as DecimalType).intValue
var Number Ta=(Temperature_thermistor.state as DecimalType).intValue
var Number Tr=(Temperature_thermistor.state as DecimalType).intValue

//var Number RH_value=(RH.state as DecimalType)
//var Number Ta=(Temperature_thermistor.state as DecimalType)
//var Number Tr=(Temperature_thermistor.state as DecimalType)

var Number FCL=0
var Number HC

var Number    PA=RH_value*10*Math::exp(16.6536 - 4030.183 / (Ta + 235))

logDebug ("kitchen","RH_value="+RH_value +"Ta=" + Ta + ",the one with the exp->PA="+ PA)

//Metabolic rate

var Number M=MET * 58.15 //Metabolic Rate,[W/m2]

var Number W=EW * 58.15  

var Number MW=M-W  //internal heat production in the human body

//Clothing
var Number ICL =0.155*CLO //thermal insulation of the Clothing, [m2K/W]
if(ICL<0.078){
     FCL= 1 + 1.29 * ICL
    }
else{
     FCL=1.05 + 0.645 * ICL
    }
    
//convention
var Number HCF=12.1 *Math::sqrt(Vel)//convective heat transfer coefficient by forced convection


var Number TaA=Ta+273 //air temperature in kelvin[K]
var Number TrA=Tr + 273   



//CALCULATE SURFACE TEMPERATURE OF CLOTHING BY ITERATION
var Number TCLA= TaA + (35.5 - Ta) / (3.5 * (6.45 * ICL + 0.1))

//first guess for surface temperature of clothing

var Number P1= ICL * FCL //calculation term
var Number P2=  P1 * 3.96 //calculation term
var Number P3= 1 * 100 //calculation term
var Number P4= P1 * TaA //calculation term
var Number P5=308.7 - 0.028 * MW + P2 * (TrA / 100) ^ 4 //calculation term
var Number XN = TCLA // 100
var Number XF = XN
var Number N = 0  //N: number of iterations
var Number EPS = 0.00015  //stop criteria in iteration

do{
    XF = (XF + XN) / 2
    //convective heat Transf. coeff. by natural convection
    var Number HCN = 2.38 * Math::abs(100 * XF - TaA) ^ 0.25
    
    if( HCF > HCN){
        HC = HCF
    }
    else{
        HC = HCN
    }
    XN = (P5 + P4 * HC - P2 * XF ^ 4) / (100 + P3 * HC)
    N = N + 1
     
    if(N > 150){
        
        var Number PMV_new_value= 999999
        flag=1
        postUpdate(PMV,PMV_new_value)
    }
    
}
while((Math::abs(XN - XF) < EPS) && flag==0)
//while(((XN - XF) < EPS)||flag==0)
if(flag==0){
    var Number TCL = 100 * XN - 273 //surface temperature of the clothing
    //HEAT LOSS COMPONENTS
   //heat loss diff. through skin
    var Number Ediff = 3.05 * 0.001 * (5733 - 6.99 * MW - PA)
  //heat loss by sweating (comfort)

     if(MW>58.15){
        var Number Esw = 0.42 * (MW - 58.15)
     } 
     else{
        var Number Esw = 0
     }


        //    latent respiration heat loss
        var Number  LRES = 1.7 * 0.00001 * M * (5867 - PA)
        
        //dry respiration heat loss
        var Number  DRES = 0.0014 * M * (34 - Ta)
        
        //heat loss by radiation
        var Number R = 3.96 * FCL * (XN ^ 4 - (TrA / 100) ^ 4)
        
        //heat loss by convection
        var Number C = FCL * HC * (TCL - Ta)
        
        //CALCULATE PMV AND PPD 
      //Thermal sensation transer coefficient
      
      
     //var Number TS = 0.303 * Math::exp(java::math::BigDecimal::doubleValue(-0.036 * M) + 0.028)
    var Number TS = 0.303 * Math::exp((-0.036 * M) + 0.028)
        
        
        //Predicted Mean Vote
    
            var Number PMV_new_value1= TS * (MW - Ediff - Esw - LRES - DRES - R - C)
            flag=0
            postUpdate(PMV,PMV_new_value1)

}// here closes if  flag==0        

    end

It shows me the error Could not invoke method: java.lang.Math.exp(double) on instance: null but I cannot understand why it is null . I tried with logdebug for some values and posts that they are null even those that I declare in the beggining. From yesterday openhab stopped posts in cmd about this function and have to check the openhab log file. Did I change anything by mistake and that’s because it is not shonw in the cmd.
Thanks in advance

Did you try to reboot or at least resstart openHAB?

by rebooting cmd window posts about my rule but it stills gives me the same error. But you are right , a reboot is always useful!!

This should probably be

java.math.BigDecimal::doubleValue

It seems that the exp function needs a double so I changed the PA variable to this
var Number quick=16.6536 - 4030.183 / (Ta + 235)
//logInfo (“infowar”,"quick = "+quick)

var Number    PA=RH_value * 10 * Math::exp(java::math::BigDecimal::doubleValue(quick))

But now I’m taking this error
2016-06-23 22:41:59.190 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule ‘calculatePMV’: Index: 1, Size: 1

which I cannot understand . This error is usually about arrays or as I saw in an other thread avout logs which I comment them all. Here is my last version of code

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import java.lang.Math// gia to Math::exp
import java.lang.Math.*
import java.lang.Integer
import java.lang.Double
var Number counter = 1
var Timer timer = null



rule "calculatePMV"
when 
        Item Temperature_thermistor changed or
        Item RH changed 

then

//function calculatePMV(Ta, Tr, Vel, RH, CLO, MET, EW)   
 //Definition of the function "PMV" by 7 factors
  //
  
//  Ta  : Air Temperature,                [deg.C]
// @Tr@: Mean Radiant Temperature, @    [deg.C]
// @Vel : Relative Air Velocity,          [m/s]
//  RH  : Relative Humidity,              [%]
//  CLO : Clothing,                       [clo]
//  MET : Metabolic Rate,                 [met]
 
//  EW : External Work,                   [met] (=normally around 0)
//  PA  : Water Vapor Pressure,          [Pa]


val Number Vel=0.5//Vel : Relative Air Velocity,          [m/s]
val Number CLO=0.35//CLO : Clothing,
val Number MET=1.1// Metabolic Rate,                 [met]
val Number EW=0// External Work,                   [met] (=normally around 0)
var  flag=0 
//logInfo ("infowar","flag = "+flag)
//logInfo ("infowar","Vel = "+Vel)
var Number RH_value=(RH.state as DecimalType).intValue
var Number Ta=(Temperature_thermistor.state as DecimalType).intValue
var Number Tr=(Temperature_thermistor.state as DecimalType).intValue

//var Number RH_value=(RH.state as DecimalType)
//var Number Ta=(Temperature_thermistor.state as DecimalType)
//var Number Tr=(Temperature_thermistor.state as DecimalType)
//logInfo ("infowar","RH_value = "+RH_value)

var Number FCL=0
var Number HC
var Number quick=16.6536 - 4030.183 / (Ta + 235)
//logInfo ("infowar","quick = "+quick)

var Number    PA=RH_value * 10 * Math::exp(java::math::BigDecimal::doubleValue(quick))

//logInfo ("infowar","PA = "+PA)



//Metabolic rate

var Number M=MET * 58.15 //Metabolic Rate,[W/m2]

var Number W=EW * 58.15  

var Number MW=M-W  //internal heat production in the human body

//Clothing
var Number ICL =0.155*CLO //thermal insulation of the Clothing, [m2K/W]

if(ICL<0.078){
     FCL= 1 + 1.29 * ICL
    }
else{
     FCL=1.05 + 0.645 * ICL
    }
    
//convention
var Number HCF=12.1 *Math::sqrt(Vel)//convective heat transfer coefficient by forced convection

//logInfo ("infowar","HCF = "+HCF)
var Number TaA=Ta+273 //air temperature in kelvin[K]
var Number TrA=Tr + 273   



//CALCULATE SURFACE TEMPERATURE OF CLOTHING BY ITERATION
var Number TCLA= TaA + (35.5 - Ta) / (3.5 * (6.45 * ICL + 0.1))

//first guess for surface temperature of clothing

var Number P1= ICL * FCL //calculation term
var Number P2=  P1 * 3.96 //calculation term
var Number P3= 1 * 100 //calculation term
var Number P4= P1 * TaA //calculation term
var Number P5=308.7 - 0.028 * MW + P2 * (TrA / 100) ^ 4 //calculation term
var Number XN = TCLA // 100
var Number XF = XN
var Number N = 0  //N: number of iterations
var Number EPS = 0.00015  //stop criteria in iteration
var Number quick2=0


do{
    XF = (XF + XN) / 2
    //convective heat Transf. coeff. by natural convection
    //TaA=java::math::BigDecimal::toBigInteger(TaA)
    //XF =java::math::BigDecimal::toBigInteger(XF)
    //logInfo ("infowar","XF = "+XF)
    //logInfo ("infowar","TaA = "+TaA)
    var Number quick3=java::math::BigDecimal::toBigInteger(100 * XF - TaA)
    
    if(quick3>=0){
    quick3=quick3
    }
    else{
    quick3=-quick3
    }
    
    
    var Number HCN = 2.38 * (quick3) ^ 0.25
    //logInfo ("infowar","HCN = "+HCN)
    
    
    
    
    if( HCF > HCN){
        HC = HCF
    }
    else{
        HC = HCN
    }
    XN = (P5 + P4 * HC - P2 * XF ^ 4) / (100 + P3 * HC)
    N = N + 1
     //logInfo ("infowar","XN = "+XN)
     //logInfo ("infowar","XF = "+XF)
     
     quick2 =java::math::BigDecimal::doubleValue(XN - XF)
         
         //vriskw to abs tou quick2
             if(quick2>=0){
            quick2=quick2
            }
            else{
            quick2=-quick2
            }
            
         //logInfo ("infowar","quick2 = "+quick2)
     
    if(N > 150){
        
        var Number PMV_new_value= 999999
        flag=1
        postUpdate(PMV,PMV_new_value)
    }
    
    
}

//while((quick2 < EPS) && flag==0)
//while((Math::abs(XN - XF) < EPS) && flag==0)
if(flag==0){
    var Number TCL = 100 * XN - 273 //surface temperature of the clothing
    //HEAT LOSS COMPONENTS
   //heat loss diff. through skin
    var Number Ediff = 3.05 * 0.001 * (5733 - 6.99 * MW - PA)
  //heat loss by sweating (comfort)

     if(MW>58.15){
        var Number Esw = 0.42 * (MW - 58.15)
     } 
     else{
        var Number Esw = 0
     }


        //    latent respiration heat loss
        var Number  LRES = 1.7 * 0.00001 * M * (5867 - PA)
        
        //dry respiration heat loss
        var Number  DRES = 0.0014 * M * (34 - Ta)
        
        //heat loss by radiation
        var Number R = 3.96 * FCL * (XN ^ 4 - (TrA / 100) ^ 4)
        
        //heat loss by convection
        var Number C = FCL * HC * (TCL - Ta)
        
        //CALCULATE PMV AND PPD 
      //Thermal sensation transer coefficient
      
      
     //var Number TS = 0.303 * Math::exp(java::math::BigDecimal::doubleValue(-0.036 * M) + 0.028)
       var Number TS = 0.303 * Math::exp((-0.036 * M) + 0.028)
        
        
        //Predicted Mean Vote
    
            var Number PMV_new_value1= TS * (MW - Ediff - Esw - LRES - DRES - R - C)
            flag=0
            postUpdate(PMV,PMV_new_value1)

}// here closes if  flag==0        

    end

Since quick is a Number, you can just call quick.doubleValue without messing with BigDecimal at all.

The error is indeed a mystery to me. I’d add some logging statements so you can narrow down the error to the exact line that is causing the error.

I finally made it to work

rule "calculatePMV"
when 
        Item Temperature_thermistor changed or
        Item RH changed 

then

//function calculatePMV(Ta, Tr, Vel, RH, CLO, MET, EW)   
 //Definition of the function "PMV" by 7 factors
  //
  
//  Ta  : Air Temperature,                [deg.C]
// @Tr@: Mean Radiant Temperature, @    [deg.C]
// @Vel : Relative Air Velocity,          [m/s]
//  RH  : Relative Humidity,              [%]
//  CLO : Clothing,                       [clo]
//  MET : Metabolic Rate,                 [met]
 
//  EW : External Work,                   [met] (=normally around 0)
//  PA  : Water Vapor Pressure,          [Pa]


val Number Vel=0.5//Vel : Relative Air Velocity,          [m/s]
val Number CLO=0.35//CLO : Clothing,
val Number MET=1.1// Metabolic Rate,                 [met]
val Number EW=0// External Work,                   [met] (=normally around 0)
var  flag=0 
//logInfo ("infowar","flag = "+flag)
//logInfo ("infowar","Vel = "+Vel)
var Number RH_value=(RH.state as DecimalType)
var Number Ta=(Temperature_thermistor.state as DecimalType) 
var Number Tr=(Temperature_thermistor.state as DecimalType)

//var Number RH_value=(RH.state as DecimalType)
//var Number Ta=(Temperature_thermistor.state as DecimalType)
//var Number Tr=(Temperature_thermistor.state as DecimalType)
//logInfo ("infowar","RH_value = "+RH_value)
var Number Esw=0
var Number FCL=0
var Number HC
var Number quick=16.6536 - 4030.183 / (Ta + 235)
//logInfo ("infowar","quick = "+quick)

//var Number    PA=RH_value * 10 * Math::exp(java::math::BigDecimal::doubleValue(quick))
var Number    PA=RH_value * 10 * Math::exp(quick.doubleValue)
//logInfo ("infowar","PA = "+PA)


  
//Metabolic rate

var Number M=MET * 58.15 //Metabolic Rate,[W/m2]

var Number W=EW * 58.15  

var Number MW=M-W  //internal heat production in the human body

//Clothing
var Number ICL =0.155*CLO //thermal insulation of the Clothing, [m2K/W]

if(ICL<0.078){
     FCL= 1 + 1.29 * ICL
    }
else{
     FCL=1.05 + 0.645 * ICL
    }
    
//convention
var Number HCF=12.1 *Math::sqrt(Vel.doubleValue)//convective heat transfer coefficient by forced convection

//logInfo ("infowar","HCF = "+HCF)
var Number TaA=Ta+273 //air temperature in kelvin[K]
var Number TrA=Tr + 273   



//CALCULATE SURFACE TEMPERATURE OF CLOTHING BY ITERATION
var Number TCLA= TaA + (35.5 - Ta) / (3.5 * (6.45 * ICL + 0.1))

//first guess for surface temperature of clothing

var Number P1= ICL * FCL //calculation term
var Number P2=  P1 * 3.96 //calculation term
var Number P3= 1 * 100 //calculation term
var Number P4= P1 * TaA //calculation term

var Number quickP5=TrA.doubleValue/100
var Number P5=308.7 - 0.028 * MW + P2 *Math::pow(quickP5.doubleValue,4) //calculation term

var Number XN = TCLA // 100
var Number XF = XN
var Number N = 0  //N: number of iterations
var Number EPS = 0.00015  //stop criteria in iteration
var Number quick2=0


do{
    XF = (XF + XN) / 2
  
    var Number quick3=(100 * XF - TaA)
    if(quick3>=0){
    quick3=quick3
    }
    else{
    quick3=-quick3
    }
    
    
 
    var Number HCN = 2.38  *Math::pow(quick3.doubleValue,0.25)
    
    
    
    
    if( HCF > HCN){
        HC = HCF
    }
    else{
        HC = HCN
    }
 
    XN = (P5 + P4 * HC - P2 * Math::pow(XF.doubleValue,4.00)) / (100 + P3 * HC)
    N = N + 1
     //logInfo ("infowar","XN = "+XN)
     //logInfo ("infowar","XF = "+XF)
     
   
         quick2 =(XN - XF)
         //vriskw to abs tou quick2
             if(quick2>=0){
            quick2=quick2
            }
            else{
            quick2=-quick2
            }
            
       
     
    if(N > 150){
        
        var Number PMV_new_value= 999999
        flag=1
        postUpdate(PMV,PMV_new_value)
    }
    
    
}

while((quick2 < EPS) && flag==0)
//while((Math::abs(XN - XF) < EPS) && flag==0)
if(flag==0){
    var Number TCL = 100 * XN - 273 //surface temperature of the clothing
    //HEAT LOSS COMPONENTS
   //heat loss diff. through skin
    var Number Ediff = 3.05 * 0.001 * (5733 - 6.99 * MW - PA)
  //heat loss by sweating (comfort)

     if(MW>58.15){
         Esw = 0.42 * (MW - 58.15)
     } 
     else{
         Esw = 0
     }


        //    latent respiration heat loss
        var Number  LRES = 1.7 * 0.00001 * M * (5867 - PA)
        
        //dry respiration heat loss
        var Number  DRES = 0.0014 * M * (34 - Ta)
        
        //heat loss by radiation
        //var Number R = 3.96 * FCL * (XN ^ 4 - (TrA / 100) ^ 4)
        var Number quickR=TrA/100.00
         
        var Number R =3.96 * FCL * (Math::pow(XN.doubleValue,4.00) - Math::pow(quickR.doubleValue,4.00))
            //heat loss by convection
        var Number C = FCL * HC * (TCL-Ta)
        
        //CALCULATE PMV AND PPD 
      //Thermal sensation transer coefficient
      
          
     //var Number TS = 0.303 * Math::exp(java::math::BigDecimal::doubleValue(-0.036 * M) + 0.028)
       
      //var Number x=java.lang.Number.doubleValue(M)
    
       var Number quickTS=(-0.036 * M) + 0.028
       var Number TS = 0.303 * Math::exp(quickTS.doubleValue)
         
        
        //Predicted Mean Vote
    
            var Number PMV_new_value1= TS * (MW - Ediff - Esw - LRES - DRES - R - C)
            flag=0
            postUpdate(PMV,PMV_new_value1)

}// here closes if  flag==0        

    end

Hi,
I’m getting the same error but .doubleValue doesn’t fix the issue.

My rule:

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
import java.lang.Math

rule "Distance Calculation from Home"
when 
    Item PresenceOwnTracksLatitude changed or
    Item PresenceOwnTracksLongitude changed
then
	var Number R = 6371 //Radius of the earth in km
	var Number lat2 = 47.367419
	var Number lon2 = 8.546003
	
	logInfo("Presence rules", "Home coordinates: "+lat2.toString+":"+lon2.toString)
	
	var Number lat1 = PresenceOwnTracksLatitude.state as DecimalType
	var Number lon1 = PresenceOwnTracksLongitude.state as DecimalType
	
	logInfo("Presence rules", "Now coordinates: "+lat1.doubleValue.toString+":"+lon1.doubleValue.toString)
	
	var double dLat = Math::toRadians(lat2.doubleValue-lat1.doubleValue)
	var double dLon = Math::toRadians(lon2.doubleValue-lon1.doubleValue)
	var double a = Math::sin(dLat/2) * Math::sin(dLat/2) +
		Math::cos(Math::toRadians(lat1)) * Math::cos(Math::toRadians(lat2.doubleValue)) * 
		Math::sin(dLon/2) * Math::sin(dLon/2)
	var double c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a)) 
	var double d = R * c; // Distance in km
	
	logInfo("Presence rules", "d+" Km far from Home.")
end

the log is:

2016-09-02 11:21:08.136 [INFO ] [.o.model.script.Presence rules] - Home coordinates: 47.367419:8.546003
2016-09-02 11:21:08.151 [INFO ] [.o.model.script.Presence rules] - Home coordinates: 47.367419:8.546003
2016-09-02 11:21:09.199 [INFO ] [.o.model.script.Presence rules] - Now coordinates: 52.22231:13.412759
2016-09-02 11:21:09.223 [INFO ] [.o.model.script.Presence rules] - Now coordinates: 52.22231:13.412759
2016-09-02 11:21:09.714 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Distance Calculation from Home': Could not invoke method: java.lang.Math.toRadians(double) on instance: null
2016-09-02 11:21:09.733 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Distance Calculation from Home': Could not invoke method: java.lang.Math.toRadians(double) on instance: null

so, the first lines in the log say that my variables are not null and the .doubleValue method is giving a value, but the call to Math::toRadians rises the error.

Any ideas?

Thank you.

Ok, solved by avoiding calculation in Math functions arguments and using Number variables.
Like:

var Number R = 6371 //Radius of the earth in km
var Number lat2 = 47.367419
var Number lon2 = 8.546003

var Number lat1 = PresenceOwnTracksLatitude.state as DecimalType
var Number lon1 = PresenceOwnTracksLongitude.state as DecimalType

var Number dLat = lat2-lat1
var Number dLon = lon2-lon1

dLat = Math::toRadians(dLat.doubleValue)
dLon = Math::toRadians(dLon.doubleValue)

var Number dLatHalf = dLat/2
var Number dLonHalf = dLon/2

var Number a = Math::sin(dLatHalf.doubleValue) * Math::sin(dLatHalf.doubleValue) +
Math::cos(Math::toRadians(lat1.doubleValue)) * Math::cos(Math::toRadians(lat2.doubleValue)) *
Math::sin(dLonHalf.doubleValue) * Math::sin(dLonHalf.doubleValue)
var double c = 2 * Math::atan2(Math::sqrt(a.doubleValue), Math::sqrt(1-a.doubleValue))
var double d = R * c; // Distance in km