Merge remote-tracking branch 'origin/develop' into feature/correct-pm2.5-formula

This commit is contained in:
Phat Nguyen
2024-08-15 08:19:10 +07:00
20 changed files with 584 additions and 262 deletions

View File

@ -233,7 +233,7 @@ void loop() {
static void co2Update(void) { static void co2Update(void) {
int value = ag.s8.getCo2(); int value = ag.s8.getCo2();
if (value >= 0) { if (utils::isValidCO2(value)) {
measurements.CO2 = value; measurements.CO2 = value;
getCO2FailCount = 0; getCO2FailCount = 0;
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2); Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
@ -241,7 +241,7 @@ static void co2Update(void) {
getCO2FailCount++; getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount); Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
if (getCO2FailCount >= 3) { if (getCO2FailCount >= 3) {
measurements.CO2 = -1; measurements.CO2 = utils::getInvalidCO2();
} }
} }
} }
@ -516,10 +516,10 @@ static void updatePm(void) {
pmFailCount++; pmFailCount++;
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed: %d\r\n", pmFailCount);
if (pmFailCount >= 3) { if (pmFailCount >= 3) {
measurements.pm01_1 = -1; measurements.pm01_1 = utils::getInvalidPMS();
measurements.pm25_1 = -1; measurements.pm25_1 = utils::getInvalidPMS();
measurements.pm10_1 = -1; measurements.pm10_1 = utils::getInvalidPMS();
measurements.pm03PCount_1 = -1; measurements.pm03PCount_1 = utils::getInvalidPMS();
} }
} }
} }
@ -564,5 +564,7 @@ static void tempHumUpdate(void) {
} }
} else { } else {
Serial.println("SHT read failed"); Serial.println("SHT read failed");
measurements.Temperature = utils::getInvalidTemperature();
measurements.Humidity = utils::getInvalidHumidity();
} }
} }

View File

