@@ -419,6 +419,10 @@ using irutils::msToString;
419419 ADC_MODE (ADC_VCC);
420420#endif // REPORT_VCC
421421
422+ #ifdef SHT3X_SUPPORT
423+ #include < WEMOS_SHT3X.h>
424+ #endif
425+
422426// Globals
423427uint8_t _sanity = 0 ;
424428#if defined(ESP8266)
@@ -495,9 +499,15 @@ String MqttClimateCmnd; // Sub-topic for the climate command topics.
495499#if MQTT_DISCOVERY_ENABLE
496500String MqttDiscovery;
497501String MqttUniqueId;
502+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
503+ String MqttDiscoverySensor;
504+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
498505#endif // MQTT_DISCOVERY_ENABLE
499506String MqttHAName;
500507String MqttClientId;
508+ #if SHT3X_SUPPORT
509+ String MqttSensorStat;
510+ #endif // SHT3X_SUPPORT
501511
502512// Primative lock file for gating MQTT state broadcasts.
503513bool lockMqttBroadcast = true ;
@@ -537,6 +547,11 @@ bool isSerialGpioUsedByIr(void) {
537547 return false ; // Not in use as far as we can tell.
538548}
539549
550+ #if SHT3X_SUPPORT
551+ SHT3X TemperatureSensor (SHT3X_I2C_ADDRESS);
552+ TimerMs statSensorReadTime = TimerMs();
553+ #endif // SHT3X_SUPPORT
554+
540555// Debug messages get sent to the serial port.
541556#pragma GCC diagnostic push
542557#pragma GCC diagnostic ignored "-Wunused-parameter"
@@ -1290,7 +1305,13 @@ void handleAdmin(void) {
12901305#if MQTT_DISCOVERY_ENABLE
12911306 html += htmlButton (
12921307 kUrlSendDiscovery , F (" Send MQTT Discovery" ),
1293- F (" Send a Climate MQTT discovery message to Home Assistant.<br><br>" ));
1308+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
1309+ F (" Send a Climate and Sensor MQTT"
1310+ #else
1311+ F (" Send a Climate MQTT"
1312+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
1313+ " discovery message to Home Assistant.<br><br>" ));
1314+
12941315#endif // MQTT_DISCOVERY_ENABLE
12951316#if MQTT_CLEAR_ENABLE
12961317 html += htmlButton (
@@ -1492,6 +1513,10 @@ bool clearMqttSavedStates(const String topic_base) {
14921513#if MQTT_DISCOVERY_ENABLE
14931514 // Clear the HA climate discovery message.
14941515 success &= mqtt_client.publish (MqttDiscovery.c_str (), " " , true );
1516+ #if SHT3X_SUPPORT && MQTT_DISCOVERY_ENABLE
1517+ // Clear the HA sensor discovery message.
1518+ success &= mqtt_client.publish (MqttDiscoverySensor.c_str (), " " , true );
1519+ #endif // SHT3X_SUPPORT && MQTT_DISCOVERY_ENABLE
14951520#endif // MQTT_DISCOVERY_ENABLE
14961521 for (size_t channel = 0 ;
14971522 channel <= kNrOfIrTxGpios ;
@@ -2207,12 +2232,19 @@ void init_vars(void) {
22072232 // Sub-topic for the climate stat topics.
22082233#if MQTT_DISCOVERY_ENABLE
22092234 MqttDiscovery = " homeassistant/climate/" + String (Hostname);
2235+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
2236+ MqttDiscoverySensor = " homeassistant/sensor/" + String (Hostname);
2237+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
22102238 MqttUniqueId = WiFi.macAddress ();
22112239 MqttUniqueId.replace (" :" , " " );
22122240#endif // MQTT_DISCOVERY_ENABLE
22132241 MqttHAName = String (Hostname) + " _aircon" ;
22142242 // Create a unique MQTT client id.
22152243 MqttClientId = String (Hostname) + String (kChipId , HEX);
2244+ #if SHT3X_SUPPORT
2245+ // Sub-topic for the climate stat topics.
2246+ MqttSensorStat = String (MqttPrefix) + ' /' + MQTT_SENSOR_STAT + ' /' ;
2247+ #endif // SHT3X_SUPPORT
22162248#endif // MQTT_ENABLE
22172249}
22182250
@@ -2518,6 +2550,9 @@ void handleSendMqttDiscovery(void) {
25182550 htmlMenu () +
25192551 F (" <p>The Home Assistant MQTT Discovery message is being sent to topic: " )
25202552 + MqttDiscovery +
2553+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
2554+ F (" and " ) + MqttDiscoverySensor +
2555+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
25212556 F (" . It will show up in Home Assistant in a few seconds."
25222557 " </p>"
25232558 " <h3>Warning!</h3>"
@@ -2530,6 +2565,10 @@ void handleSendMqttDiscovery(void) {
25302565 if (i > 0 ) channel_id = " _" + String (i);
25312566 sendMQTTDiscovery (MqttDiscovery.c_str (), channel_id);
25322567 }
2568+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
2569+ sendMQTTDiscoverySensor (MqttDiscoverySensor.c_str (), KEY_TEMP);
2570+ sendMQTTDiscoverySensor (MqttDiscoverySensor.c_str (), KEY_HUMIDITY);
2571+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
25332572}
25342573#endif // MQTT_DISCOVERY_ENABLE
25352574
@@ -2734,6 +2773,9 @@ void sendMQTTDiscovery(const char *topic, String channel_id) {
27342773 " \" swing_modes\" :[\" " D_STR_OFF " \" ,\" " D_STR_AUTO " \" ,\" " D_STR_HIGHEST
27352774 " \" ,\" " D_STR_HIGH " \" ,\" " D_STR_MIDDLE " \" ,\" "
27362775 D_STR_LOW " \" ,\" " D_STR_LOWEST " \" ],"
2776+ #if SHT3X_SUPPORT
2777+ " \" curr_temp_t\" :\" " ) + MqttSensorStat + F (KEY_TEMP " \" ,"
2778+ #endif // SHT3X_SUPPORT
27372779 " \" uniq_id\" :\" " ) + MqttUniqueId + channel_id + F (" \" ,"
27382780 " \" device\" :{"
27392781 " \" identifiers\" :[\" " ) + MqttUniqueId + channel_id + F (" \" ],"
@@ -2752,6 +2794,47 @@ void sendMQTTDiscovery(const char *topic, String channel_id) {
27522794 mqttLog (PSTR (" MQTT climate discovery FAILED to send." ));
27532795 }
27542796}
2797+
2798+ #if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
2799+ // Send the MQTT Discovery data for the SHT3X sensor.
2800+ // type must be a String of either KEY_TEMP or KEY_HUMIDITY.
2801+ void sendMQTTDiscoverySensor (const char *topic, String type) {
2802+ String pub_topic = String (topic) + F (" _" ) + type + F (" /config" );
2803+ String uom = " %" ;
2804+ String ha_class = type;
2805+ // XXX Update units of measure for temperature.
2806+ if (type == KEY_TEMP) {
2807+ uom = " °C" ;
2808+ ha_class = " temperature" ;
2809+ }
2810+ if (mqtt_client.publish (
2811+ pub_topic.c_str (), String (
2812+ F (" {"
2813+ " \" name\" :\" " ) + MqttHAName + " _" + type + F (" \" ,"
2814+
2815+ " \" stat_t\" :\" " ) + MqttSensorStat + type + F (" \" ,"
2816+ " \" dev_cla\" :\" " ) + ha_class + F (" \" ,"
2817+ " \" unit_of_meas\" :\" " ) + uom + F (" \" ,"
2818+
2819+ " \" uniq_id\" :\" " ) + MqttUniqueId + type + F (" \" ,"
2820+ " \" device\" :{"
2821+ " \" identifiers\" :[\" " ) + MqttUniqueId + type + F (" \" ],"
2822+ " \" connections\" :[[\" mac\" ,\" " ) + WiFi.macAddress () + F (" \" ]],"
2823+ " \" manufacturer\" :\" IRremoteESP8266\" ,"
2824+ " \" model\" :\" IRMQTTServer\" ,"
2825+ " \" name\" :\" " ) + Hostname + F (" \" ,"
2826+ " \" sw_version\" :\" " _MY_VERSION_ " \" "
2827+ " }"
2828+ " }" )).c_str (), true )) {
2829+ mqttLog (PSTR (" MQTT sensor discovery successful sent." ));
2830+ hasDiscoveryBeenSent = true ;
2831+ lastDiscovery.reset ();
2832+ mqttSentCounter++;
2833+ } else {
2834+ mqttLog (PSTR (" MQTT sensor discovery FAILED to send." ));
2835+ }
2836+ }
2837+ #endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE
27552838#endif // MQTT_DISCOVERY_ENABLE
27562839#endif // MQTT_ENABLE
27572840
@@ -2820,6 +2903,29 @@ void loop(void) {
28202903 }
28212904 // Periodically send all of the climate state via MQTT.
28222905 doBroadcast (&lastBroadcast, kBroadcastPeriodMs , climate, false , false );
2906+ #if SHT3X_SUPPORT
2907+ // Check if it's time to read the SHT3x sensor.
2908+ if (statSensorReadTime.elapsed () > SHT3X_CHECK_FREQ * 1000 ) {
2909+ byte result = TemperatureSensor.get ();
2910+ if (result == 0 ) {
2911+ // Success
2912+ float temp = TemperatureSensor.cTemp ;
2913+ // XXX Convert units
2914+ float humidity = TemperatureSensor.humidity ;
2915+ // Publish the temp and humidity to MQTT.
2916+ String mqttTempTopic = MqttSensorStat + KEY_TEMP;
2917+ String mqttHumidityTopic = MqttSensorStat + KEY_HUMIDITY;
2918+ mqtt_client.publish (mqttTempTopic.c_str (), String (temp).c_str ());
2919+ mqtt_client.publish (mqttHumidityTopic.c_str (),
2920+ String (humidity).c_str ());
2921+ } else {
2922+ // Error
2923+ mqttLog ((String (F (" SHT3x sensor read error: " )) +
2924+ String (result)).c_str ());
2925+ }
2926+ statSensorReadTime.reset ();
2927+ }
2928+ #endif // SHT3X_SUPPORT
28232929 }
28242930#endif // MQTT_ENABLE
28252931#if IR_RX
0 commit comments