sen5x fix temperature compensation and gas tuning (#4901)

This commit is contained in:
matt7aylor 2023-11-22 19:48:38 +00:00 committed by GitHub
parent b809d02846
commit 8738cef5a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 21 deletions

View File

@ -201,13 +201,19 @@ void SEN5XComponent::setup() {
ESP_LOGE(TAG, "Failed to read RHT Acceleration mode"); 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()); 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()); 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()); this->write_temperature_compensation_(this->temperature_compensation_.value());
delay(20);
}
// Finally start sensor measurements // Finally start sensor measurements
auto cmd = SEN5X_CMD_START_MEASUREMENTS_RHT_ONLY; auto cmd = SEN5X_CMD_START_MEASUREMENTS_RHT_ONLY;

View File

@ -41,8 +41,8 @@ struct GasTuning {
}; };
struct TemperatureCompensation { struct TemperatureCompensation {
uint16_t offset; int16_t offset;
uint16_t normalized_offset_slope; int16_t normalized_offset_slope;
uint16_t time_constant; 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, 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 learning_time_gain_hours, uint16_t gating_max_duration_minutes,
uint16_t std_initial, uint16_t gain_factor) { uint16_t std_initial, uint16_t gain_factor) {
voc_tuning_params_.value().index_offset = index_offset; GasTuning tuning_params;
voc_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours; tuning_params.index_offset = index_offset;
voc_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours; tuning_params.learning_time_offset_hours = learning_time_offset_hours;
voc_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes; tuning_params.learning_time_gain_hours = learning_time_gain_hours;
voc_tuning_params_.value().std_initial = std_initial; tuning_params.gating_max_duration_minutes = gating_max_duration_minutes;
voc_tuning_params_.value().gain_factor = gain_factor; 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, 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 learning_time_gain_hours, uint16_t gating_max_duration_minutes,
uint16_t gain_factor) { uint16_t gain_factor) {
nox_tuning_params_.value().index_offset = index_offset; GasTuning tuning_params;
nox_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours; tuning_params.index_offset = index_offset;
nox_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours; tuning_params.learning_time_offset_hours = learning_time_offset_hours;
nox_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes; tuning_params.learning_time_gain_hours = learning_time_gain_hours;
nox_tuning_params_.value().std_initial = 50; tuning_params.gating_max_duration_minutes = gating_max_duration_minutes;
nox_tuning_params_.value().gain_factor = gain_factor; 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) { void set_temperature_compensation(float offset, float normalized_offset_slope, uint16_t time_constant) {
temperature_compensation_.value().offset = offset * 200; TemperatureCompensation temp_comp;
temperature_compensation_.value().normalized_offset_slope = normalized_offset_slope * 100; temp_comp.offset = offset * 200;
temperature_compensation_.value().time_constant = time_constant; temp_comp.normalized_offset_slope = normalized_offset_slope * 10000;
temp_comp.time_constant = time_constant;
temperature_compensation_ = temp_comp;
} }
bool start_fan_cleaning(); bool start_fan_cleaning();

View File

@ -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 = ( CONFIG_SCHEMA = (
cv.Schema( cv.Schema(
{ {
@ -151,7 +160,9 @@ CONFIG_SCHEMA = (
cv.Optional(CONF_TEMPERATURE_COMPENSATION): cv.Schema( cv.Optional(CONF_TEMPERATURE_COMPENSATION): cv.Schema(
{ {
cv.Optional(CONF_OFFSET, default=0): cv.float_, 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_, cv.Optional(CONF_TIME_CONSTANT, default=0): cv.int_,
} }
), ),