Files
deckenlampe/main/feature_dht.cpp
T

102 lines
3.1 KiB
C++
Raw Normal View History

2021-07-15 13:17:07 +02:00
#include "feature_dht.h"
// esp-idf includes
#include <esp_log.h>
// 3rdparty lib includes
#include <fmt/core.h>
#include <DHT.h>
// local includes
#include "myconfig.h"
#include "mymqtt.h"
#include "delayedconstruction.h"
using namespace std::chrono_literals;
namespace deckenlampe {
std::optional<DhtValue> lastDhtValue;
espchrono::millis_clock::time_point last_dht11_temperature_pub;
espchrono::millis_clock::time_point last_dht11_humidity_pub;
bool dhtInitialized{};
namespace {
constexpr const char * const TAG = "DHT";
cpputils::DelayedConstruction<DHT> dht;
espchrono::millis_clock::time_point last_dht11_readout;
} // namespace
void init_dht()
{
2021-07-15 16:38:04 +02:00
if (!config::enable_dht.value())
2021-07-15 13:17:07 +02:00
return;
2021-08-01 15:17:15 +02:00
dht.construct(config::pins_dht.value(), config::dht_11_or_22.value() ? DHT22 : DHT11);
2021-07-15 13:17:07 +02:00
ESP_LOGI(TAG, "calling dht.begin()...");
dhtInitialized = dht->begin();
ESP_LOGI(TAG, "finished with %s", dhtInitialized ? "true" : "false");
}
void update_dht()
{
2021-07-15 16:38:04 +02:00
if (!config::enable_dht.value())
2021-07-15 13:17:07 +02:00
return;
2021-08-06 15:50:44 +02:00
if (dhtInitialized)
{
2021-07-15 13:17:07 +02:00
if (espchrono::ago(last_dht11_readout) < 5s)
return;
last_dht11_readout = espchrono::millis_clock::now();
2021-08-06 15:50:44 +02:00
if (const auto data = dht->read())
{
2021-07-15 13:17:07 +02:00
DhtValue dhtValue {
.timestamp = espchrono::millis_clock::now(),
.temperature = dht->readTemperature(*data),
.humidity = dht->readHumidity(*data)
};
ESP_LOGI(TAG, "read dht temperature: %.1f C", dhtValue.temperature);
ESP_LOGI(TAG, "read dht humidity: %.1f %%", dhtValue.humidity);
2021-08-06 15:50:44 +02:00
if (mqttConnected)
{
2021-07-15 13:17:07 +02:00
if (!lastDhtValue)
2021-07-15 16:38:04 +02:00
mqttVerbosePub(config::topic_dht11_availability.value(), "online", 0, 1);
2021-08-06 15:50:44 +02:00
if (!lastDhtValue || espchrono::ago(last_dht11_temperature_pub) >= config::valueUpdateInterval.value())
{
2021-07-15 16:38:04 +02:00
if (mqttVerbosePub(config::topic_dht11_temperature.value(), fmt::format("{:.1f}", dhtValue.temperature), 0, 1) >= 0)
2021-07-15 13:17:07 +02:00
last_dht11_temperature_pub = espchrono::millis_clock::now();
}
2021-08-06 15:50:44 +02:00
if (!lastDhtValue || espchrono::ago(last_dht11_humidity_pub) >= config::valueUpdateInterval.value())
{
2021-07-15 16:38:04 +02:00
if (mqttVerbosePub(config::topic_dht11_humidity.value(), fmt::format("{:.1f}", dhtValue.humidity), 0, 1) >= 0)
2021-07-15 13:17:07 +02:00
last_dht11_humidity_pub = espchrono::millis_clock::now();
}
}
lastDhtValue = dhtValue;
2021-08-06 15:50:44 +02:00
}
else
{
2021-07-15 13:17:07 +02:00
ESP_LOGW(TAG, "dht failed");
goto dhtOffline;
}
2021-08-06 15:50:44 +02:00
}
else
{
2021-07-15 13:17:07 +02:00
dhtOffline:
2021-08-06 15:50:44 +02:00
if (lastDhtValue && espchrono::ago(lastDhtValue->timestamp) >= config::availableTimeoutTime.value())
{
2021-07-15 13:17:07 +02:00
ESP_LOGW(TAG, "dht timeouted");
2021-07-15 14:12:01 +02:00
if (mqttConnected)
2021-07-15 16:38:04 +02:00
mqttVerbosePub(config::topic_dht11_availability.value(), "offline", 0, 1);
2021-07-15 13:17:07 +02:00
lastDhtValue = std::nullopt;
}
}
}
} // namespace deckenlampe