I use the following rule in OpenHab 3.3 to calculate Heat Index (Real Feel):
/**
* Calculate Heat Index (Real Fell)
*
* Based on Adafruit - DHT-sensor-library
* @see https://github.com/adafruit/DHT-sensor-library/blob/master/DHT.cpp DHT::computeHeatIndex()
*/
rule "Rule 1: Calculate real feel"
when
Member of gTemp changed or
Member of gHumid changed
then
logDebug("climate", 'Rule 1: "Calculate real feel" is executing on triggerItem [{}] changed from [{}] to [{}].', triggeringItemName, previousState, newState)
if (triggeringItemName.endsWith("_RF")) {
logDebug("climate", 'Rule 1: "Skipping calculation for a real feel item [{}].', triggeringItemName)
return;
}
val room = triggeringItem.name.split('_').get(0)
val RealFeelItem = gTemp.members.findFirst[ m |
m.name == room + "_RF"
] as NumberItem;
if (RealFeelItem === null) {
logDebug("climate", "Rule 1 @ [{}]: Real feel item [{}] not found.", room, room + "_RF")
return;
}
logDebug("climate", "Rule 1 @ [{}]: Found real feel item [{}].", room, RealFeelItem.name)
val TempItem = gTemp.members.findFirst[ m |
m.name == room + "_Temp"
] as NumberItem;
if (TempItem === null) {
logDebug("climate", "Rule 1 @ [{}]: Temperature item [{}] not found.", room, room + "_Temp")
return;
}
logDebug("climate", "Rule 1 @ [{}]: Found temperature item [{}].", room, TempItem.name)
val HumidItem = gHumid.members.findFirst[ m |
m.name == room + "_Humid"
] as NumberItem;
if (HumidItem === null) {
logDebug("climate", "Rule 1 @ [{}]: Humidity item [{}] not found.", room, room + "_Humid")
return;
}
logDebug("climate", "Rule 1 @ [{}]: Found humidity item [{}].", room, HumidItem.name)
val Number percentHumidity = (HumidItem.state as QuantityType<Dimensionless>).toUnit("%").toBigDecimal
logDebug("climate", "Rule 1 @ [{}]: percentHumidity = {}", room, percentHumidity)
val Number temperature = (TempItem.state as QuantityType<Temperature>).toUnit("°F").toBigDecimal
logDebug("climate", "Rule 1 @ [{}]: temperature = {}", room, temperature)
var Number hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + (percentHumidity * 0.094));
logDebug("climate", "Rule 1 @ [{}]: Initial hi = {}", room, hi)
if (hi > 79) {
hi = -42.379 + 2.04901523 * temperature + 10.14333127 * percentHumidity +
-0.22475541 * temperature * percentHumidity +
-0.00683783 * Math.pow(temperature.doubleValue, 2) +
-0.05481717 * Math.pow(percentHumidity.doubleValue, 2) +
0.00122874 * Math.pow(temperature.doubleValue, 2) * percentHumidity +
0.00085282 * temperature * Math.pow(percentHumidity.doubleValue, 2) +
-0.00000199 * Math.pow(temperature.doubleValue, 2) * Math.pow(percentHumidity.doubleValue, 2)
logDebug("climate", "Rule 1 @ [{}]: Correction applied for hi > 79 °F. New hi = {}", room, hi)
if ((percentHumidity < 13) && (temperature >= 80) && (temperature <= 112)) {
hi = hi - ((13.0 - percentHumidity) * 0.25) * Math.sqrt((17.0 - Math.abs(temperature.doubleValue - 95.0)) * 0.05882)
logDebug("climate", "Rule 1 @ [{}]: Correction applied for percentHumidity < 13 %, temperature between 80 °F and 112.0 °F. New hi = {}", room, hi)
}
else if ((percentHumidity > 85) && (temperature >= 80) && (temperature <= 87)) {
hi = hi + ((percentHumidity - 85.0) * 0.1) * ((87.0 - temperature) * 0.2);
logDebug("climate", "Rule 1 @ [{}]: Correction applied for percentHumidity > 85 % and temperature between 80 °F and 87 °F. New hi = {}", room, hi)
}
}
logDebug("climate", "Rule 1 @ [{}]: Updating real feel item [{}] to {} °F ({}).", room, RealFeelItem.name, hi, new QuantityType<Temperature>(hi + " °F").toUnit("°C"))
RealFeelItem.postUpdate(hi + " °F")
end
The items are defined like:
Group:Number:AVG gTemp <temperature>
Group:Number:AVG gHumid <humidity>
// ...
Number:Temperature Room1_Temp "Room 1 temperature [%.2f °C]" <temperature> (gEsp12f04, gMeasurement, gTemp) ["Temperature", "Measurement"] { channel="mqtt:topic:tasmota:custom-mcs:2:Temperature"}
Number:Temperature Room1_RF "Room 1 real feel [%.2f °C]" <man_1> (gEsp12f04, gMeasurement, gTemp) ["Temperature", "Measurement"]
Number:Dimensionless Room1_Humid "Room 1 humidity [%.2f %%]" <humidity> (gEsp12f04, gMeasurement, gHumid) ["Humidity", "Measurement"] { channel="mqtt:topic:tasmota:custom-mcs:2:Humidity"}
// ...