I implemented a lambda expression for filtering and calibration of temprature/humidity sensor data. The expression is working like expected - however, I get repedately the following error message in the logfile:
2017-12-19 21:17:09.754 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Filter_Temperatur_Kueche': null
Do you have any idea?
Thanks a lot
Karsten
The corresponding rule looks like this:
import java.util.Map
import org.eclipse.xtext.xbase.lib.Functions
//constants
val Map<String, Double> DHT22_Temprature_limits = newHashMap(
"min" -> -2.0, //minimal temperature in C
"max" -> 50.0, //maximal temperature in C
"max_delta" -> 0.5) //maximum difference between two temprature measurements in C
val Map<String, Double> DHT22_Humidity_limits = newHashMap(
"min" -> 0.0, //minimal humidity in %
"max" -> 100.0, //maximal humidity in %
"max_delta" -> 2.0) //maximum difference between two humidity measurements in %
/// calibration parameter
val double Temperatur_Kueche_Offset =-0.1
val double Temperatur_Flur_Offset =-0.4
val double Luftfeuchtigkeit_Kueche_Offset = 0.0
val double Luftfeuchtigkeit_Flur_Offset =-3.0
///////////////////////////////////////////////////////////////////////////////
//filter algorithm
val Map<String, Double> Last_Values = newHashMap
val Functions$Function5<GenericItem,GenericItem,Map<String, Double>,Double,Map<String, Double>, Boolean> dht22_filter= [
raw_item,
filtered_item,
limits,
offset,
last_values |
val String key=raw_item.name
// get states variables
var double last_value=0.0
if(last_values.containsKey(key)) last_value=last_values.get(key)
else last_values.put(key,last_value)
if(raw_item.state!=NULL)
{
//get constants
val double min = limits.get("min")
val double max = limits.get("max")
val double max_delta = limits.get("max_delta")
//offset compensation
val double raw_value=(raw_item.state as Number).doubleValue-offset
// logInfo("dht22-filter","name: "+ key+" raw: " +raw_item.state.toString+ " compensated: "+raw_value.toString+
// " min " + min.toString + " max " + max.toString + " max_delta " + max_delta.toString +
// " last: " + last_value.toString
// )
//ignore values outside range
if( (raw_value >= min) && (raw_value <= max) )
{
//if the new value derives more than max_delta from the last
//its may errornous -> ignore, however store for the next time
if(Math::abs(last_value - raw_value) < max_delta)
{
filtered_item.postUpdate(raw_value)
}
last_value=raw_value
}
}
//store state
last_values.put(key,last_value)
true
]
rule "Filter_Temperatur_Kueche"
when
Item Temperatur_Kueche_Raw received update
then
dht22_filter.apply(
Temperatur_Kueche_Raw,
Temperatur_Kueche,
DHT22_Temprature_limits,
Temperatur_Kueche_Offset,
Last_Values
)
end
The item definition in an item file looks like this:
Number Temperatur_Kueche "Küche [%.1f °C] " <temperature> (Raumtemperatur)
Number Temperatur_Kueche_Raw "Küche Raw[%.1f °C] " <temperature> (Raumtemperatur_Raw)
{
mqtt="<[mosquitto:/home/arduino2/dht_sensors/temperature/3:state:default]"
}