mirror of
https://github.com/esphome/esphome.git
synced 2024-12-02 11:44:13 +01:00
b29cc58144
* Import Absolute Humidity component https://PigLab.ReaperLegion.net/home-automation/hass/esphome/custom-components/absolute-humidity * Fix terminology, add some docstrings * Switch from double to float https://github.com/esphome/esphome/pull/4519#pullrequestreview-1327615169 The additional precision doesn't matter in practice. * Address code review suggestions * Lint code
76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/components/sensor/sensor.h"
|
|
|
|
namespace esphome {
|
|
namespace absolute_humidity {
|
|
|
|
/// Enum listing all implemented saturation vapor pressure equations.
|
|
enum SaturationVaporPressureEquation {
|
|
BUCK,
|
|
TETENS,
|
|
WOBUS,
|
|
};
|
|
|
|
/// This class implements calculation of absolute humidity from temperature and relative humidity.
|
|
class AbsoluteHumidityComponent : public sensor::Sensor, public Component {
|
|
public:
|
|
AbsoluteHumidityComponent() = default;
|
|
|
|
void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; }
|
|
void set_humidity_sensor(sensor::Sensor *humidity_sensor) { this->humidity_sensor_ = humidity_sensor; }
|
|
void set_equation(SaturationVaporPressureEquation equation) { this->equation_ = equation; }
|
|
|
|
void setup() override;
|
|
void dump_config() override;
|
|
float get_setup_priority() const override;
|
|
void loop() override;
|
|
|
|
protected:
|
|
void temperature_callback_(float state) {
|
|
this->next_update_ = true;
|
|
this->temperature_ = state;
|
|
}
|
|
void humidity_callback_(float state) {
|
|
this->next_update_ = true;
|
|
this->humidity_ = state;
|
|
}
|
|
|
|
/** Buck equation for saturation vapor pressure in kPa.
|
|
*
|
|
* @param temperature_c Air temperature in °C.
|
|
*/
|
|
static float es_buck(float temperature_c);
|
|
/** Tetens equation for saturation vapor pressure in kPa.
|
|
*
|
|
* @param temperature_c Air temperature in °C.
|
|
*/
|
|
static float es_tetens(float temperature_c);
|
|
/** Wobus equation for saturation vapor pressure in kPa.
|
|
*
|
|
* @param temperature_c Air temperature in °C.
|
|
*/
|
|
static float es_wobus(float temperature_c);
|
|
|
|
/** Calculate vapor density (absolute humidity) in g/m³.
|
|
*
|
|
* @param es Saturation vapor pressure in kPa.
|
|
* @param hr Relative humidity 0 to 1.
|
|
* @param ta Absolute temperature in K.
|
|
* @param heater_duration The duration in ms that the heater should turn on for when measuring.
|
|
*/
|
|
static float vapor_density(float es, float hr, float ta);
|
|
|
|
sensor::Sensor *temperature_sensor_{nullptr};
|
|
sensor::Sensor *humidity_sensor_{nullptr};
|
|
|
|
bool next_update_{false};
|
|
|
|
float temperature_{NAN};
|
|
float humidity_{NAN};
|
|
SaturationVaporPressureEquation equation_;
|
|
};
|
|
|
|
} // namespace absolute_humidity
|
|
} // namespace esphome
|