mirror of
https://github.com/esphome/esphome.git
synced 2026-10-22 13:56:10 +00:00
84 lines
2.5 KiB
C++
84 lines
2.5 KiB
C++
|
|
#include "dew_point.h"
|
|
|
|
namespace esphome::dew_point {
|
|
|
|
ESPHOME_LOG_TAG(TAG, "dew_point.sensor");
|
|
|
|
void DewPointComponent::setup() {
|
|
// Register callbacks for sensor updates
|
|
if (this->temperature_sensor_ != nullptr) {
|
|
this->temperature_sensor_->add_on_state_callback([this](float state) {
|
|
this->temperature_value_ = state;
|
|
this->enable_loop();
|
|
});
|
|
// Get initial value
|
|
if (this->temperature_sensor_->has_state()) {
|
|
this->temperature_value_ = this->temperature_sensor_->get_state();
|
|
}
|
|
}
|
|
|
|
if (this->humidity_sensor_ != nullptr) {
|
|
this->humidity_sensor_->add_on_state_callback([this](float state) {
|
|
this->humidity_value_ = state;
|
|
this->enable_loop();
|
|
});
|
|
// Get initial value
|
|
if (this->humidity_sensor_->has_state()) {
|
|
this->humidity_value_ = this->humidity_sensor_->get_state();
|
|
}
|
|
}
|
|
}
|
|
|
|
void DewPointComponent::dump_config() {
|
|
LOG_SENSOR("", "Dew Point", this);
|
|
ESP_LOGCONFIG(TAG,
|
|
"Sources\n"
|
|
" Temperature: '%s'\n"
|
|
" Humidity: '%s'",
|
|
LOG_STR_ARG(this->temperature_sensor_->get_log_name()),
|
|
LOG_STR_ARG(this->humidity_sensor_->get_log_name()));
|
|
}
|
|
|
|
float DewPointComponent::get_setup_priority() const { return setup_priority::DATA; }
|
|
|
|
void DewPointComponent::loop() {
|
|
// Only run once
|
|
this->disable_loop();
|
|
|
|
// Check if we have valid values for both sensors
|
|
if (std::isnan(this->temperature_value_) || std::isnan(this->humidity_value_)) {
|
|
ESP_LOGW(TAG, "Temperature or humidity value is NaN, skipping calculation");
|
|
this->publish_state(NAN);
|
|
return;
|
|
}
|
|
|
|
// Check for valid humidity range
|
|
if (this->humidity_value_ <= 0.0f || this->humidity_value_ > 100.0f) {
|
|
ESP_LOGW(TAG, "Humidity value out of range (0-100): %.2f", this->humidity_value_);
|
|
this->publish_state(NAN);
|
|
return;
|
|
}
|
|
|
|
// Magnus formula constants
|
|
const float a{17.625f};
|
|
const float b{243.04f};
|
|
|
|
// Calculate dew point using Magnus formula
|
|
// Td = (b * alpha) / (a - alpha)
|
|
// where alpha = ln(RH/100) + (a * T) / (b + T)
|
|
|
|
const float alpha{std::log(this->humidity_value_ / 100.0f) +
|
|
(a * this->temperature_value_) / (b + this->temperature_value_)};
|
|
|
|
const float dew_point{(b * alpha) / (a - alpha)};
|
|
|
|
// Publish the calculated dew point
|
|
this->publish_state(dew_point);
|
|
|
|
ESP_LOGD(TAG, "'%s' >> %.1f°C (T: %.1f°C, RH: %.1f%%)", LOG_STR_ARG(this->get_log_name()), dew_point,
|
|
this->temperature_value_, this->humidity_value_);
|
|
}
|
|
|
|
} // namespace esphome::dew_point
|