2525#include " WarningManager.h"
2626#include " WarningType.h"
2727#include " BaseSensor.h"
28+ #include " Environment.h"
2829
2930constexpr uint64_t TempHumidityCheckMs = 2500 ;
3031
@@ -48,8 +49,14 @@ class Dht11SensorHandler : public BaseSensor, public BroadcastLoggerSupport
4849#if defined(MQTT_SUPPORT)
4950 char _slugTemp[32 ];
5051 char _slugHumidity[32 ];
52+ char _slugDewPoint[32 ];
53+ char _slugComfort[32 ];
54+ char _slugCondensation[40 ];
5155 char _nameTemp[48 ];
5256 char _nameHumidity[48 ];
57+ char _nameDewPoint[48 ];
58+ char _nameComfort[48 ];
59+ char _nameCondensation[48 ];
5360#endif
5461
5562protected:
@@ -232,8 +239,14 @@ class Dht11SensorHandler : public BaseSensor, public BroadcastLoggerSupport
232239#if defined(MQTT_SUPPORT)
233240 snprintf (_slugTemp, sizeof (_slugTemp), " %s_temperature" , _safeSlug);
234241 snprintf (_slugHumidity, sizeof (_slugHumidity), " %s_humidity" , _safeSlug);
242+ snprintf (_slugDewPoint, sizeof (_slugDewPoint), " %s_dew_point" , _safeSlug);
243+ snprintf (_slugComfort, sizeof (_slugComfort), " %s_comfort" , _safeSlug);
244+ snprintf (_slugCondensation, sizeof (_slugCondensation), " %s_condensation_risk" , _safeSlug);
235245 snprintf (_nameTemp, sizeof (_nameTemp), " %s Temperature" , _name);
236246 snprintf (_nameHumidity, sizeof (_nameHumidity), " %s Humidity" , _name);
247+ snprintf (_nameDewPoint, sizeof (_nameDewPoint), " %s Dew Point" , _name);
248+ snprintf (_nameComfort, sizeof (_nameComfort), " %s Comfort" , _name);
249+ snprintf (_nameCondensation, sizeof (_nameCondensation), " %s Condensation Risk" , _name);
237250#endif
238251 }
239252
@@ -254,8 +267,25 @@ class Dht11SensorHandler : public BaseSensor, public BroadcastLoggerSupport
254267 dtostrf (_temperatureOffset, 1 , 1 , celsiusOffset);
255268 dtostrf (_humidityOffset, 1 , 1 , humidityOffset);
256269
257- int written = snprintf (buffer, size, " \" name\" :\" %s\" ,\" SensorPin\" :%u,\" temperature\" :%s,\" tempOffset\" :%s,\" humidity\" :%s,\" humOffset\" :%s" ,
258- _name, _sensorPin, celsius, celsiusOffset, humidity, humidityOffset);
270+ double dewPt = Environment::dewPoint (_celsius, _humidity);
271+ char dewPointStr[8 ];
272+ dtostrf (dewPt, 1 , 1 , dewPointStr);
273+
274+ char comfortBuf[24 ];
275+ strncpy_P (comfortBuf, Environment::getComfortDescription (_celsius, _humidity, dewPt), sizeof (comfortBuf));
276+ comfortBuf[sizeof (comfortBuf) - 1 ] = ' \0 ' ;
277+
278+ CondensationRisk risk = Environment::condensationRisk (_celsius, dewPt, false );
279+ char riskBuf[8 ];
280+ strncpy_P (riskBuf, Environment::getCondensationRiskLabel (risk), sizeof (riskBuf));
281+ riskBuf[sizeof (riskBuf) - 1 ] = ' \0 ' ;
282+
283+ char safeName[64 ];
284+ SystemFunctions::sanitizeJsonString (_name, safeName, sizeof (safeName));
285+
286+ int written = snprintf (buffer, size,
287+ " \" name\" :\" %s\" ,\" SensorPin\" :%u,\" temperature\" :%s,\" tempOffset\" :%s,\" humidity\" :%s,\" humOffset\" :%s,\" dew_point\" :%s,\" comfort\" :\" %s\" ,\" condensation_risk\" :\" %s\" " ,
288+ safeName, _sensorPin, celsius, celsiusOffset, humidity, humidityOffset, dewPointStr, comfortBuf, riskBuf);
259289
260290 if (written < 0 || (size_t )written >= size)
261291 {
@@ -282,28 +312,62 @@ class Dht11SensorHandler : public BaseSensor, public BroadcastLoggerSupport
282312#if defined(MQTT_SUPPORT)
283313 uint8_t getMqttChannelCount () const override
284314 {
285- return 2 ;
315+ return 5 ;
286316 }
287317
288318 MqttSensorChannel getMqttChannel (uint8_t channelIndex) const override
289319 {
290- if (channelIndex == 0 )
320+ switch (channelIndex)
291321 {
292- return { _nameTemp, _slugTemp, " temperature" , " temperature" , " \xc2\xb0 " " C" , false };
322+ case 0 :
323+ return { _nameTemp, _slugTemp, " temperature" , " temperature" , " \xc2\xb0 " " C" , false };
324+ case 1 :
325+ return { _nameHumidity, _slugHumidity, " humidity" , " humidity" , " %" , false };
326+ case 2 :
327+ return { _nameDewPoint, _slugDewPoint, " humidity" , " temperature" , " \xc2\xb0 " " C" , false };
328+ case 3 :
329+ return { _nameComfort, _slugComfort, " humidity" , nullptr , nullptr , false };
330+ case 4 :
331+ return { _nameCondensation, _slugCondensation, " humidity" , nullptr , nullptr , false };
332+ default :
333+ return { _nameHumidity, _slugHumidity, " humidity" , " humidity" , " %" , false };
293334 }
294-
295- return { _nameHumidity, _slugHumidity, " humidity" , " humidity" , " %" , false };
296335 }
297336
298337 void getMqttValue (uint8_t channelIndex, char * buffer, size_t size) const override
299338 {
300- if (channelIndex == 0 )
301- {
302- dtostrf (_celsius, 1 , 1 , buffer);
303- }
304- else
339+ switch (channelIndex)
305340 {
306- snprintf (buffer, size, " %u" , static_cast <uint8_t >(_humidity));
341+ case 0 :
342+ dtostrf (_celsius, 1 , 1 , buffer);
343+ break ;
344+ case 1 :
345+ snprintf (buffer, size, " %u" , static_cast <uint8_t >(_humidity));
346+ break ;
347+ case 2 :
348+ {
349+ double dewPt = Environment::dewPoint (_celsius, _humidity);
350+ dtostrf (dewPt, 1 , 1 , buffer);
351+ break ;
352+ }
353+ case 3 :
354+ {
355+ double dewPt = Environment::dewPoint (_celsius, _humidity);
356+ strncpy_P (buffer, Environment::getComfortDescription (_celsius, _humidity, dewPt), size);
357+ buffer[size - 1 ] = ' \0 ' ;
358+ break ;
359+ }
360+ case 4 :
361+ {
362+ double dewPt = Environment::dewPoint (_celsius, _humidity);
363+ CondensationRisk risk = Environment::condensationRisk (_celsius, dewPt, false );
364+ strncpy_P (buffer, Environment::getCondensationRiskLabel (risk), size);
365+ buffer[size - 1 ] = ' \0 ' ;
366+ break ;
367+ }
368+ default :
369+ if (size > 0 ) buffer[0 ] = ' \0 ' ;
370+ break ;
307371 }
308372 }
309373#endif
0 commit comments