@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
add_metric_point("", String(measure.CO2)); add_metric_point("", String(measure.CO2));
} }
float _temp = -1001; float _temp = utils::getInvalidTemperature();
float _hum = -1; float _hum = utils::getInvalidHumidity();
int pm01 = -1; int pm01 = utils::getInvalidPMS();
int pm25 = -1; int pm25 = utils::getInvalidPMS();
int pm10 = -1; int pm10 = utils::getInvalidPMS();
int pm03PCount = -1; int pm03PCount = utils::getInvalidPMS();
int atmpCompensated = -1; int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = -1; int ahumCompensated = utils::getInvalidHumidity();
if (config.hasSensorSHT) { if (config.hasSensorSHT) {
_temp = measure.Temperature; _temp = measure.Temperature;
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorPMS1) { if (config.hasSensorPMS1) {
if (pm01 >= 0) { if (utils::isValidPMS(pm01)) {
add_metric("pm1", add_metric("pm1",
"PM1.0 concentration as measured by the AirGradient PMS " "PM1.0 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm01)); add_metric_point("", String(pm01));
} }
if (pm25 >= 0) { if (utils::isValidPMS(pm25)) {
add_metric("pm2d5", add_metric("pm2d5",
"PM2.5 concentration as measured by the AirGradient PMS " "PM2.5 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm25)); add_metric_point("", String(pm25));
} }
if (pm10 >= 0) { if (utils::isValidPMS(pm10)) {
add_metric("pm10", add_metric("pm10",
"PM10 concentration as measured by the AirGradient PMS " "PM10 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm10)); add_metric_point("", String(pm10));
} }
if (pm03PCount >= 0) { if (utils::isValidPMS03Count(pm03PCount)) {
add_metric("pm0d3", add_metric("pm0d3",
"PM0.3 concentration as measured by the AirGradient PMS " "PM0.3 concentration as measured by the AirGradient PMS "
"sensor, in number of particules per 100 milliliters", "sensor, in number of particules per 100 milliliters",
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorSGP) { if (config.hasSensorSGP) {
if (measure.TVOC >= 0) { if (utils::isValidVOC(measure.TVOC)) {
add_metric("tvoc_index", add_metric("tvoc_index",
"The processed Total Volatile Organic Compounds (TVOC) index " "The processed Total Volatile Organic Compounds (TVOC) index "
"as measured by the AirGradient SGP sensor", "as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOC)); add_metric_point("", String(measure.TVOC));
} }
if (measure.TVOCRaw >= 0) { if (utils::isValidVOC(measure.TVOCRaw)) {
add_metric("tvoc_raw", add_metric("tvoc_raw",
"The raw input value to the Total Volatile Organic Compounds " "The raw input value to the Total Volatile Organic Compounds "
"(TVOC) index as measured by the AirGradient SGP sensor", "(TVOC) index as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOCRaw)); add_metric_point("", String(measure.TVOCRaw));
} }
if (measure.NOx >= 0) { if (utils::isValidNOx(measure.NOx)) {
add_metric("nox_index", add_metric("nox_index",
"The processed Nitrous Oxide (NOx) index as measured by the " "The processed Nitrous Oxide (NOx) index as measured by the "
"AirGradient SGP sensor", "AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.NOx)); add_metric_point("", String(measure.NOx));
} }
if (measure.NOxRaw >= 0) { if (utils::isValidNOx(measure.NOxRaw)) {
add_metric("nox_raw", add_metric("nox_raw",
"The raw input value to the Nitrous Oxide (NOx) index as " "The raw input value to the Nitrous Oxide (NOx) index as "
"measured by the AirGradient SGP sensor", "measured by the AirGradient SGP sensor",
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
} }
} }
if (_temp > -1001) { if (utils::isValidTemperature(_temp)) {
add_metric( add_metric(
"temperature", "temperature",
"The ambient temperature as measured by the AirGradient SHT / PMS " "The ambient temperature as measured by the AirGradient SHT / PMS "
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(_temp)); add_metric_point("", String(_temp));
} }
if (atmpCompensated > -1001) { if (utils::isValidTemperature(atmpCompensated)) {
add_metric("temperature_compensated", add_metric("temperature_compensated",
"The compensated ambient temperature as measured by the " "The compensated ambient temperature as measured by the "
"AirGradient SHT / PMS " "AirGradient SHT / PMS "
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(atmpCompensated)); add_metric_point("", String(atmpCompensated));
} }
if (_hum >= 0) { if (utils::isValidHumidity(_hum)) {
add_metric( add_metric(
"humidity", "humidity",
"The relative humidity as measured by the AirGradient SHT sensor", "The relative humidity as measured by the AirGradient SHT sensor",
"gauge", "percent"); "gauge", "percent");
add_metric_point("", String(_hum)); add_metric_point("", String(_hum));
} }
if (ahumCompensated >= 0) { if (utils::isValidHumidity(ahumCompensated)) {
add_metric("humidity_compensated", add_metric("humidity_compensated",
"The compensated relative humidity as measured by the " "The compensated relative humidity as measured by the "
"AirGradient SHT / PMS sensor", "AirGradient SHT / PMS sensor",

View File

@ -231,7 +231,7 @@ void loop() {
static void co2Update(void) { static void co2Update(void) {
int value = ag.s8.getCo2(); int value = ag.s8.getCo2();
if (value >= 0) { if (utils::isValidCO2(value)) {
measurements.CO2 = value; measurements.CO2 = value;
getCO2FailCount = 0; getCO2FailCount = 0;
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2); Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
@ -239,7 +239,7 @@ static void co2Update(void) {
getCO2FailCount++; getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount); Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
if (getCO2FailCount >= 3) { if (getCO2FailCount >= 3) {
measurements.CO2 = -1; measurements.CO2 = utils::getInvalidCO2();
} }
} }
} }
@ -568,10 +568,10 @@ static void updatePm(void) {
pmFailCount++; pmFailCount++;
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed: %d\r\n", pmFailCount);
if (pmFailCount >= 3) { if (pmFailCount >= 3) {
measurements.pm01_1 = -1; measurements.pm01_1 = utils::getInvalidPMS();
measurements.pm25_1 = -1; measurements.pm25_1 = utils::getInvalidPMS();
measurements.pm10_1 = -1; measurements.pm10_1 = utils::getInvalidPMS();
measurements.pm03PCount_1 = -1; measurements.pm03PCount_1 = utils::getInvalidPMS();
} }
} }
} }
@ -616,5 +616,7 @@ static void tempHumUpdate(void) {
} }
} else { } else {
Serial.println("SHT read failed"); Serial.println("SHT read failed");
measurements.Temperature = utils::getInvalidTemperature();
measurements.Humidity = utils::getInvalidHumidity();
} }
} }

View File

@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
add_metric_point("", String(measure.CO2)); add_metric_point("", String(measure.CO2));
} }
float _temp = -1001; float _temp = utils::getInvalidTemperature();
float _hum = -1; float _hum = utils::getInvalidHumidity();
int pm01 = -1; int pm01 = utils::getInvalidPMS();
int pm25 = -1; int pm25 = utils::getInvalidPMS();
int pm10 = -1; int pm10 = utils::getInvalidPMS();
int pm03PCount = -1; int pm03PCount = utils::getInvalidPMS();
int atmpCompensated = -1; int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = -1; int ahumCompensated = utils::getInvalidHumidity();
if (config.hasSensorSHT) { if (config.hasSensorSHT) {
_temp = measure.Temperature; _temp = measure.Temperature;
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorPMS1) { if (config.hasSensorPMS1) {
if (pm01 >= 0) { if (utils::isValidPMS(pm01)) {
add_metric("pm1", add_metric("pm1",
"PM1.0 concentration as measured by the AirGradient PMS " "PM1.0 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm01)); add_metric_point("", String(pm01));
} }
if (pm25 >= 0) { if (utils::isValidPMS(pm25)) {
add_metric("pm2d5", add_metric("pm2d5",
"PM2.5 concentration as measured by the AirGradient PMS " "PM2.5 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm25)); add_metric_point("", String(pm25));
} }
if (pm10 >= 0) { if (utils::isValidPMS(pm10)) {
add_metric("pm10", add_metric("pm10",
"PM10 concentration as measured by the AirGradient PMS " "PM10 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm10)); add_metric_point("", String(pm10));
} }
if (pm03PCount >= 0) { if (utils::isValidPMS03Count(pm03PCount)) {
add_metric("pm0d3", add_metric("pm0d3",
"PM0.3 concentration as measured by the AirGradient PMS " "PM0.3 concentration as measured by the AirGradient PMS "
"sensor, in number of particules per 100 milliliters", "sensor, in number of particules per 100 milliliters",
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorSGP) { if (config.hasSensorSGP) {
if (measure.TVOC >= 0) { if (utils::isValidVOC(measure.TVOC)) {
add_metric("tvoc_index", add_metric("tvoc_index",
"The processed Total Volatile Organic Compounds (TVOC) index " "The processed Total Volatile Organic Compounds (TVOC) index "
"as measured by the AirGradient SGP sensor", "as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOC)); add_metric_point("", String(measure.TVOC));
} }
if (measure.TVOCRaw >= 0) { if (utils::isValidVOC(measure.TVOCRaw)) {
add_metric("tvoc_raw", add_metric("tvoc_raw",
"The raw input value to the Total Volatile Organic Compounds " "The raw input value to the Total Volatile Organic Compounds "
"(TVOC) index as measured by the AirGradient SGP sensor", "(TVOC) index as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOCRaw)); add_metric_point("", String(measure.TVOCRaw));
} }
if (measure.NOx >= 0) { if (utils::isValidNOx(measure.NOx)) {
add_metric("nox_index", add_metric("nox_index",
"The processed Nitrous Oxide (NOx) index as measured by the " "The processed Nitrous Oxide (NOx) index as measured by the "
"AirGradient SGP sensor", "AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.NOx)); add_metric_point("", String(measure.NOx));
} }
if (measure.NOxRaw >= 0) { if (utils::isValidNOx(measure.NOxRaw)) {
add_metric("nox_raw", add_metric("nox_raw",
"The raw input value to the Nitrous Oxide (NOx) index as " "The raw input value to the Nitrous Oxide (NOx) index as "
"measured by the AirGradient SGP sensor", "measured by the AirGradient SGP sensor",
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
} }
} }
if (_temp > -1001) { if (utils::isValidTemperature(_temp)) {
add_metric( add_metric(
"temperature", "temperature",
"The ambient temperature as measured by the AirGradient SHT / PMS " "The ambient temperature as measured by the AirGradient SHT / PMS "
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(_temp)); add_metric_point("", String(_temp));
} }
if (atmpCompensated > -1001) { if (utils::isValidTemperature(atmpCompensated)) {
add_metric("temperature_compensated", add_metric("temperature_compensated",
"The compensated ambient temperature as measured by the " "The compensated ambient temperature as measured by the "
"AirGradient SHT / PMS " "AirGradient SHT / PMS "
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(atmpCompensated)); add_metric_point("", String(atmpCompensated));
} }
if (_hum >= 0) { if (utils::isValidHumidity(_hum)) {
add_metric( add_metric(
"humidity", "humidity",
"The relative humidity as measured by the AirGradient SHT sensor", "The relative humidity as measured by the AirGradient SHT sensor",
"gauge", "percent"); "gauge", "percent");
add_metric_point("", String(_hum)); add_metric_point("", String(_hum));
} }
if (ahumCompensated >= 0) { if (utils::isValidHumidity(ahumCompensated)) {
add_metric("humidity_compensated", add_metric("humidity_compensated",
"The compensated relative humidity as measured by the " "The compensated relative humidity as measured by the "
"AirGradient SHT / PMS sensor", "AirGradient SHT / PMS sensor",

View File

@ -258,7 +258,7 @@ void loop() {
static void co2Update(void) { static void co2Update(void) {
int value = ag.s8.getCo2(); int value = ag.s8.getCo2();
if (value >= 0) { if (utils::isValidCO2(value)) {
measurements.CO2 = value; measurements.CO2 = value;
getCO2FailCount = 0; getCO2FailCount = 0;
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2); Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
@ -266,7 +266,7 @@ static void co2Update(void) {
getCO2FailCount++; getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount); Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
if (getCO2FailCount >= 3) { if (getCO2FailCount >= 3) {
measurements.CO2 = -1; measurements.CO2 = utils::getInvalidCO2();
} }
} }
} }
@ -611,10 +611,10 @@ static void updatePm(void) {
pmFailCount++; pmFailCount++;
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed: %d\r\n", pmFailCount);
if (pmFailCount >= 3) { if (pmFailCount >= 3) {
measurements.pm01_1 = -1; measurements.pm01_1 = utils::getInvalidPMS();
measurements.pm25_1 = -1; measurements.pm25_1 = utils::getInvalidPMS();
measurements.pm10_1 = -1; measurements.pm10_1 = utils::getInvalidPMS();
measurements.pm03PCount_1 = -1; measurements.pm03PCount_1 = utils::getInvalidPMS();
} }
} }
} }
@ -659,5 +659,7 @@ static void tempHumUpdate(void) {
} }
} else { } else {
Serial.println("SHT read failed"); Serial.println("SHT read failed");
measurements.Temperature = utils::getInvalidTemperature();
measurements.Humidity = utils::getInvalidHumidity();
} }
} }

View File

@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
add_metric_point("", String(measure.CO2)); add_metric_point("", String(measure.CO2));
} }
float _temp = -1001; float _temp = utils::getInvalidTemperature();
float _hum = -1; float _hum = utils::getInvalidHumidity();
int pm01 = -1; int pm01 = utils::getInvalidPMS();
int pm25 = -1; int pm25 = utils::getInvalidPMS();
int pm10 = -1; int pm10 = utils::getInvalidPMS();
int pm03PCount = -1; int pm03PCount = utils::getInvalidPMS();
int atmpCompensated = -1; int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = -1; int ahumCompensated = utils::getInvalidHumidity();
if (config.hasSensorSHT) { if (config.hasSensorSHT) {
_temp = measure.Temperature; _temp = measure.Temperature;
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorPMS1) { if (config.hasSensorPMS1) {
if (pm01 >= 0) { if (utils::isValidPMS(pm01)) {
add_metric("pm1", add_metric("pm1",
"PM1.0 concentration as measured by the AirGradient PMS " "PM1.0 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm01)); add_metric_point("", String(pm01));
} }
if (pm25 >= 0) { if (utils::isValidPMS(pm25)) {
add_metric("pm2d5", add_metric("pm2d5",
"PM2.5 concentration as measured by the AirGradient PMS " "PM2.5 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm25)); add_metric_point("", String(pm25));
} }
if (pm10 >= 0) { if (utils::isValidPMS(pm10)) {
add_metric("pm10", add_metric("pm10",
"PM10 concentration as measured by the AirGradient PMS " "PM10 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm10)); add_metric_point("", String(pm10));
} }
if (pm03PCount >= 0) { if (utils::isValidPMS03Count(pm03PCount)) {
add_metric("pm0d3", add_metric("pm0d3",
"PM0.3 concentration as measured by the AirGradient PMS " "PM0.3 concentration as measured by the AirGradient PMS "
"sensor, in number of particules per 100 milliliters", "sensor, in number of particules per 100 milliliters",
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorSGP) { if (config.hasSensorSGP) {
if (measure.TVOC >= 0) { if (utils::isValidVOC(measure.TVOC)) {
add_metric("tvoc_index", add_metric("tvoc_index",
"The processed Total Volatile Organic Compounds (TVOC) index " "The processed Total Volatile Organic Compounds (TVOC) index "
"as measured by the AirGradient SGP sensor", "as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOC)); add_metric_point("", String(measure.TVOC));
} }
if (measure.TVOCRaw >= 0) { if (utils::isValidVOC(measure.TVOCRaw)) {
add_metric("tvoc_raw", add_metric("tvoc_raw",
"The raw input value to the Total Volatile Organic Compounds " "The raw input value to the Total Volatile Organic Compounds "
"(TVOC) index as measured by the AirGradient SGP sensor", "(TVOC) index as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOCRaw)); add_metric_point("", String(measure.TVOCRaw));
} }
if (measure.NOx >= 0) { if (utils::isValidNOx(measure.NOx)) {
add_metric("nox_index", add_metric("nox_index",
"The processed Nitrous Oxide (NOx) index as measured by the " "The processed Nitrous Oxide (NOx) index as measured by the "
"AirGradient SGP sensor", "AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.NOx)); add_metric_point("", String(measure.NOx));
} }
if (measure.NOxRaw >= 0) { if (utils::isValidNOx(measure.NOxRaw)) {
add_metric("nox_raw", add_metric("nox_raw",
"The raw input value to the Nitrous Oxide (NOx) index as " "The raw input value to the Nitrous Oxide (NOx) index as "
"measured by the AirGradient SGP sensor", "measured by the AirGradient SGP sensor",
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
} }
} }
if (_temp > -1001) { if (utils::isValidTemperature(_temp)) {
add_metric( add_metric(
"temperature", "temperature",
"The ambient temperature as measured by the AirGradient SHT / PMS " "The ambient temperature as measured by the AirGradient SHT / PMS "
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(_temp)); add_metric_point("", String(_temp));
} }
if (atmpCompensated > -1001) { if (utils::isValidTemperature(atmpCompensated)) {
add_metric("temperature_compensated", add_metric("temperature_compensated",
"The compensated ambient temperature as measured by the " "The compensated ambient temperature as measured by the "
"AirGradient SHT / PMS " "AirGradient SHT / PMS "
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(atmpCompensated)); add_metric_point("", String(atmpCompensated));
} }
if (_hum >= 0) { if (utils::isValidHumidity(_hum)) {
add_metric( add_metric(
"humidity", "humidity",
"The relative humidity as measured by the AirGradient SHT sensor", "The relative humidity as measured by the AirGradient SHT sensor",
"gauge", "percent"); "gauge", "percent");
add_metric_point("", String(_hum)); add_metric_point("", String(_hum));
} }
if (ahumCompensated >= 0) { if (utils::isValidHumidity(ahumCompensated)) {
add_metric("humidity_compensated", add_metric("humidity_compensated",
"The compensated relative humidity as measured by the " "The compensated relative humidity as measured by the "
"AirGradient SHT / PMS sensor", "AirGradient SHT / PMS sensor",

View File

@ -317,7 +317,7 @@ void loop() {
static void co2Update(void) { static void co2Update(void) {
int value = ag->s8.getCo2(); int value = ag->s8.getCo2();
if (value >= 0) { if (utils::isValidCO2(value)) {
measurements.CO2 = value; measurements.CO2 = value;
getCO2FailCount = 0; getCO2FailCount = 0;
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2); Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
@ -325,7 +325,7 @@ static void co2Update(void) {
getCO2FailCount++; getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount); Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
if (getCO2FailCount >= 3) { if (getCO2FailCount >= 3) {
measurements.CO2 = -1; measurements.CO2 = utils::getInvalidCO2();
} }
} }
} }
@ -421,8 +421,8 @@ static void factoryConfigReset(void) {
} }
/** Reset WIFI */ /** Reset WIFI */
WiFi.enableSTA(true); // Incase offline mode Serial.println("Set wifi connect to 'airgradient' as default");
WiFi.disconnect(true, true); WiFi.begin("airgradient", "cleanair");
/** Reset local config */ /** Reset local config */
configuration.reset(); configuration.reset();
@ -1020,10 +1020,10 @@ static void updatePm(void) {
pmFailCount++; pmFailCount++;
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed: %d\r\n", pmFailCount);
if (pmFailCount >= 3) { if (pmFailCount >= 3) {
measurements.pm01_1 = -1; measurements.pm01_1 = utils::getInvalidPMS();
measurements.pm25_1 = -1; measurements.pm25_1 = utils::getInvalidPMS();
measurements.pm10_1 = -1; measurements.pm10_1 = utils::getInvalidPMS();
measurements.pm03PCount_1 = -1; measurements.pm03PCount_1 = utils::getInvalidPMS();
} }
} }
} else { } else {
@ -1051,12 +1051,12 @@ static void updatePm(void) {
Serial.printf("[1] Relative Humidity compensated: %f\r\n", Serial.printf("[1] Relative Humidity compensated: %f\r\n",
ag->pms5003t_1.humidityCompensated(measurements.hum_1)); ag->pms5003t_1.humidityCompensated(measurements.hum_1));
} else { } else {
measurements.pm01_1 = -1; measurements.pm01_1 = utils::getInvalidPMS();
measurements.pm25_1 = -1; measurements.pm25_1 = utils::getInvalidPMS();
measurements.pm10_1 = -1; measurements.pm10_1 = utils::getInvalidPMS();
measurements.pm03PCount_1 = -1; measurements.pm03PCount_1 = utils::getInvalidPMS();
measurements.temp_1 = -1001; measurements.temp_1 = utils::getInvalidTemperature();
measurements.hum_1 = -1; measurements.hum_1 = utils::getInvalidHumidity();
} }
if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) { if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) {
@ -1081,12 +1081,12 @@ static void updatePm(void) {
Serial.printf("[2] Relative Humidity compensated: %d\r\n", Serial.printf("[2] Relative Humidity compensated: %d\r\n",
ag->pms5003t_1.humidityCompensated(measurements.hum_2)); ag->pms5003t_1.humidityCompensated(measurements.hum_2));
} else { } else {
measurements.pm01_2 = -1; measurements.pm01_2 = utils::getInvalidPMS();
measurements.pm25_2 = -1; measurements.pm25_2 = utils::getInvalidPMS();
measurements.pm10_2 = -1; measurements.pm10_2 = utils::getInvalidPMS();
measurements.pm03PCount_2 = -1; measurements.pm03PCount_2 = utils::getInvalidPMS();
measurements.temp_2 = -1001; measurements.temp_2 = utils::getInvalidTemperature();
measurements.hum_2 = -1; measurements.hum_2 = utils::getInvalidHumidity();
} }
if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 && if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 &&
@ -1226,6 +1226,8 @@ static void tempHumUpdate(void) {
measurements.Humidity); measurements.Humidity);
} }
} else { } else {
measurements.Temperature = utils::getInvalidTemperature();
measurements.Humidity = utils::getInvalidHumidity();
Serial.println("SHT read failed"); Serial.println("SHT read failed");
} }
} }

View File

@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
add_metric_point("", String(measure.CO2)); add_metric_point("", String(measure.CO2));
} }
float _temp = -1001; float _temp = utils::getInvalidTemperature();
float _hum = -1; float _hum = utils::getInvalidHumidity();
int pm01 = -1; int pm01 = utils::getInvalidPMS();
int pm25 = -1; int pm25 = utils::getInvalidPMS();
int pm10 = -1; int pm10 = utils::getInvalidPMS();
int pm03PCount = -1; int pm03PCount = utils::getInvalidPMS();
int atmpCompensated = -1; int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = -1; int ahumCompensated = utils::getInvalidHumidity();
if (config.hasSensorPMS1 && config.hasSensorPMS2) { if (config.hasSensorPMS1 && config.hasSensorPMS2) {
_temp = (measure.temp_1 + measure.temp_2) / 2.0f; _temp = (measure.temp_1 + measure.temp_2) / 2.0f;
_hum = (measure.hum_1 + measure.hum_2) / 2.0f; _hum = (measure.hum_1 + measure.hum_2) / 2.0f;
@ -123,28 +123,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorPMS1 || config.hasSensorPMS2) { if (config.hasSensorPMS1 || config.hasSensorPMS2) {
if (pm01 >= 0) { if (utils::isValidPMS(pm01)) {
add_metric("pm1", add_metric("pm1",
"PM1.0 concentration as measured by the AirGradient PMS " "PM1.0 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm01)); add_metric_point("", String(pm01));
} }
if (pm25 >= 0) { if (utils::isValidPMS(pm25)) {
add_metric("pm2d5", add_metric("pm2d5",
"PM2.5 concentration as measured by the AirGradient PMS " "PM2.5 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm25)); add_metric_point("", String(pm25));
} }
if (pm10 >= 0) { if (utils::isValidPMS(pm10)) {
add_metric("pm10", add_metric("pm10",
"PM10 concentration as measured by the AirGradient PMS " "PM10 concentration as measured by the AirGradient PMS "
"sensor, in micrograms per cubic meter", "sensor, in micrograms per cubic meter",
"gauge", "ugm3"); "gauge", "ugm3");
add_metric_point("", String(pm10)); add_metric_point("", String(pm10));
} }
if (pm03PCount >= 0) { if (utils::isValidPMS03Count(pm03PCount)) {
add_metric("pm0d3", add_metric("pm0d3",
"PM0.3 concentration as measured by the AirGradient PMS " "PM0.3 concentration as measured by the AirGradient PMS "
"sensor, in number of particules per 100 milliliters", "sensor, in number of particules per 100 milliliters",
@ -154,28 +154,28 @@ String OpenMetrics::getPayload(void) {
} }
if (config.hasSensorSGP) { if (config.hasSensorSGP) {
if (measure.TVOC >= 0) { if (utils::isValidVOC(measure.TVOC)) {
add_metric("tvoc_index", add_metric("tvoc_index",
"The processed Total Volatile Organic Compounds (TVOC) index " "The processed Total Volatile Organic Compounds (TVOC) index "
"as measured by the AirGradient SGP sensor", "as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOC)); add_metric_point("", String(measure.TVOC));
} }
if (measure.TVOCRaw >= 0) { if (utils::isValidVOC(measure.TVOCRaw)) {
add_metric("tvoc_raw", add_metric("tvoc_raw",
"The raw input value to the Total Volatile Organic Compounds " "The raw input value to the Total Volatile Organic Compounds "
"(TVOC) index as measured by the AirGradient SGP sensor", "(TVOC) index as measured by the AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.TVOCRaw)); add_metric_point("", String(measure.TVOCRaw));
} }
if (measure.NOx >= 0) { if (utils::isValidNOx(measure.NOx)) {
add_metric("nox_index", add_metric("nox_index",
"The processed Nitrous Oxide (NOx) index as measured by the " "The processed Nitrous Oxide (NOx) index as measured by the "
"AirGradient SGP sensor", "AirGradient SGP sensor",
"gauge"); "gauge");
add_metric_point("", String(measure.NOx)); add_metric_point("", String(measure.NOx));
} }
if (measure.NOxRaw >= 0) { if (utils::isValidNOx(measure.NOxRaw)) {
add_metric("nox_raw", add_metric("nox_raw",
"The raw input value to the Nitrous Oxide (NOx) index as " "The raw input value to the Nitrous Oxide (NOx) index as "
"measured by the AirGradient SGP sensor", "measured by the AirGradient SGP sensor",
@ -184,14 +184,14 @@ String OpenMetrics::getPayload(void) {
} }
} }
if (_temp > -1001) { if (utils::isValidTemperature(_temp)) {
add_metric("temperature", add_metric("temperature",
"The ambient temperature as measured by the AirGradient SHT / PMS " "The ambient temperature as measured by the AirGradient SHT / PMS "
"sensor, in degrees Celsius", "sensor, in degrees Celsius",
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(_temp)); add_metric_point("", String(_temp));
} }
if (atmpCompensated > -1001) { if (utils::isValidTemperature(atmpCompensated)) {
add_metric( add_metric(
"temperature_compensated", "temperature_compensated",
"The compensated ambient temperature as measured by the AirGradient SHT / PMS " "The compensated ambient temperature as measured by the AirGradient SHT / PMS "
@ -199,14 +199,14 @@ String OpenMetrics::getPayload(void) {
"gauge", "celsius"); "gauge", "celsius");
add_metric_point("", String(atmpCompensated)); add_metric_point("", String(atmpCompensated));
} }
if (_hum >= 0) { if (utils::isValidHumidity(_hum)) {
add_metric( add_metric(
"humidity", "humidity",
"The relative humidity as measured by the AirGradient SHT sensor", "The relative humidity as measured by the AirGradient SHT sensor",
"gauge", "percent"); "gauge", "percent");
add_metric_point("", String(_hum)); add_metric_point("", String(_hum));
} }
if (ahumCompensated >= 0) { if (utils::isValidHumidity(ahumCompensated)) {
add_metric( add_metric(
"humidity_compensated", "humidity_compensated",
"The compensated relative humidity as measured by the AirGradient SHT / PMS sensor", "The compensated relative humidity as measured by the AirGradient SHT / PMS sensor",

View File

@ -1,5 +1,6 @@
#include "AgOledDisplay.h" #include "AgOledDisplay.h"
#include "Libraries/U8g2/src/U8g2lib.h" #include "Libraries/U8g2/src/U8g2lib.h"
#include "Main/utils.h"
/** Cast U8G2 */ /** Cast U8G2 */
#define DISP() ((U8G2_SH1106_128X64_NONAME_F_HW_I2C *)(this->u8g2)) #define DISP() ((U8G2_SH1106_128X64_NONAME_F_HW_I2C *)(this->u8g2))
@ -11,7 +12,7 @@
*/ */
void OledDisplay::showTempHum(bool hasStatus) { void OledDisplay::showTempHum(bool hasStatus) {
char buf[16]; char buf[16];
if (value.Temperature > -1001) { if (utils::isValidTemperature(value.Temperature)) {
if (config.isTemperatureUnitInF()) { if (config.isTemperatureUnitInF()) {
float tempF = (value.Temperature * 9) / 5 + 32; float tempF = (value.Temperature * 9) / 5 + 32;
if (hasStatus) { if (hasStatus) {
@ -36,10 +37,10 @@ void OledDisplay::showTempHum(bool hasStatus) {
DISP()->drawUTF8(1, 10, buf); DISP()->drawUTF8(1, 10, buf);
/** Show humidty */ /** Show humidty */
if (value.Humidity >= 0) { if (utils::isValidHumidity(value.Humidity)) {
snprintf(buf, sizeof(buf), "%d%%", value.Humidity); snprintf(buf, sizeof(buf), "%d%%", value.Humidity);
} else { } else {
snprintf(buf, sizeof(buf), "%-%%"); snprintf(buf, sizeof(buf), "-%%");
} }
if (value.Humidity > 99) { if (value.Humidity > 99) {
@ -283,12 +284,8 @@ void OledDisplay::showDashboard(const char *status) {
DISP()->drawUTF8(1, 27, "CO2"); DISP()->drawUTF8(1, 27, "CO2");
DISP()->setFont(u8g2_font_t0_22b_tf); DISP()->setFont(u8g2_font_t0_22b_tf);
if (value.CO2 > 0) { if (utils::isValidCO2(value.CO2)) {
int val = 9999; sprintf(strBuf, "%d", value.CO2);
if (value.CO2 < 10000) {
val = value.CO2;
}
sprintf(strBuf, "%d", val);
} else { } else {
sprintf(strBuf, "%s", "-"); sprintf(strBuf, "%s", "-");
} }
@ -299,12 +296,12 @@ void OledDisplay::showDashboard(const char *status) {
DISP()->drawStr(1, 61, "ppm"); DISP()->drawStr(1, 61, "ppm");
/** Draw vertical line */ /** Draw vertical line */
DISP()->drawLine(45, 14, 45, 64); DISP()->drawLine(52, 14, 52, 64);
DISP()->drawLine(82, 14, 82, 64); DISP()->drawLine(97, 14, 97, 64);
/** Draw PM2.5 label */ /** Draw PM2.5 label */
DISP()->setFont(u8g2_font_t0_12_tf); DISP()->setFont(u8g2_font_t0_12_tf);
DISP()->drawStr(48, 27, "PM2.5"); DISP()->drawStr(55, 27, "PM2.5");
/** Draw PM2.5 value */ /** Draw PM2.5 value */
int pm25 = value.pm25_1; int pm25 = value.pm25_1;
@ -313,51 +310,56 @@ void OledDisplay::showDashboard(const char *status) {
} }
DISP()->setFont(u8g2_font_t0_22b_tf); DISP()->setFont(u8g2_font_t0_22b_tf);
if (config.isPmStandardInUSAQI()) { if (config.isPmStandardInUSAQI()) {
if (value.pm25_1 >= 0) { if (utils::isValidPMS(value.pm25_1)) {
sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(pm25)); sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(value.pm25_1));
} else { } else {
sprintf(strBuf, "%s", "-"); sprintf(strBuf, "%s", "-");
} }
DISP()->drawStr(48, 48, strBuf); DISP()->drawStr(55, 48, strBuf);
DISP()->setFont(u8g2_font_t0_12_tf); DISP()->setFont(u8g2_font_t0_12_tf);
DISP()->drawUTF8(48, 61, "AQI"); DISP()->drawUTF8(55, 61, "AQI");
} else { } else {
if (value.pm25_1 >= 0) { if (utils::isValidPMS(value.pm25_1)) {
sprintf(strBuf, "%d", pm25); sprintf(strBuf, "%d", value.pm25_1);
} else { } else {
sprintf(strBuf, "%s", "-"); sprintf(strBuf, "%s", "-");
} }
DISP()->drawStr(48, 48, strBuf); DISP()->drawStr(55, 48, strBuf);
DISP()->setFont(u8g2_font_t0_12_tf); DISP()->setFont(u8g2_font_t0_12_tf);
DISP()->drawUTF8(48, 61, "ug/m³"); DISP()->drawUTF8(55, 61, "ug/m³");
} }
/** Draw tvocIndexlabel */ /** Draw tvocIndexlabel */
DISP()->setFont(u8g2_font_t0_12_tf); DISP()->setFont(u8g2_font_t0_12_tf);
DISP()->drawStr(85, 27, "tvoc:"); DISP()->drawStr(100, 27, "VOC:");
/** Draw tvocIndexvalue */ /** Draw tvocIndexvalue */
if (value.TVOC >= 0) { if (utils::isValidVOC(value.TVOC)) {
sprintf(strBuf, "%d", value.TVOC); sprintf(strBuf, "%d", value.TVOC);
} else { } else {
sprintf(strBuf, "%s", "-"); sprintf(strBuf, "%s", "-");
} }
DISP()->drawStr(85, 39, strBuf); DISP()->drawStr(100, 39, strBuf);
/** Draw NOx label */ /** Draw NOx label */
DISP()->drawStr(85, 53, "NOx:"); DISP()->drawStr(100, 53, "NOx:");
if (value.NOx >= 0) { if (utils::isValidNOx(value.NOx)) {
sprintf(strBuf, "%d", value.NOx); sprintf(strBuf, "%d", value.NOx);
} else { } else {
sprintf(strBuf, "%s", "-"); sprintf(strBuf, "%s", "-");
} }
DISP()->drawStr(85, 63, strBuf); DISP()->drawStr(100, 63, strBuf);
} while (DISP()->nextPage()); } while (DISP()->nextPage());
} else if (ag->isBasic()) { } else if (ag->isBasic()) {
ag->display.clear(); ag->display.clear();
/** Set CO2 */ /** Set CO2 */
snprintf(strBuf, sizeof(strBuf), "CO2:%d", value.CO2); if(utils::isValidCO2(value.CO2)) {
snprintf(strBuf, sizeof(strBuf), "CO2:%d", value.CO2);
} else {
snprintf(strBuf, sizeof(strBuf), "CO2:-");
}
ag->display.setCursor(0, 0); ag->display.setCursor(0, 0);
ag->display.setText(strBuf); ag->display.setText(strBuf);
@ -367,28 +369,38 @@ void OledDisplay::showDashboard(const char *status) {
pm25 = (int)ag->pms5003.pm25Compensated(pm25, value.Humidity); pm25 = (int)ag->pms5003.pm25Compensated(pm25, value.Humidity);
} }
ag->display.setCursor(0, 12); ag->display.setCursor(0, 12);
snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", pm25); if (utils::isValidPMS(value.pm25_1)) {
snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", value.pm25_1);
} else {
snprintf(strBuf, sizeof(strBuf), "PM2.5:-");
}
ag->display.setText(strBuf); ag->display.setText(strBuf);
/** Set temperature and humidity */ /** Set temperature and humidity */
if (value.Temperature <= -1001.0f) { if (utils::isValidTemperature(value.Temperature)) {
if (config.isTemperatureUnitInF()) {
float tempF = (value.Temperature * 9) / 5 + 32;
snprintf(strBuf, sizeof(strBuf), "T:%0.1f F", tempF);
} else {
snprintf(strBuf, sizeof(strBuf), "T:%0.f1 C", value.Temperature);
}
} else {
if (config.isTemperatureUnitInF()) { if (config.isTemperatureUnitInF()) {
snprintf(strBuf, sizeof(strBuf), "T:-F"); snprintf(strBuf, sizeof(strBuf), "T:-F");
} else { } else {
snprintf(strBuf, sizeof(strBuf), "T:-C"); snprintf(strBuf, sizeof(strBuf), "T:-C");
} }
} else {
if (config.isTemperatureUnitInF()) {
float tempF = (value.Temperature * 9) / 5 + 32;
snprintf(strBuf, sizeof(strBuf), "T:%d F", (int)tempF);
} else {
snprintf(strBuf, sizeof(strBuf), "T:%d C", (int)value.Temperature);
}
} }
ag->display.setCursor(0, 24); ag->display.setCursor(0, 24);
ag->display.setText(strBuf); ag->display.setText(strBuf);
snprintf(strBuf, sizeof(strBuf), "H:%d %%", (int)value.Humidity); if (utils::isValidHumidity(value.Humidity)) {
snprintf(strBuf, sizeof(strBuf), "H:%d %%", (int)value.Humidity);
} else {
snprintf(strBuf, sizeof(strBuf), "H:- %%");
}
ag->display.setCursor(0, 36); ag->display.setCursor(0, 36);
ag->display.setText(strBuf); ag->display.setText(strBuf);

View File

@ -9,9 +9,9 @@
#define RGB_COLOR_R 255, 0, 0 /** Red */ #define RGB_COLOR_R 255, 0, 0 /** Red */
#define RGB_COLOR_G 0, 255, 0 /** Green */ #define RGB_COLOR_G 0, 255, 0 /** Green */
#define RGB_COLOR_Y 255, 255, 0 /** Yellow */ #define RGB_COLOR_Y 255, 150, 0 /** Yellow */
#define RGB_COLOR_O 255, 165, 0 /** Organge */ #define RGB_COLOR_O 255, 40, 0 /** Orange */
#define RGB_COLOR_P 160, 32, 240 /** Purple */ #define RGB_COLOR_P 180, 0, 255 /** Purple */
/** /**
* @brief Animation LED bar with color * @brief Animation LED bar with color
@ -573,7 +573,7 @@ void StateMachine::handleLeds(AgStateMachineState state) {
case AgStateMachineWiFiManagerMode: { case AgStateMachineWiFiManagerMode: {
/** In WiFi Manager Mode */ /** In WiFi Manager Mode */
/** Turn LED OFF */ /** Turn LED OFF */
/** Turn midle LED Color */ /** Turn middle LED Color */
if (ag->isOne()) { if (ag->isOne()) {
ag->ledBar.setColor(0, 0, 255, ag->ledBar.getNumberOfLeds() / 2); ag->ledBar.setColor(0, 0, 255, ag->ledBar.getNumberOfLeds() / 2);
} else { } else {
@ -713,7 +713,7 @@ void StateMachine::handleLeds(AgStateMachineState state) {
break; break;
} }
case AgStateMachineSensorConfigFailed: { case AgStateMachineSensorConfigFailed: {
/** Server is reachable but there is some conguration issue to be fixed on /** Server is reachable but there is some configuration issue to be fixed on
* the server side */ * the server side */
if (ag->isOne()) { if (ag->isOne()) {
ag->ledBar.setColor(139, 24, 248, 0); ag->ledBar.setColor(139, 24, 248, 0);

View File

@ -1,6 +1,7 @@
#include "AgValue.h" #include "AgValue.h"
#include "AgConfigure.h" #include "AgConfigure.h"
#include "AirGradient.h" #include "AirGradient.h"
#include "Main/utils.h"
#include "Libraries/Arduino_JSON/src/Arduino_JSON.h" #include "Libraries/Arduino_JSON/src/Arduino_JSON.h"
String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
@ -13,36 +14,35 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
if (localServer) { if (localServer) {
root["serialno"] = ag->deviceId(); root["serialno"] = ag->deviceId();
} }
if (config->hasSensorS8) {
if (this->CO2 >= 0) { if (config->hasSensorS8 && utils::isValidCO2(this->CO2)) {
root["rco2"] = this->CO2; root["rco2"] = this->CO2;
}
} }
if (ag->isOne() || (ag->isPro4_2()) || ag->isPro3_3() || ag->isBasic()) { if (ag->isOne() || (ag->isPro4_2()) || ag->isPro3_3() || ag->isBasic()) {
if (config->hasSensorPMS1) { if (config->hasSensorPMS1) {
if (this->pm01_1 >= 0) { if (utils::isValidPMS(this->pm01_1)) {
root["pm01"] = this->pm01_1; root["pm01"] = this->pm01_1;
} }
if (this->pm25_1 >= 0) { if (utils::isValidPMS(this->pm25_1)) {
root["pm02"] = this->pm25_1; root["pm02"] = this->pm25_1;
} }
if (this->pm10_1 >= 0) { if (utils::isValidPMS(this->pm10_1)) {
root["pm10"] = this->pm10_1; root["pm10"] = this->pm10_1;
} }
if (this->pm03PCount_1 >= 0) { if (utils::isValidPMS03Count(this->pm03PCount_1)) {
root["pm003Count"] = this->pm03PCount_1; root["pm003Count"] = this->pm03PCount_1;
} }
} }
if (config->hasSensorSHT) { if (config->hasSensorSHT) {
if (this->Temperature > -1001) { if (utils::isValidTemperature(this->Temperature)) {
root["atmp"] = ag->round2(this->Temperature); root["atmp"] = ag->round2(this->Temperature);
if (localServer) { if (localServer) {
root["atmpCompensated"] = ag->round2(this->Temperature); root["atmpCompensated"] = ag->round2(this->Temperature);
} }
} }
if (this->Humidity >= 0) { if (utils::isValidHumidity(this->Humidity)) {
root["rhum"] = this->Humidity; root["rhum"] = this->Humidity;
if (localServer) { if (localServer) {
root["rhumCompensated"] = this->Humidity; root["rhumCompensated"] = this->Humidity;
@ -59,19 +59,37 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} else { } else {
if (config->hasSensorPMS1 && config->hasSensorPMS2) { if (config->hasSensorPMS1 && config->hasSensorPMS2) {
root["pm01"] = ag->round2((this->pm01_1 + this->pm01_2) / 2.0); if (utils::isValidPMS(this->pm01_1) && utils::isValidPMS(this->pm01_2)) {
root["pm02"] = ag->round2((this->pm25_1 + this->pm25_2) / 2.0); root["pm01"] = ag->round2((this->pm01_1 + this->pm01_2) / 2.0f);
root["pm10"] = ag->round2((this->pm10_1 + this->pm10_2) / 2.0); }
root["pm003Count"] = if (utils::isValidPMS(this->pm25_1) && utils::isValidPMS(this->pm25_2)) {
ag->round2((this->pm03PCount_1 + this->pm03PCount_2) / 2.0); root["pm02"] = ag->round2((this->pm25_1 + this->pm25_2) / 2.0f);
root["atmp"] = ag->round2((this->temp_1 + this->temp_2) / 2.0f); }
root["rhum"] = ag->round2((this->hum_1 + this->hum_2) / 2.0f); if (utils::isValidPMS(this->pm10_1) && utils::isValidPMS(this->pm10_2)) {
if (localServer) { root["pm10"] = ag->round2((this->pm10_1 + this->pm10_2) / 2.0f);
root["atmpCompensated"] = }
ag->round2(ag->pms5003t_2.temperatureCompensated( if (utils::isValidPMS(this->pm03PCount_1) && utils::isValidPMS(this->pm03PCount_2)) {
(this->temp_1 + this->temp_2) / 2.0f)); root["pm003Count"] = ag->round2((this->pm03PCount_1 + this->pm03PCount_2) / 2.0f);
root["rhumCompensated"] = (int)ag->pms5003t_2.humidityCompensated( }
(this->hum_1 + this->hum_2) / 2.0f);
float val;
if (utils::isValidTemperature(this->temp_1) && utils::isValidTemperature(this->temp_1)) {
root["atmp"] = ag->round2((this->temp_1 + this->temp_2) / 2.0f);
if (localServer) {
val = ag->pms5003t_2.temperatureCompensated((this->temp_1 + this->temp_2) / 2.0f);
if (utils::isValidTemperature(val)) {
root["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_1) && utils::isValidHumidity(this->hum_1)) {
root["rhum"] = ag->round2((this->hum_1 + this->hum_2) / 2.0f);
if (localServer) {
val = ag->pms5003t_2.humidityCompensated((this->hum_1 + this->hum_2) / 2.0f);
if (utils::isValidHumidity(val)) {
root["rhumCompensated"] = (int)val;
}
}
} }
int pm25 = (ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1) + int pm25 = (ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1) +
@ -81,95 +99,220 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
if (fwMode == FW_MODE_O_1PS || fwMode == FW_MODE_O_1PST) { if (fwMode == FW_MODE_O_1PS || fwMode == FW_MODE_O_1PST) {
float val;
if (config->hasSensorPMS1) { if (config->hasSensorPMS1) {
root["pm01"] = this->pm01_1; if (utils::isValidPMS(this->pm01_1)) {
root["pm02"] = this->pm25_1; root["pm01"] = this->pm01_1;
root["pm10"] = this->pm10_1; }
root["pm003Count"] = this->pm03PCount_1; if (utils::isValidPMS(this->pm25_1)) {
root["atmp"] = ag->round2(this->temp_1); root["pm02"] = this->pm25_1;
root["rhum"] = this->hum_1; }
if (localServer) { if (utils::isValidPMS(this->pm10_1)) {
root["atmpCompensated"] = root["pm10"] = this->pm10_1;
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1)); }
root["rhumCompensated"] = if (utils::isValidPMS03Count(this->pm03PCount_1)) {
(int)ag->pms5003t_1.humidityCompensated(this->hum_1); root["pm003Count"] = this->pm03PCount_1;
}
if (utils::isValidTemperature(this->temp_1)) {
root["atmp"] = ag->round2(this->temp_1);
if (localServer) {
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
if (utils::isValidTemperature(val)) {
root["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_1)) {
root["rhum"] = this->hum_1;
if (localServer) {
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
if (utils::isValidHumidity(val)) {
root["rhumCompensated"] = (int)val;
}
}
} }
root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1);
} }
if (config->hasSensorPMS2) { if (config->hasSensorPMS2) {
root["pm01"] = this->pm01_2; if(utils::isValidPMS(this->pm01_2)) {
root["pm02"] = this->pm25_2; root["pm01"] = this->pm01_2;
root["pm10"] = this->pm10_2; }
root["pm003Count"] = this->pm03PCount_2; if(utils::isValidPMS(this->pm25_2)) {
root["atmp"] = ag->round2(this->temp_2); root["pm02"] = this->pm25_2;
root["rhum"] = this->hum_2; }
if (localServer) { if(utils::isValidPMS(this->pm10_2)) {
root["atmpCompensated"] = root["pm10"] = this->pm10_2;
ag->round2(ag->pms5003t_2.temperatureCompensated(this->temp_2)); }
root["rhumCompensated"] = if(utils::isValidPMS03Count(this->pm03PCount_2)) {
(int)ag->pms5003t_2.humidityCompensated(this->hum_2); root["pm003Count"] = this->pm03PCount_2;
}
float val;
if (utils::isValidTemperature(this->temp_2)) {
root["atmp"] = ag->round2(this->temp_2);
if (localServer) {
val = ag->pms5003t_2.temperatureCompensated(this->temp_2);
if (utils::isValidTemperature(val)) {
root["atmpCompensated"] = ag->round2(val);
}
}
}
if(utils::isValidHumidity(this->hum_2)) {
root["rhum"] = this->hum_2;
if (localServer) {
val = ag->pms5003t_2.humidityCompensated(this->hum_2);
if (utils::isValidHumidity(val)) {
root["rhumCompensated"] = (int)val;
}
}
} }
root["pm02Compensated"] = ag->pms5003t_2.pm25Compensated(this->pm25_2, this->temp_2); root["pm02Compensated"] = ag->pms5003t_2.pm25Compensated(this->pm25_2, this->temp_2);
} }
} else { } else {
if (fwMode == FW_MODE_O_1P) { if (fwMode == FW_MODE_O_1P) {
float val;
if (config->hasSensorPMS1) { if (config->hasSensorPMS1) {
root["pm01"] = this->pm01_1; if (utils::isValidPMS(this->pm01_1)) {
root["pm02"] = this->pm25_1; root["pm01"] = this->pm01_1;
root["pm10"] = this->pm10_1; }
root["pm003Count"] = this->pm03PCount_1; if (utils::isValidPMS(this->pm25_1)) {
root["atmp"] = ag->round2(this->temp_1); root["pm02"] = this->pm25_1;
root["rhum"] = this->hum_1; }
if (localServer) { if (utils::isValidPMS(this->pm10_1)) {
root["atmpCompensated"] = root["pm10"] = this->pm10_1;
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1)); }
root["rhumCompensated"] = if (utils::isValidPMS03Count(this->pm03PCount_1)) {
(int)ag->pms5003t_1.humidityCompensated(this->hum_1); root["pm003Count"] = this->pm03PCount_1;
}
if (utils::isValidTemperature(this->temp_1)) {
root["atmp"] = ag->round2(this->temp_1);
if (localServer) {
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
if (utils::isValidTemperature(val)) {
root["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_1)) {
root["rhum"] = this->hum_1;
if(localServer) {
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
if(utils::isValidHumidity(val)) {
root["rhumCompensated"] = (int)val;
}
}
} }
root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1);
} else if (config->hasSensorPMS2) { } else if (config->hasSensorPMS2) {
root["pm01"] = this->pm01_2; if(utils::isValidPMS(this->pm01_2)) {
root["pm02"] = this->pm25_2; root["pm01"] = this->pm01_2;
root["pm10"] = this->pm10_2; }
root["pm003Count"] = this->pm03PCount_2; if(utils::isValidPMS(this->pm25_2)) {
root["atmp"] = ag->round2(this->temp_2); root["pm02"] = this->pm25_2;
root["rhum"] = this->hum_2; }
if (localServer) { if(utils::isValidPMS(this->pm10_2)) {
root["atmpCompensated"] = root["pm10"] = this->pm10_2;
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_2)); }
root["rhumCompensated"] = if(utils::isValidPMS03Count(this->pm03PCount_2)) {
(int)ag->pms5003t_1.humidityCompensated(this->hum_2); root["pm003Count"] = this->pm03PCount_2;
}
if (utils::isValidTemperature(this->temp_2)) {
root["atmp"] = ag->round2(this->temp_2);
if (localServer) {
val = ag->pms5003t_1.temperatureCompensated(this->temp_2);
if (utils::isValidTemperature(val)) {
root["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_2)) {
root["rhum"] = this->hum_2;
if(localServer) {
val = ag->pms5003t_1.humidityCompensated(this->hum_2);
if(utils::isValidHumidity(val)) {
root["rhumCompensated"] = (int)val;
}
}
} }
root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1);
} }
} else { } else {
float val;
if (config->hasSensorPMS1) { if (config->hasSensorPMS1) {
root["channels"]["1"]["pm01"] = this->pm01_1; if(utils::isValidPMS(this->pm01_1)) {
root["channels"]["1"]["pm02"] = this->pm25_1; root["channels"]["1"]["pm01"] = this->pm01_1;
root["channels"]["1"]["pm10"] = this->pm10_1; }
root["channels"]["1"]["pm003Count"] = this->pm03PCount_1; if(utils::isValidPMS(this->pm25_1)) {
root["channels"]["1"]["atmp"] = ag->round2(this->temp_1); root["channels"]["1"]["pm02"] = this->pm25_1;
root["channels"]["1"]["rhum"] = this->hum_1; }
if (localServer) { if(utils::isValidPMS(this->pm10_1)) {
root["channels"]["1"]["atmpCompensated"] = root["channels"]["1"]["pm10"] = this->pm10_1;
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1)); }
root["channels"]["1"]["rhumCompensated"] = if (utils::isValidPMS03Count(this->pm03PCount_1)) {
(int)ag->pms5003t_1.humidityCompensated(this->hum_1); root["channels"]["1"]["pm003Count"] = this->pm03PCount_1;
}
if(utils::isValidTemperature(this->temp_1)) {
root["channels"]["1"]["atmp"] = ag->round2(this->temp_1);
if (localServer) {
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
if (utils::isValidTemperature(val)) {
root["channels"]["1"]["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_1)) {
root["channels"]["1"]["rhum"] = this->hum_1;
if (localServer) {
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
if (utils::isValidHumidity(val)) {
root["channels"]["1"]["rhumCompensated"] = (int)val;
}
}
} }
root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1); root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.pm25Compensated(this->pm25_1, this->temp_1);
} }
if (config->hasSensorPMS2) { if (config->hasSensorPMS2) {
root["channels"]["2"]["pm01"] = this->pm01_2; float val;
root["channels"]["2"]["pm02"] = this->pm25_2; if (utils::isValidPMS(this->pm01_2)) {
root["channels"]["2"]["pm10"] = this->pm10_2; root["channels"]["2"]["pm01"] = this->pm01_2;
root["channels"]["2"]["pm003Count"] = this->pm03PCount_2; }
root["channels"]["2"]["atmp"] = ag->round2(this->temp_2); if (utils::isValidPMS(this->pm25_2)) {
root["channels"]["2"]["rhum"] = this->hum_2; root["channels"]["2"]["pm02"] = this->pm25_2;
if (localServer) { }
root["channels"]["2"]["atmpCompensated"] = if (utils::isValidPMS(this->pm10_2)) {
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_2)); root["channels"]["2"]["pm10"] = this->pm10_2;
root["channels"]["2"]["rhumCompensated"] = }
(int)ag->pms5003t_1.humidityCompensated(this->hum_2); if (utils::isValidPMS03Count(this->pm03PCount_2)) {
root["channels"]["2"]["pm003Count"] = this->pm03PCount_2;
}
if (utils::isValidTemperature(this->temp_2)) {
root["channels"]["2"]["atmp"] = ag->round2(this->temp_2);
if (localServer) {
val = ag->pms5003t_1.temperatureCompensated(this->temp_2);
if (utils::isValidTemperature(val)) {
root["channels"]["2"]["atmpCompensated"] = ag->round2(val);
}
}
}
if (utils::isValidHumidity(this->hum_2)) {
root["channels"]["2"]["rhum"] = this->hum_2;
if (localServer) {
val = ag->pms5003t_1.humidityCompensated(this->hum_2);
if (utils::isValidHumidity(val)) {
root["channels"]["2"]["rhumCompensated"] = (int)val;
}
}
} }
root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.pm25Compensated(this->pm25_2, this->temp_2); root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.pm25Compensated(this->pm25_2, this->temp_2);
} }
@ -178,16 +321,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
if (config->hasSensorSGP) { if (config->hasSensorSGP) {
if (this->TVOC >= 0) { if (utils::isValidVOC(this->TVOC)) {
root["tvocIndex"] = this->TVOC; root["tvocIndex"] = this->TVOC;
} }
if (this->TVOCRaw >= 0) { if (utils::isValidVOC(this->TVOCRaw)) {
root["tvocRaw"] = this->TVOCRaw; root["tvocRaw"] = this->TVOCRaw;
} }
if (this->NOx >= 0) { if (utils::isValidNOx(this->NOx)) {
root["noxIndex"] = this->NOx; root["noxIndex"] = this->NOx;
} }
if (this->NOxRaw >= 0) { if (utils::isValidNOx(this->NOxRaw)) {
root["noxRaw"] = this->NOxRaw; root["noxRaw"] = this->NOxRaw;
} }
} }

View File

@ -12,6 +12,7 @@
#include "S8/S8.h" #include "S8/S8.h"
#include "Sgp41/Sgp41.h" #include "Sgp41/Sgp41.h"
#include "Sht/Sht.h" #include "Sht/Sht.h"
#include "Main/utils.h"
#ifndef GIT_VERSION #ifndef GIT_VERSION
#define GIT_VERSION "snapshot" #define GIT_VERSION "snapshot"

85
src/Main/utils.cpp Normal file
View File

@ -0,0 +1,85 @@
#include "utils.h"
#define VALID_TEMPERATURE_MAX (125)
#define VALID_TEMPERATURE_MIN (-40)
#define INVALID_TEMPERATURE (-1000)
#define VALID_HUMIDITY_MAX (100)
#define VALID_HUMIDITY_MIN (0)
#define INVALID_HUMIDITY (-1)
#define VALID_PMS_MAX (1000)
#define VALID_PMS_MIN (0)
#define INVALID_PMS (-1)
#define VALID_CO2_MAX (10000)
#define VALID_CO2_MIN (0)
#define INVALID_CO2 (-1)
#define INVALID_NOX (-1)
#define INVALID_VOC (-1)
utils::utils(/* args */) {}
utils::~utils() {}
bool utils::isValidTemperature(float value) {
if (value >= VALID_TEMPERATURE_MIN && value <= VALID_TEMPERATURE_MAX) {
return true;
}
return false;
}
bool utils::isValidHumidity(float value) {
if (value >= VALID_HUMIDITY_MIN && value <= VALID_HUMIDITY_MAX) {
return true;
}
return false;
}
bool utils::isValidCO2(int16_t value) {
if (value >= VALID_CO2_MIN && value <= VALID_CO2_MAX) {
return true;
}
return false;
}
bool utils::isValidPMS(int value) {
if (value >= VALID_PMS_MIN && value <= VALID_PMS_MAX) {
return true;
}
return false;
}
bool utils::isValidPMS03Count(int value) {
if (value >= 0) {
return true;
}
return false;
}
bool utils::isValidNOx(int value) {
if (value > INVALID_NOX) {
return true;
}
return false;
}
bool utils::isValidVOC(int value) {
if (value > INVALID_VOC) {
return true;
}
return false;
}
float utils::getInvalidTemperature(void) { return INVALID_TEMPERATURE; }
float utils::getInvalidHumidity(void) { return INVALID_HUMIDITY; }
int utils::getInvalidCO2(void) { return INVALID_CO2; }
int utils::getInvalidPMS(void) { return INVALID_PMS; }
int utils::getInvalidNOx(void) { return INVALID_NOX; }
int utils::getInvalidVOC(void) { return INVALID_VOC; }

30
src/Main/utils.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef _UTILS_H_
#define _UTILS_H_
#include <Arduino.h>
class utils
{
private:
/* data */
public:
utils(/* args */);
~utils();
static bool isValidTemperature(float value);
static bool isValidHumidity(float value);
static bool isValidCO2(int16_t value);
static bool isValidPMS(int value);
static bool isValidPMS03Count(int value);
static bool isValidNOx(int value);
static bool isValidVOC(int value);
static float getInvalidTemperature(void);
static float getInvalidHumidity(void);
static int getInvalidCO2(void);
static int getInvalidPMS(void);
static int getInvalidNOx(void);
static int getInvalidVOC(void);
};
#endif /** _UTILS_H_ */

View File

@ -1,5 +1,6 @@
#include "PMS5003.h" #include "PMS5003.h"
#include "Arduino.h" #include "Arduino.h"
#include "../Main/utils.h"
#if defined(ESP8266) #if defined(ESP8266)
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
@ -108,7 +109,9 @@ int PMS5003::getPm10Ae(void) { return pms.getPM10(); }
* *
* @return int PM0.3 index * @return int PM0.3 index
*/ */
int PMS5003::getPm03ParticleCount(void) { return pms.getCount0_3(); } int PMS5003::getPm03ParticleCount(void) {
return pms.getCount0_3();
}
/** /**
* @brief Convert PM2.5 to US AQI * @brief Convert PM2.5 to US AQI

View File

@ -1,5 +1,6 @@
#include "PMS5003T.h" #include "PMS5003T.h"
#include "Arduino.h" #include "Arduino.h"
#include "../Main/utils.h"
#if defined(ESP8266) #if defined(ESP8266)
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
@ -133,7 +134,9 @@ int PMS5003T::getPm10Ae(void) { return pms.getPM10(); }
* *
* @return int PM 0.3 Count index * @return int PM 0.3 Count index
*/ */
int PMS5003T::getPm03ParticleCount(void) { return pms.getCount0_3(); } int PMS5003T::getPm03ParticleCount(void) {
return pms.getCount0_3();
}
/** /**
* @brief Convert PM2.5 to US AQI * @brief Convert PM2.5 to US AQI
@ -149,7 +152,7 @@ int PMS5003T::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
* @return float Degree Celcius * @return float Degree Celcius
*/ */
float PMS5003T::getTemperature(void) { float PMS5003T::getTemperature(void) {
return pms.getTemp()/10.0f; return pms.getTemp() / 10.0f;
} }
/** /**
@ -158,7 +161,7 @@ float PMS5003T::getTemperature(void) {
* @return float Percent (%) * @return float Percent (%)
*/ */
float PMS5003T::getRelativeHumidity(void) { float PMS5003T::getRelativeHumidity(void) {
return pms.getHum()/10.0f; return pms.getHum() / 10.0f;
} }
/** /**

View File

@ -1,5 +1,6 @@
#include "S8.h" #include "S8.h"
#include "mb_crc.h" #include "mb_crc.h"
#include "../Main/utils.h"
#if defined(ESP8266) #if defined(ESP8266)
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#else #else
@ -103,7 +104,7 @@ void S8::getFirmwareVersion(char firmver[]) {
*/ */
int32_t S8::getSensorTypeId(void) { int32_t S8::getSensorTypeId(void) {
if (this->isBegin() == false) { if (this->isBegin() == false) {
return -1; return utils::getInvalidCO2();
} }
int32_t sensorType = 0; int32_t sensorType = 0;

View File

@ -2,6 +2,7 @@
#include "../Libraries/SensirionSGP41/src/SensirionI2CSgp41.h" #include "../Libraries/SensirionSGP41/src/SensirionI2CSgp41.h"
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h" #include "../Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h"
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h" #include "../Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h"
#include "../Main/utils.h"
#define sgpSensor() ((SensirionI2CSgp41 *)(this->_sensor)) #define sgpSensor() ((SensirionI2CSgp41 *)(this->_sensor))
#define vocAlgorithm() ((VOCGasIndexAlgorithm *)(this->_vocAlgorithm)) #define vocAlgorithm() ((VOCGasIndexAlgorithm *)(this->_vocAlgorithm))
@ -66,6 +67,7 @@ bool Sgp41::begin(TwoWire &wire) {
} }
onConditioning = true; onConditioning = true;
_handleFailCount = 0;
#ifdef ESP32 #ifdef ESP32
/** Create task */ /** Create task */
xTaskCreate( xTaskCreate(
@ -108,7 +110,21 @@ void Sgp41::handle(void) {
noxRaw = srawNox; noxRaw = srawNox;
nox = noxAlgorithm()->process(srawNox); nox = noxAlgorithm()->process(srawNox);
tvoc = vocAlgorithm()->process(srawVoc); tvoc = vocAlgorithm()->process(srawVoc);
_handleFailCount = 0;
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox); // AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
} else {
if(_handleFailCount < 5) {
_handleFailCount++;
AgLog("Polling SGP41 failed: %d", _handleFailCount);
}
if (_handleFailCount >= 5) {
tvocRaw = utils::getInvalidVOC();
tvoc = utils::getInvalidVOC();
noxRaw = utils::getInvalidNOx();
nox = utils::getInvalidNOx();
}
} }
} }
} }
@ -141,7 +157,21 @@ void Sgp41::_handle(void) {
noxRaw = srawNox; noxRaw = srawNox;
nox = noxAlgorithm()->process(srawNox); nox = noxAlgorithm()->process(srawNox);
tvoc = vocAlgorithm()->process(srawVoc); tvoc = vocAlgorithm()->process(srawVoc);
_handleFailCount = 0;
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox); // AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
} else {
if(_handleFailCount < 5) {
_handleFailCount++;
AgLog("Polling SGP41 failed: %d", _handleFailCount);
}
if (_handleFailCount >= 5) {
tvocRaw = utils::getInvalidVOC();
tvoc = utils::getInvalidVOC();
noxRaw = utils::getInvalidNOx();
nox = utils::getInvalidNOx();
}
} }
} }
} }
@ -176,7 +206,7 @@ void Sgp41::end(void) {
*/ */
int Sgp41::getTvocIndex(void) { int Sgp41::getTvocIndex(void) {
if (onConditioning) { if (onConditioning) {
return -1; return utils::getInvalidVOC();
} }
return tvoc; return tvoc;
} }
@ -188,7 +218,7 @@ int Sgp41::getTvocIndex(void) {
*/ */
int Sgp41::getNoxIndex(void) { int Sgp41::getNoxIndex(void) {
if (onConditioning) { if (onConditioning) {
return -1; return utils::getInvalidNOx();
} }
return nox; return nox;
} }

View File

@ -35,6 +35,7 @@ private:
bool onConditioning = true; bool onConditioning = true;
bool ready = false; bool ready = false;
bool _isBegin = false; bool _isBegin = false;
uint8_t _handleFailCount = 0;
void *_sensor; void *_sensor;
void *_vocAlgorithm; void *_vocAlgorithm;
void *_noxAlgorithm; void *_noxAlgorithm;

View File

@ -1,6 +1,7 @@
#include "Sht.h" #include "Sht.h"
#include "../Libraries/arduino-sht/SHTSensor.h" #include "../Libraries/arduino-sht/SHTSensor.h"
#include "../Main/utils.h"
/** Cast _sensor to SHTSensor */ /** Cast _sensor to SHTSensor */
#define shtSensor() ((SHTSensor *)(this->_sensor)) #define shtSensor() ((SHTSensor *)(this->_sensor))
@ -131,14 +132,18 @@ void Sht::end(void) {
* *
* @return float * @return float
*/ */
float Sht::getTemperature(void) { return shtSensor()->getTemperature(); } float Sht::getTemperature(void) {
return shtSensor()->getTemperature();
}
/** /**
* @brief Get humidity * @brief Get humidity
* *
* @return float * @return float
*/ */
float Sht::getRelativeHumidity(void) { return shtSensor()->getHumidity(); } float Sht::getRelativeHumidity(void) {
return shtSensor()->getHumidity();
}
/** /**
* @brief Measure temperature and humidity * @brief Measure temperature and humidity