//= Heizung //# Für Lambdas import org.eclipse.xtext.xbase.lib.Functions val logName = "heating_sensor_calibration" // Die Philips Hue Motion-Sensoren haben einen mächtig ungenaumen Termo-Sensor eingebaut. //der Normale Offset hilft nicht, um das auchzugleichen, weil die Abweichung //scheinbar temperatur-Abhänig ist. //Hier wird eine Korrektur über zwei Punkte gemacht. Also eine lineare korrektur. //Aus den beiden Punkten wird eine Steigung berechnet. Darüber wird die Krrektur //am aktuellen Wert berechnet... hoffe das passt so einigermassen.... val Functions$Function6 calculate = [ GenericItem source_item, GenericItem target_item, Float mess1, Float echt1, Float mess2, Float echt2 | // im Lambda besteht kein Zugriff auf externe val's // also muss der LogName hierdrin neu definiert werden // val logName = "heating_sensor_calibration" // logInfo(logName, "Punkt 1 " + mess1 + " ->" + echt1) // logInfo(logName, "Punkt 2 " + mess2 + " -> " + echt2) // Temp-Sensoren werden über expire auf undef gesetzt. // Undef-Werte werden durchgereicht. if (source_item.state == UNDEF) { postUpdate(target_item, UNDEF) } else { val Float currMess = (source_item.state as Number).floatValue val Float abweichung1 = echt1 - mess1; val Float abweichung2 = echt2 - mess2; val Float abweichungDiff = abweichung2 - abweichung1; val Float tempDiff = mess2 - mess1; val Float currTempDiff = currMess - mess1; val Float steigung = abweichungDiff / tempDiff; val Float currAbweichung = abweichung1 + steigung * currTempDiff; val Float res = currMess + currAbweichung; sendCommand(target_item, res) } ] rule "SN_V_U_DG_Temp calibration" when Item SN_V_U_DG_Temp_RAW changed then calculate.apply(SN_V_U_DG_Temp_RAW, SN_V_U_DG_Temp, 16.4, 18.6, 17.8, 20.1) end rule "SN_H_O_L_Temp calibration" when Item SN_H_O_L_Temp_RAW changed then calculate.apply(SN_H_O_L_Temp_RAW, SN_H_O_L_Temp, 19.5, 18.6, 20.8, 20.1) end rule "SN_H_U_K_Temp calibration" when Item SN_H_U_KI_Temp_RAW changed then calculate.apply(SN_H_U_KI_Temp_RAW, SN_H_U_KI_Temp, 16.4, 18.6, 18.1, 20.1) end rule "SN_H_U_B_Temp calibration" when Item SN_H_U_B_Temp_RAW changed then calculate.apply(SN_H_U_B_Temp_RAW, SN_H_U_B_Temp, 17.5, 18.6, 19.0, 20.1) end rule "SN_HOF_Temp calibration" when Item SN_HOF_Temp_RAW changed then calculate.apply(SN_HOF_Temp_RAW, SN_HOF_Temp, 10.42, 9.9, 21.86, 20.95 ) end rule "SN_V_U_FL_Temp calibration" when Item SN_V_U_FL_Temp_RAW changed then calculate.apply(SN_V_U_FL_Temp_RAW, SN_V_U_FL_Temp, 16.44 ,17.8 , 19.41, 20.95) end rule "SN_V_U_WZ_Temp calibration" when Item SN_V_U_WZ_Temp_RAW changed then calculate.apply(SN_V_U_WZ_Temp_RAW, SN_V_U_WZ_Temp, 16.55, 17.8, 19.52, 20.95) end rule "SN_V_O_KI_Temp calibration" when Item SN_V_O_KI_Temp_RAW changed then calculate.apply(SN_V_O_KI_Temp_RAW, SN_V_O_KI_Temp, 15.81, 17.8, 18.77, 20.95) end rule "SN_V_O_B_Temp calibration" when Item SN_V_O_B_Temp_RAW changed then calculate.apply(SN_V_O_B_Temp_RAW, SN_V_O_B_Temp, 16.59, 17.8, 19.84, 20.95) end rule "SN_H_O_M_Temp calibration" when Item SN_H_O_M_Temp_RAW changed then calculate.apply(SN_H_O_M_Temp_RAW, SN_H_O_M_Temp, 18.02, 18.4, 20.71, 20.6) end rule "SN_H_O_R_Temp calibration" when Item SN_H_O_R_Temp_RAW changed then calculate.apply(SN_H_O_R_Temp_RAW, SN_H_O_R_Temp, 17.07, 18.4, 19.90, 20.6) end rule "SN_V_O_SL_Temp calibration" when Item SN_V_O_SL_Temp_RAW changed then calculate.apply(SN_V_O_SL_Temp_RAW, SN_V_O_SL_Temp, 16.61, 18.4, 19.02, 20.6) end rule "SN_V_O_FL_Temp calibration" when Item SN_V_O_FL_Temp_RAW changed then calculate.apply(SN_V_O_FL_Temp_RAW, SN_V_O_FL_Temp, 16.56, 18.4, 19.24, 20.6) end rule "SN_H_K_1_Temp calibration" when Item SN_H_K_1_Temp_RAW changed then calculate.apply(SN_H_K_1_Temp_RAW, SN_H_K_1_Temp, 16.66, 18.4, 19.91, 20.6) end rule "SN_O_G_H_Temp calibration" when Item SN_O_G_H_Temp_RAW changed then calculate.apply(SN_O_G_H_Temp_RAW, SN_O_G_H_Temp, 16.57, 18.4, 19.67, 20.6) end rule "SN_O_G_T_Temp calibration" when Item SN_O_G_T_Temp_RAW changed then calculate.apply(SN_O_G_T_Temp_RAW, SN_O_G_T_Temp, 18.00, 18.4, 21.39, 20.6) end //# This rule cases the pre-compile of the whole rulefile by system-start. //# Verhindert, dass Rules erst bei der ersten Schalter-bedinung compiliert //# werden. //# Wichtig: RuleName muss eindeutig sein. Verwende Dateiname rule "precompile heating_sensor_calibration" when System started then logInfo(logName, "precompile triggered") end