mirror of
https://github.com/esphome/esphome.git
synced 2024-12-01 13:13:54 +01:00
sen5x fix temperature compensation and gas tuning (#4901)
This commit is contained in:
parent
b809d02846
commit
8738cef5a3
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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_,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
Loading…
Reference in New Issue
Block a user