mirror of
https://github.com/esphome/esphome.git
synced 2025-07-28 14:16:40 +00:00
[sen5x] Fix validation for values read from hardware (#8769)
This commit is contained in:
parent
fefcb45e1f
commit
e87b659483
@ -25,6 +25,10 @@ static const uint16_t SEN5X_CMD_TEMPERATURE_COMPENSATION = 0x60B2;
|
|||||||
static const uint16_t SEN5X_CMD_VOC_ALGORITHM_STATE = 0x6181;
|
static const uint16_t SEN5X_CMD_VOC_ALGORITHM_STATE = 0x6181;
|
||||||
static const uint16_t SEN5X_CMD_VOC_ALGORITHM_TUNING = 0x60D0;
|
static const uint16_t SEN5X_CMD_VOC_ALGORITHM_TUNING = 0x60D0;
|
||||||
|
|
||||||
|
static const int8_t SEN5X_INDEX_SCALE_FACTOR = 10; // used for VOC and NOx index values
|
||||||
|
static const int8_t SEN5X_MIN_INDEX_VALUE = 1 * SEN5X_INDEX_SCALE_FACTOR; // must be adjusted by the scale factor
|
||||||
|
static const int16_t SEN5X_MAX_INDEX_VALUE = 500 * SEN5X_INDEX_SCALE_FACTOR; // must be adjusted by the scale factor
|
||||||
|
|
||||||
void SEN5XComponent::setup() {
|
void SEN5XComponent::setup() {
|
||||||
ESP_LOGCONFIG(TAG, "Setting up sen5x...");
|
ESP_LOGCONFIG(TAG, "Setting up sen5x...");
|
||||||
|
|
||||||
@ -88,8 +92,9 @@ void SEN5XComponent::setup() {
|
|||||||
product_name_.push_back(current_char);
|
product_name_.push_back(current_char);
|
||||||
// second char
|
// second char
|
||||||
current_char = *current_int & 0xFF;
|
current_char = *current_int & 0xFF;
|
||||||
if (current_char)
|
if (current_char) {
|
||||||
product_name_.push_back(current_char);
|
product_name_.push_back(current_char);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
current_int++;
|
current_int++;
|
||||||
} while (current_char && --max);
|
} while (current_char && --max);
|
||||||
@ -271,10 +276,10 @@ void SEN5XComponent::dump_config() {
|
|||||||
ESP_LOGCONFIG(TAG, " Low RH/T acceleration mode");
|
ESP_LOGCONFIG(TAG, " Low RH/T acceleration mode");
|
||||||
break;
|
break;
|
||||||
case MEDIUM_ACCELERATION:
|
case MEDIUM_ACCELERATION:
|
||||||
ESP_LOGCONFIG(TAG, " Medium RH/T accelertion mode");
|
ESP_LOGCONFIG(TAG, " Medium RH/T acceleration mode");
|
||||||
break;
|
break;
|
||||||
case HIGH_ACCELERATION:
|
case HIGH_ACCELERATION:
|
||||||
ESP_LOGCONFIG(TAG, " High RH/T accelertion mode");
|
ESP_LOGCONFIG(TAG, " High RH/T acceleration mode");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -337,47 +342,61 @@ void SEN5XComponent::update() {
|
|||||||
ESP_LOGD(TAG, "read data error (%d)", this->last_error_);
|
ESP_LOGD(TAG, "read data error (%d)", this->last_error_);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
float pm_1_0 = measurements[0] / 10.0;
|
|
||||||
if (measurements[0] == 0xFFFF)
|
|
||||||
pm_1_0 = NAN;
|
|
||||||
float pm_2_5 = measurements[1] / 10.0;
|
|
||||||
if (measurements[1] == 0xFFFF)
|
|
||||||
pm_2_5 = NAN;
|
|
||||||
float pm_4_0 = measurements[2] / 10.0;
|
|
||||||
if (measurements[2] == 0xFFFF)
|
|
||||||
pm_4_0 = NAN;
|
|
||||||
float pm_10_0 = measurements[3] / 10.0;
|
|
||||||
if (measurements[3] == 0xFFFF)
|
|
||||||
pm_10_0 = NAN;
|
|
||||||
float humidity = measurements[4] / 100.0;
|
|
||||||
if (measurements[4] == 0xFFFF)
|
|
||||||
humidity = NAN;
|
|
||||||
float temperature = (int16_t) measurements[5] / 200.0;
|
|
||||||
if (measurements[5] == 0xFFFF)
|
|
||||||
temperature = NAN;
|
|
||||||
float voc = measurements[6] / 10.0;
|
|
||||||
if (measurements[6] == 0xFFFF)
|
|
||||||
voc = NAN;
|
|
||||||
float nox = measurements[7] / 10.0;
|
|
||||||
if (measurements[7] == 0xFFFF)
|
|
||||||
nox = NAN;
|
|
||||||
|
|
||||||
if (this->pm_1_0_sensor_ != nullptr)
|
ESP_LOGVV(TAG, "pm_1_0 = 0x%.4x", measurements[0]);
|
||||||
|
float pm_1_0 = measurements[0] == UINT16_MAX ? NAN : measurements[0] / 10.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "pm_2_5 = 0x%.4x", measurements[1]);
|
||||||
|
float pm_2_5 = measurements[1] == UINT16_MAX ? NAN : measurements[1] / 10.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "pm_4_0 = 0x%.4x", measurements[2]);
|
||||||
|
float pm_4_0 = measurements[2] == UINT16_MAX ? NAN : measurements[2] / 10.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "pm_10_0 = 0x%.4x", measurements[3]);
|
||||||
|
float pm_10_0 = measurements[3] == UINT16_MAX ? NAN : measurements[3] / 10.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "humidity = 0x%.4x", measurements[4]);
|
||||||
|
float humidity = measurements[4] == INT16_MAX ? NAN : static_cast<int16_t>(measurements[4]) / 100.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "temperature = 0x%.4x", measurements[5]);
|
||||||
|
float temperature = measurements[5] == INT16_MAX ? NAN : static_cast<int16_t>(measurements[5]) / 200.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "voc = 0x%.4x", measurements[6]);
|
||||||
|
int16_t voc_idx = static_cast<int16_t>(measurements[6]);
|
||||||
|
float voc = (voc_idx < SEN5X_MIN_INDEX_VALUE || voc_idx > SEN5X_MAX_INDEX_VALUE)
|
||||||
|
? NAN
|
||||||
|
: static_cast<float>(voc_idx) / 10.0f;
|
||||||
|
|
||||||
|
ESP_LOGVV(TAG, "nox = 0x%.4x", measurements[7]);
|
||||||
|
int16_t nox_idx = static_cast<int16_t>(measurements[7]);
|
||||||
|
float nox = (nox_idx < SEN5X_MIN_INDEX_VALUE || nox_idx > SEN5X_MAX_INDEX_VALUE)
|
||||||
|
? NAN
|
||||||
|
: static_cast<float>(nox_idx) / 10.0f;
|
||||||
|
|
||||||
|
if (this->pm_1_0_sensor_ != nullptr) {
|
||||||
this->pm_1_0_sensor_->publish_state(pm_1_0);
|
this->pm_1_0_sensor_->publish_state(pm_1_0);
|
||||||
if (this->pm_2_5_sensor_ != nullptr)
|
}
|
||||||
|
if (this->pm_2_5_sensor_ != nullptr) {
|
||||||
this->pm_2_5_sensor_->publish_state(pm_2_5);
|
this->pm_2_5_sensor_->publish_state(pm_2_5);
|
||||||
if (this->pm_4_0_sensor_ != nullptr)
|
}
|
||||||
|
if (this->pm_4_0_sensor_ != nullptr) {
|
||||||
this->pm_4_0_sensor_->publish_state(pm_4_0);
|
this->pm_4_0_sensor_->publish_state(pm_4_0);
|
||||||
if (this->pm_10_0_sensor_ != nullptr)
|
}
|
||||||
|
if (this->pm_10_0_sensor_ != nullptr) {
|
||||||
this->pm_10_0_sensor_->publish_state(pm_10_0);
|
this->pm_10_0_sensor_->publish_state(pm_10_0);
|
||||||
if (this->temperature_sensor_ != nullptr)
|
}
|
||||||
|
if (this->temperature_sensor_ != nullptr) {
|
||||||
this->temperature_sensor_->publish_state(temperature);
|
this->temperature_sensor_->publish_state(temperature);
|
||||||
if (this->humidity_sensor_ != nullptr)
|
}
|
||||||
|
if (this->humidity_sensor_ != nullptr) {
|
||||||
this->humidity_sensor_->publish_state(humidity);
|
this->humidity_sensor_->publish_state(humidity);
|
||||||
if (this->voc_sensor_ != nullptr)
|
}
|
||||||
|
if (this->voc_sensor_ != nullptr) {
|
||||||
this->voc_sensor_->publish_state(voc);
|
this->voc_sensor_->publish_state(voc);
|
||||||
if (this->nox_sensor_ != nullptr)
|
}
|
||||||
|
if (this->nox_sensor_ != nullptr) {
|
||||||
this->nox_sensor_->publish_state(nox);
|
this->nox_sensor_->publish_state(nox);
|
||||||
|
}
|
||||||
this->status_clear_warning();
|
this->status_clear_warning();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user