Apply temphum correction

This commit is contained in:
samuelbles07
2025-01-24 09:56:01 +07:00
parent 1666923ab3
commit af16c1c060
4 changed files with 50 additions and 29 deletions

View File

@ -137,11 +137,15 @@ String OpenMetrics::getPayload(void) {
/** Get temperature and humidity compensated */
if (ag->isOne()) {
atmpCompensated = _temp;
ahumCompensated = _hum;
atmpCompensated = round(measure.getCorrectedTempHum(Measurements::Temperature));
ahumCompensated = round(measure.getCorrectedTempHum(Measurements::Humidity));
} else {
atmpCompensated = ag->pms5003t_1.compensateTemp(_temp);
ahumCompensated = ag->pms5003t_1.compensateHum(_hum);
atmpCompensated = round((measure.getCorrectedTempHum(Measurements::Temperature, 1) +
measure.getCorrectedTempHum(Measurements::Temperature, 2)) /
2.0f);
ahumCompensated = round((measure.getCorrectedTempHum(Measurements::Humidity, 1) +
measure.getCorrectedTempHum(Measurements::Humidity, 2)) /
2.0f);
}
// Add measurements that valid to the metrics

View File

@ -12,7 +12,7 @@
*/
void OledDisplay::showTempHum(bool hasStatus, char *buf, int buf_size) {
/** Temperature */
float temp = value.getAverage(Measurements::Temperature);
float temp = value.getCorrectedTempHum(Measurements::Temperature, 1);
if (utils::isValidTemperature(temp)) {
float t = 0.0f;
if (config.isTemperatureUnitInF()) {
@ -44,7 +44,7 @@ void OledDisplay::showTempHum(bool hasStatus, char *buf, int buf_size) {
DISP()->drawUTF8(1, 10, buf);
/** Show humidity */
int rhum = round(value.getAverage(Measurements::Humidity));
int rhum = round(value.getCorrectedTempHum(Measurements::Humidity, 1));
if (utils::isValidHumidity(rhum)) {
snprintf(buf, buf_size, "%d%%", rhum);
} else {
@ -389,7 +389,7 @@ void OledDisplay::showDashboard(const char *status) {
ag->display.setText(strBuf);
/** Set temperature and humidity */
float temp = value.getAverage(Measurements::Temperature);
float temp = value.getCorrectedTempHum(Measurements::Temperature, 1);
if (utils::isValidTemperature(temp)) {
if (config.isTemperatureUnitInF()) {
snprintf(strBuf, sizeof(strBuf), "T:%0.1f F", utils::degreeC_To_F(temp));
@ -407,7 +407,7 @@ void OledDisplay::showDashboard(const char *status) {
ag->display.setCursor(0, 24);
ag->display.setText(strBuf);
int rhum = round(value.getAverage(Measurements::Humidity));
int rhum = round(value.getCorrectedTempHum(Measurements::Humidity, 1));
if (utils::isValidHumidity(rhum)) {
snprintf(strBuf, sizeof(strBuf), "H:%d %%", rhum);
} else {

View File

@ -551,9 +551,12 @@ float Measurements::getCorrectedTempHum(MeasurementType type, int ch, bool force
switch (type) {
case Temperature: {
rawValue = _temperature[ch].update.avg;
Configuration::TempHumCorrection tmp = config.getTempCorrection();
if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_AG_PMS5003T_2024 || forceCorrection) {
// Apply 'standard' correction if its defined or correction forced
if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_AG_PMS5003T_2024) {
return ag->pms5003t_1.compensateTemp(rawValue);
} else if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_NONE && forceCorrection) {
return ag->pms5003t_1.compensateTemp(rawValue);
}
@ -564,9 +567,12 @@ float Measurements::getCorrectedTempHum(MeasurementType type, int ch, bool force
}
case Humidity: {
rawValue = _humidity[ch].update.avg;
Configuration::TempHumCorrection tmp = config.getHumCorrection();
if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_AG_PMS5003T_2024 || forceCorrection) {
// Apply 'standard' correction if its defined or correction forced
if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_AG_PMS5003T_2024) {
return ag->pms5003t_1.compensateHum(rawValue);
} else if (tmp.algorithm == TempHumCorrectionAlgorithm::CA_TH_NONE && forceCorrection) {
return ag->pms5003t_1.compensateHum(rawValue);
}
@ -589,6 +595,7 @@ float Measurements::getCorrectedTempHum(MeasurementType type, int ch, bool force
// Custom correction constants
float corrected = (rawValue * correction.scalingFactor) + correction.intercept;
Serial.println("Custom correction applied");
return corrected;
}
@ -747,14 +754,14 @@ JSONVar Measurements::buildIndoor(bool localServer) {
if (utils::isValidTemperature(_temperature[0].update.avg)) {
indoor[json_prop_temp] = ag->round2(_temperature[0].update.avg);
if (localServer) {
indoor[json_prop_tempCompensated] = ag->round2(_temperature[0].update.avg);
indoor[json_prop_tempCompensated] = ag->round2(getCorrectedTempHum(Temperature));
}
}
// Add humidity
if (utils::isValidHumidity(_humidity[0].update.avg)) {
indoor[json_prop_rhum] = ag->round2(_humidity[0].update.avg);
if (localServer) {
indoor[json_prop_rhumCompensated] = ag->round2(_humidity[0].update.avg);
indoor[json_prop_rhumCompensated] = ag->round2(getCorrectedTempHum(Humidity));
}
}
}
@ -834,7 +841,7 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
pms[json_prop_temp] = ag->round2(_temperature[ch].update.avg);
// Compensate temperature when flag is set
if (compensate) {
_vc = ag->pms5003t_1.compensateTemp(_temperature[ch].update.avg);
_vc = getCorrectedTempHum(Temperature, ch, true);
if (utils::isValidTemperature(_vc)) {
pms[json_prop_tempCompensated] = ag->round2(_vc);
}
@ -845,8 +852,8 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
pms[json_prop_rhum] = ag->round2(_humidity[ch].update.avg);
// Compensate relative humidity when flag is set
if (compensate) {
_vc = ag->pms5003t_1.compensateHum(_humidity[ch].update.avg);
if (utils::isValidTemperature(_vc)) {
_vc = getCorrectedTempHum(Humidity, ch, true);
if (utils::isValidHumidity(_vc)) {
pms[json_prop_rhumCompensated] = ag->round2(_vc);
}
}
@ -1031,10 +1038,10 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate both temperature channel
float temp = ag->pms5003t_1.compensateTemp(temperature);
float temp1 = ag->pms5003t_1.compensateTemp(_temperature[0].update.avg);
float temp2 = ag->pms5003t_2.compensateTemp(_temperature[1].update.avg);
pms[json_prop_tempCompensated] = ag->round2(temp);
float temp1 = getCorrectedTempHum(Temperature, 1, true);
float temp2 = getCorrectedTempHum(Temperature, 2, true);
float tempAverage = (temp1 + temp2) / 2.0f;
pms[json_prop_tempCompensated] = ag->round2(tempAverage);
pms["channels"]["1"][json_prop_tempCompensated] = ag->round2(temp1);
pms["channels"]["2"][json_prop_tempCompensated] = ag->round2(temp2);
}
@ -1045,7 +1052,7 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate channel 1
float temp1 = ag->pms5003t_1.compensateTemp(_temperature[0].update.avg);
float temp1 = getCorrectedTempHum(Temperature, 1, true);
pms[json_prop_tempCompensated] = ag->round2(temp1);
pms["channels"]["1"][json_prop_tempCompensated] = ag->round2(temp1);
}
@ -1056,7 +1063,7 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate channel 2
float temp2 = ag->pms5003t_2.compensateTemp(_temperature[1].update.avg);
float temp2 = getCorrectedTempHum(Temperature, 2, true);
pms[json_prop_tempCompensated] = ag->round2(temp2);
pms["channels"]["2"][json_prop_tempCompensated] = ag->round2(temp2);
}
@ -1072,10 +1079,10 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate both humidity channel
float hum = ag->pms5003t_1.compensateHum(humidity);
float hum1 = ag->pms5003t_1.compensateHum(_humidity[0].update.avg);
float hum2 = ag->pms5003t_2.compensateHum(_humidity[1].update.avg);
pms[json_prop_rhumCompensated] = ag->round2(hum);
float hum1 = getCorrectedTempHum(Humidity, 1, true);
float hum2 = getCorrectedTempHum(Humidity, 2, true);
float humAverage = (hum1 + hum2) / 2.0f;
pms[json_prop_rhumCompensated] = ag->round2(humAverage);
pms["channels"]["1"][json_prop_rhumCompensated] = ag->round2(hum1);
pms["channels"]["2"][json_prop_rhumCompensated] = ag->round2(hum2);
}
@ -1086,7 +1093,7 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate humidity channel 1
float hum1 = ag->pms5003t_1.compensateHum(_humidity[0].update.avg);
float hum1 = getCorrectedTempHum(Humidity, 1, true);
pms[json_prop_rhumCompensated] = ag->round2(hum1);
pms["channels"]["1"][json_prop_rhumCompensated] = ag->round2(hum1);
}
@ -1097,7 +1104,7 @@ JSONVar Measurements::buildPMS(int ch, bool allCh, bool withTempHum, bool compen
if (compensate) {
// Compensate humidity channel 2
float hum2 = ag->pms5003t_2.compensateHum(_humidity[1].update.avg);
float hum2 = getCorrectedTempHum(Humidity, 2, true);
pms[json_prop_rhumCompensated] = ag->round2(hum2);
pms["channels"]["2"][json_prop_rhumCompensated] = ag->round2(hum2);
}

View File

@ -125,6 +125,16 @@ public:
*/
float getAverage(MeasurementType type, int ch = 1);
/**
* @brief Get Temperature or Humidity correction value
* Only if correction is applied from configuration or forceCorrection is True
*
* @param type measurement type either Temperature or Humidity
* @param ch target type value channel
* @param forceCorrection force using correction even though config correction is not applied, but
* not for CUSTOM
* @return correction value
*/
float getCorrectedTempHum(MeasurementType type, int ch = 1, bool forceCorrection = false);
/**