mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 06:58:11 +01:00
sen5x fix temperature compensation and gas tuning (#4901)
This commit is contained in:
parent
b809d02846
commit
8738cef5a3
3 changed files with 44 additions and 21 deletions
|
@ -201,13 +201,19 @@ void SEN5XComponent::setup() {
|
|||
ESP_LOGE(TAG, "Failed to read RHT Acceleration mode");
|
||||
}
|
||||
}
|
||||
if (this->voc_tuning_params_.has_value())
|
||||
if (this->voc_tuning_params_.has_value()) {
|
||||
this->write_tuning_parameters_(SEN5X_CMD_VOC_ALGORITHM_TUNING, this->voc_tuning_params_.value());
|
||||
if (this->nox_tuning_params_.has_value())
|
||||
delay(20);
|
||||
}
|
||||
if (this->nox_tuning_params_.has_value()) {
|
||||
this->write_tuning_parameters_(SEN5X_CMD_NOX_ALGORITHM_TUNING, this->nox_tuning_params_.value());
|
||||
delay(20);
|
||||
}
|
||||
|
||||
if (this->temperature_compensation_.has_value())
|
||||
if (this->temperature_compensation_.has_value()) {
|
||||
this->write_temperature_compensation_(this->temperature_compensation_.value());
|
||||
delay(20);
|
||||
}
|
||||
|
||||
// Finally start sensor measurements
|
||||
auto cmd = SEN5X_CMD_START_MEASUREMENTS_RHT_ONLY;
|
||||
|
|
|
@ -41,8 +41,8 @@ struct GasTuning {
|
|||
};
|
||||
|
||||
struct TemperatureCompensation {
|
||||
uint16_t offset;
|
||||
uint16_t normalized_offset_slope;
|
||||
int16_t offset;
|
||||
int16_t normalized_offset_slope;
|
||||
uint16_t time_constant;
|
||||
};
|
||||
|
||||
|
@ -70,27 +70,33 @@ class SEN5XComponent : public PollingComponent, public sensirion_common::Sensiri
|
|||
void set_voc_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
|
||||
uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
|
||||
uint16_t std_initial, uint16_t gain_factor) {
|
||||
voc_tuning_params_.value().index_offset = index_offset;
|
||||
voc_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours;
|
||||
voc_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours;
|
||||
voc_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes;
|
||||
voc_tuning_params_.value().std_initial = std_initial;
|
||||
voc_tuning_params_.value().gain_factor = gain_factor;
|
||||
GasTuning tuning_params;
|
||||
tuning_params.index_offset = index_offset;
|
||||
tuning_params.learning_time_offset_hours = learning_time_offset_hours;
|
||||
tuning_params.learning_time_gain_hours = learning_time_gain_hours;
|
||||
tuning_params.gating_max_duration_minutes = gating_max_duration_minutes;
|
||||
tuning_params.std_initial = std_initial;
|
||||
tuning_params.gain_factor = gain_factor;
|
||||
voc_tuning_params_ = tuning_params;
|
||||
}
|
||||
void set_nox_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
|
||||
uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
|
||||
uint16_t gain_factor) {
|
||||
nox_tuning_params_.value().index_offset = index_offset;
|
||||
nox_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours;
|
||||
nox_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours;
|
||||
nox_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes;
|
||||
nox_tuning_params_.value().std_initial = 50;
|
||||
nox_tuning_params_.value().gain_factor = gain_factor;
|
||||
GasTuning tuning_params;
|
||||
tuning_params.index_offset = index_offset;
|
||||
tuning_params.learning_time_offset_hours = learning_time_offset_hours;
|
||||
tuning_params.learning_time_gain_hours = learning_time_gain_hours;
|
||||
tuning_params.gating_max_duration_minutes = gating_max_duration_minutes;
|
||||
tuning_params.std_initial = 50;
|
||||
tuning_params.gain_factor = gain_factor;
|
||||
nox_tuning_params_ = tuning_params;
|
||||
}
|
||||
void set_temperature_compensation(float offset, float normalized_offset_slope, uint16_t time_constant) {
|
||||
temperature_compensation_.value().offset = offset * 200;
|
||||
temperature_compensation_.value().normalized_offset_slope = normalized_offset_slope * 100;
|
||||
temperature_compensation_.value().time_constant = time_constant;
|
||||
TemperatureCompensation temp_comp;
|
||||
temp_comp.offset = offset * 200;
|
||||
temp_comp.normalized_offset_slope = normalized_offset_slope * 10000;
|
||||
temp_comp.time_constant = time_constant;
|
||||
temperature_compensation_ = temp_comp;
|
||||
}
|
||||
bool start_fan_cleaning();
|
||||
|
||||
|
|
|
@ -88,6 +88,15 @@ GAS_SENSOR = cv.Schema(
|
|||
}
|
||||
)
|
||||
|
||||
|
||||
def float_previously_pct(value):
|
||||
if isinstance(value, str) and "%" in value:
|
||||
raise cv.Invalid(
|
||||
f"The value '{value}' is a percentage. Suggested value: {float(value.strip('%')) / 100}"
|
||||
)
|
||||
return value
|
||||
|
||||
|
||||
CONFIG_SCHEMA = (
|
||||
cv.Schema(
|
||||
{
|
||||
|
@ -151,7 +160,9 @@ CONFIG_SCHEMA = (
|
|||
cv.Optional(CONF_TEMPERATURE_COMPENSATION): cv.Schema(
|
||||
{
|
||||
cv.Optional(CONF_OFFSET, default=0): cv.float_,
|
||||
cv.Optional(CONF_NORMALIZED_OFFSET_SLOPE, default=0): cv.percentage,
|
||||
cv.Optional(CONF_NORMALIZED_OFFSET_SLOPE, default=0): cv.All(
|
||||
float_previously_pct, cv.float_
|
||||
),
|
||||
cv.Optional(CONF_TIME_CONSTANT, default=0): cv.int_,
|
||||
}
|
||||
),
|
||||
|
|
Loading…
Reference in a new issue