From 9a5217bf90381e96d7de92348d49473511a348c9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 19 Feb 2024 14:17:40 +0100 Subject: [PATCH] Add heatindex to BMP driver (#4771) --- tasmota/tasmota_support/support.ino | 7 ++++++- tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index f6e3b6f55..42bdca5ad 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -860,6 +860,8 @@ float CalcTempHumToDew(float t, float h) { #ifdef USE_HEAT_INDEX float CalcTemHumToHeatIndex(float t, float h) { + if (isnan(h) || isnan(t)) { return NAN; } + if (!Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit t = t * 1.8f + 32; // Fahrenheit } @@ -881,7 +883,10 @@ float CalcTemHumToHeatIndex(float t, float h) { hi += ((h - 85.0) * 0.1) * ((87.0 - t) * 0.2); } } - return (Settings->flag.temperature_conversion) ? hi : (hi - 32) / 1.8f; + if (!Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit + hi = (hi - 32) / 1.8f; // Celsius + } + return hi; } #endif // USE_HEAT_INDEX diff --git a/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino b/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino index b9ed27082..5dc0d7197 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino @@ -583,14 +583,23 @@ void BmpShow(bool json) { float f_dewpoint = CalcTempHumToDew(bmp_temperature, bmp_humidity); char dewpoint[33]; dtostrfd(f_dewpoint, Settings->flag2.temperature_resolution, dewpoint); +#ifdef USE_HEAT_INDEX + float f_heatindex = CalcTemHumToHeatIndex(bmp_temperature, bmp_humidity); + char heatindex[33]; + dtostrfd(f_heatindex, Settings->flag2.temperature_resolution, heatindex); +#endif // USE_HEAT_INDEX #ifdef USE_BME68X char gas_resistance[33]; dtostrfd(bmp_sensors[bmp_idx].bmp_gas_resistance, 2, gas_resistance); #endif // USE_BME68X if (json) { - char json_humidity[80]; + char json_humidity[100]; +#ifdef USE_HEAT_INDEX + snprintf_P(json_humidity, sizeof(json_humidity), PSTR(",\"" D_JSON_HUMIDITY "\":%s,\"" D_JSON_DEWPOINT "\":%s,\"" D_JSON_HEATINDEX "\":%s"), humidity, dewpoint, heatindex); +#else snprintf_P(json_humidity, sizeof(json_humidity), PSTR(",\"" D_JSON_HUMIDITY "\":%s,\"" D_JSON_DEWPOINT "\":%s"), humidity, dewpoint); +#endif // USE_HEAT_INDEX char json_sealevel[40]; snprintf_P(json_sealevel, sizeof(json_sealevel), PSTR(",\"" D_JSON_PRESSUREATSEALEVEL "\":%s"), sea_pressure); #ifdef USE_BME68X @@ -631,6 +640,9 @@ void BmpShow(bool json) { if (bmp_sensors[bmp_idx].bmp_model >= 2) { WSContentSend_PD(HTTP_SNS_HUM, name, humidity); WSContentSend_PD(HTTP_SNS_DEW, name, dewpoint, TempUnit()); +#ifdef USE_HEAT_INDEX + WSContentSend_PD(HTTP_SNS_HEATINDEX, name, heatindex, TempUnit()); +#endif // USE_HEAT_INDEX } WSContentSend_PD(HTTP_SNS_PRESSURE, name, pressure, PressureUnit().c_str()); if (Settings->altitude != 0) {