Merge pull request #76 from airgradienthq/develop

Develop
This commit is contained in:
Phat Nguyen
2024-03-07 21:49:10 +07:00
committed by GitHub
4 changed files with 122 additions and 80 deletions

View File

@ -429,13 +429,12 @@ public:
*/
void showServerConfig(void) {
Serial.println("Server configuration: ");
Serial.printf(" inF: %s\r\n", config.inF ? "true" : "false");
Serial.printf(" inUSAQI: %s\r\n",
config.inUSAQI ? "true" : "false");
Serial.printf(" useRGBLedBar: %d\r\n", (int)config.useRGBLedBar);
Serial.printf(" Model: %s\r\n", config.models);
Serial.printf(" Mqtt Broker: %s\r\n", config.mqttBrokers);
Serial.printf(" S8 calib period: %d\r\n", co2AbcCalib);
Serial.printf("inF: %s\r\n", config.inF ? "true" : "false");
Serial.printf("inUSAQI: %s\r\n", config.inUSAQI ? "true" : "false");
Serial.printf("useRGBLedBar: %d\r\n", (int)config.useRGBLedBar);
Serial.printf("Model: %s\r\n", config.models);
Serial.printf("MQTT Broker: %s\r\n", config.mqttBrokers);
Serial.printf("S8 calibration period: %d\r\n", co2AbcCalib);
}
/**
@ -566,19 +565,19 @@ public:
/** init client */
client = esp_mqtt_client_init(&config);
if (client == NULL) {
Serial.println("mqtt client init failed");
Serial.println("MQTT client init failed");
return false;
}
/** Register event */
if (esp_mqtt_client_register_event(client, MQTT_EVENT_ANY,
mqtt_event_handler, NULL) != ESP_OK) {
Serial.println("mqtt client register event failed");
Serial.println("MQTT client register event failed");
return false;
}
if (esp_mqtt_client_start(client) != ESP_OK) {
Serial.println("mqtt client start failed");
Serial.println("MQTT client start failed");
return false;
}
@ -711,8 +710,10 @@ bool hasSensorSGP = true;
bool hasSensorSHT = true;
int pmFailCount = 0;
uint32_t factoryBtnPressTime = 0;
String mdnsModelName = "";
String mdnsModelName = "I-9PSL";
int getCO2FailCount = 0;
uint32_t addToDashboardTime;
bool isAddToDashboard = true;
AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, displayAndLedBarUpdate);
AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL,
updateServerConfiguration);
@ -915,7 +916,7 @@ static void co2Update(void) {
if (value >= 0) {
co2Ppm = value;
getCO2FailCount = 0;
Serial.printf("CO2 index: %d\r\n", co2Ppm);
Serial.printf("CO2 (ppm): %d\r\n", co2Ppm);
} else {
getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
@ -1082,7 +1083,7 @@ void webServerHandler(void *param) {
static void webServerInit(void) {
String host = "airgradient_" + getDevId();
if (!MDNS.begin(host)) {
Serial.println("Init MDNS failed");
Serial.println("Init mDNS failed");
return;
}
@ -1091,9 +1092,16 @@ static void webServerInit(void) {
webServer.on("/metrics", HTTP_GET, webServerMetricsGet);
webServer.begin();
MDNS.addService("http", "tcp", 80);
MDNS.addServiceTxt("http", "_tcp", "model", ag.getBoardName());
MDNS.addServiceTxt("http", "_tcp", "model", mdnsModelName);
MDNS.addServiceTxt("http", "_tcp", "serialno", getDevId());
MDNS.addServiceTxt("http", "_tcp", "fw_ver", ag.getVersion());
MDNS.addServiceTxt("http", "_tcp", "vendor", "AirGradient");
MDNS.addService("http", "tcp", 80);
MDNS.addService("_airgradient", "tcp", 80);
MDNS.addServiceTxt("airgradient", "_tcp", "model", mdnsModelName);
MDNS.addServiceTxt("airgradient", "_tcp", "serialno", getDevId());
MDNS.addServiceTxt("airgradient", "_tcp", "fw_ver", ag.getVersion());
MDNS.addServiceTxt("airgradient", "_tcp", "vendor", "AirGradient");
if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) !=
pdTRUE) {
@ -1171,9 +1179,9 @@ static void createMqttTask(void) {
String topic = "airgradient/readings/" + getDevId();
if (agMqtt.publish(topic.c_str(), syncData.c_str(),
syncData.length())) {
Serial.println("Mqtt sync success");
Serial.println("MQTT sync success");
} else {
Serial.println("Mqtt sync failure");
Serial.println("MQTT sync failure");
}
}
}
@ -1336,7 +1344,7 @@ static void displayShowDashboard(String err) {
u8g2.drawStr(105, 10, strBuf);
}
} else {
Serial.println("Disp show error: " + err);
Serial.println("Display show error: " + err);
int strWidth = u8g2.getStrWidth(err.c_str());
u8g2.drawStr((126 - strWidth) / 2, 10, err.c_str());
@ -1753,7 +1761,7 @@ static void updateServerConfiguration(void) {
if (hasSensorS8) {
co2Calibration();
} else {
Serial.println("CO2 S8 not available, calib ignored");
Serial.println("CO2 S8 not available, calibration ignored");
}
}
@ -1765,13 +1773,13 @@ static void updateServerConfiguration(void) {
int curHour = ag.s8.getAbcPeriod();
Serial.printf("Current config: %d (hours)\r\n", curHour);
if (curHour == newHour) {
Serial.println("set 'abcDays' ignored");
Serial.println("Set 'abcDays' ignored");
} else {
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
false) {
Serial.println("Set S8 abcDays period calib failed");
Serial.println("Set S8 abcDays period calibration failed");
} else {
Serial.println("Set S8 abcDays period calib success");
Serial.println("Set S8 abcDays period calibration success");
}
}
} else {
@ -1796,10 +1804,10 @@ static void updateServerConfiguration(void) {
mqttTask = NULL;
}
if (agMqtt.begin(mqttUri)) {
Serial.println("Connect to new mqtt broker success");
Serial.println("Connect to MQTT broker successful");
createMqttTask();
} else {
Serial.println("Connect to new mqtt broker failed");
Serial.println("Connect to MQTT broker failed");
}
}
}
@ -2102,7 +2110,16 @@ static void dispSmHandler(int sm) {
break;
}
case APP_SM_SENSOR_CONFIG_FAILED: {
displayShowDashboard("Add to Dashboard");
uint32_t ms = (uint32_t)(millis() - addToDashboardTime);
if (ms >= 5000) {
addToDashboardTime = millis();
if (isAddToDashboard) {
displayShowDashboard("Add to Dashboard");
} else {
displayShowDashboard(getDevId());
}
isAddToDashboard = !isAddToDashboard;
}
break;
}
case APP_SM_NORMAL: {
@ -2204,10 +2221,10 @@ static void tvocUpdate(void) {
noxRawIndex = ag.sgp41.getNoxRaw();
Serial.println();
Serial.printf(" TVOC index: %d\r\n", tvocIndex);
Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex);
Serial.printf(" NOx index: %d\r\n", noxIndex);
Serial.printf(" NOx raw index: %d\r\n", noxRawIndex);
Serial.printf("TVOC index: %d\r\n", tvocIndex);
Serial.printf("TVOC raw: %d\r\n", tvocRawIndex);
Serial.printf("NOx index: %d\r\n", noxIndex);
Serial.printf("NOx raw: %d\r\n", noxRawIndex);
}
/**
@ -2222,14 +2239,14 @@ static void pmUpdate(void) {
pm03PCount = ag.pms5003.getPm03ParticleCount();
Serial.println();
Serial.printf(" PMS0.1: %d\r\n", pm01);
Serial.printf(" PMS2.5: %d\r\n", pm25);
Serial.printf(" PMS10.0: %d\r\n", pm10);
Serial.printf("PMS3.0 Count: %d\r\n", pm03PCount);
Serial.printf("PM1 ug/m3: %d\r\n", pm01);
Serial.printf("PM2.5 ug/m3: %d\r\n", pm25);
Serial.printf("PM10 ug/m3: %d\r\n", pm10);
Serial.printf("PM0.3 Count: %d\r\n", pm03PCount);
pmFailCount = 0;
} else {
pmFailCount++;
Serial.printf("PM read failed: %d\r\n", pmFailCount);
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
if (pmFailCount >= 3) {
pm01 = -1;
pm25 = -1;
@ -2261,10 +2278,10 @@ static void tempHumUpdate(void) {
temp = ag.sht.getTemperature();
hum = ag.sht.getRelativeHumidity();
Serial.printf("Temperature: %0.2f\r\n", temp);
Serial.printf(" Humidity: %d\r\n", hum);
Serial.printf("Temperature in C: %0.2f\r\n", temp);
Serial.printf("Relative Humidity: %d\r\n", hum);
} else {
Serial.println("Measure SHT failed");
Serial.println("SHT read failed");
}
}

View File

@ -430,13 +430,12 @@ public:
*/
void showServerConfig(void) {
Serial.println("Server configuration: ");
Serial.printf(" inF: %s\r\n", config.inF ? "true" : "false");
Serial.printf(" inUSAQI: %s\r\n",
config.inUSAQI ? "true" : "false");
Serial.printf(" useRGBLedBar: %d\r\n", (int)config.useRGBLedBar);
Serial.printf(" Model: %s\r\n", config.models);
Serial.printf(" Mqtt Broker: %s\r\n", config.mqttBrokers);
Serial.printf(" S8 calib period: %d\r\n", co2AbcCalib);
Serial.printf("inF: %s\r\n", config.inF ? "true" : "false");
Serial.printf("inUSAQI: %s\r\n", config.inUSAQI ? "true" : "false");
Serial.printf("useRGBLedBar: %d\r\n", (int)config.useRGBLedBar);
Serial.printf("Model: %s\r\n", config.models);
Serial.printf("MQTT Broker: %s\r\n", config.mqttBrokers);
Serial.printf("S8 calibration period: %d\r\n", co2AbcCalib);
}
/**
@ -567,19 +566,19 @@ public:
/** init client */
client = esp_mqtt_client_init(&config);
if (client == NULL) {
Serial.println("mqtt client init failed");
Serial.println("MQTT client init failed");
return false;
}
/** Register event */
if (esp_mqtt_client_register_event(client, MQTT_EVENT_ANY,
mqtt_event_handler, NULL) != ESP_OK) {
Serial.println("mqtt client register event failed");
Serial.println("MQTT client register event failed");
return false;
}
if (esp_mqtt_client_start(client) != ESP_OK) {
Serial.println("mqtt client start failed");
Serial.println("MQTT client start failed");
return false;
}
@ -701,7 +700,8 @@ const int targetCount = 20;
enum {
FW_MODE_PST, /** PMS5003T, S8 and SGP41 */
FW_MODE_PPT, /** PMS5003T_1, PMS5003T_2, SGP41 */
FW_MODE_PP /** PMS5003T_1, PMS5003T_2 */
FW_MODE_PP, /** PMS5003T_1, PMS5003T_2 */
FW_MDOE_PS /** PMS5003T, S8 */
};
int fw_mode = FW_MODE_PST;
@ -950,9 +950,10 @@ void boardInit(void) {
if (hasSensorS8 == false) {
fw_mode = FW_MODE_PP;
Serial.println("Can not detect SGP run mode 'PP'");
Serial.println("Can not detect SGP run mode 'O-1PP'");
} else {
Serial.println("Can not detect SGP run mode 'PST' without SGP");
Serial.println("Can not detect SGP run mode 'O-1PS'");
fw_mode = FW_MDOE_PS;
}
}
@ -1004,6 +1005,21 @@ void boardInit(void) {
}
Serial.printf("Firmware Mode: %s\r\n", getFwMode(fw_mode));
switch (fw_mode) {
case FW_MODE_PP:
mdnsModelName = "O-1PP";
break;
case FW_MODE_PPT:
mdnsModelName = "O-1PPT";
break;
case FW_MODE_PST:
mdnsModelName = "O-1PST";
break;
case FW_MDOE_PS:
mdnsModelName = "0-1PS";
default:
break;
}
}
void failedHandler(String msg) {
@ -1016,7 +1032,7 @@ void failedHandler(String msg) {
void co2Calibration(void) {
/** Count down for co2CalibCountdown secs */
for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) {
Serial.printf("Start CO2 calib after %d sec\r\n",
Serial.printf("Start CO2 calibration after %d sec\r\n",
SENSOR_CO2_CALIB_COUNTDOWN_MAX - i);
delay(1000);
}
@ -1024,16 +1040,16 @@ void co2Calibration(void) {
if (ag.s8.setBaselineCalibration()) {
Serial.println("Calibration success");
delay(1000);
Serial.println("Wait for calib finish...");
Serial.println("Wait for calibration to finish...");
int count = 0;
while (ag.s8.isBaseLineCalibrationDone() == false) {
delay(1000);
count++;
}
Serial.printf("Calib finish after %d sec\r\n", count);
Serial.printf("Calibration finished after %d sec\r\n", count);
delay(2000);
} else {
Serial.println("Calibration failure!!!");
Serial.println("Calibration failure");
delay(2000);
}
}
@ -1055,7 +1071,7 @@ static void updateWiFiConnect(void) {
lastRetry = millis();
WiFi.reconnect();
Serial.printf("Re-Connect WiFi\r\n");
Serial.printf("Re-Connect to WiFi\r\n");
}
}
@ -1070,10 +1086,10 @@ static void tvocUpdate(void) {
noxRawIndex = ag.sgp41.getNoxRaw();
Serial.println();
Serial.printf(" TVOC index: %d\r\n", tvocIndex);
Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex);
Serial.printf(" NOx index: %d\r\n", noxIndex);
Serial.printf(" NOx raw index: %d\r\n", noxRawIndex);
Serial.printf("TVOC index: %d\r\n", tvocIndex);
Serial.printf("TVOC raw: %d\r\n", tvocRawIndex);
Serial.printf("NOx index: %d\r\n", noxIndex);
Serial.printf("NOx raw: %d\r\n", noxRawIndex);
}
/**
@ -1094,12 +1110,12 @@ static void pmUpdate(void) {
pmsResult_1 = true;
Serial.println();
Serial.printf("[1] PMS0.1: %d\r\n", pm01_1);
Serial.printf("[1] PMS2.5: %d\r\n", pm25_1);
Serial.printf("[1] PMS10.0: %d\r\n", pm10_1);
Serial.printf("[1]PMS3.0 Count: %d\r\n", pm03PCount_1);
Serial.printf("[1] Temperature: %0.2f\r\n", temp_1);
Serial.printf("[1] Humidity: %d\r\n", hum_1);
Serial.printf("[1] PM1 ug/m3: %d\r\n", pm01_1);
Serial.printf("[1] PM2.5 ug/m3: %d\r\n", pm25_1);
Serial.printf("[1] PM10 ug/m3: %d\r\n", pm10_1);
Serial.printf("[1] PM3.0 Count: %d\r\n", pm03PCount_1);
Serial.printf("[1] Temperature in C: %0.2f\r\n", temp_1);
Serial.printf("[1] Relative Humidity: %d\r\n", hum_1);
} else {
pm01_1 = -1;
pm25_1 = -1;
@ -1120,12 +1136,12 @@ static void pmUpdate(void) {
pmsResult_2 = true;
Serial.println();
Serial.printf("[2] PMS0.1: %d\r\n", pm01_2);
Serial.printf("[2] PMS2.5: %d\r\n", pm25_2);
Serial.printf("[2] PMS10.0: %d\r\n", pm10_2);
Serial.printf("[2]PMS3.0 Count: %d\r\n", pm03PCount_2);
Serial.printf("[2] Temperature: %0.2f\r\n", temp_2);
Serial.printf("[2] Humidity: %d\r\n", hum_2);
Serial.printf("[2] PM1 ug/m3: %d\r\n", pm01_2);
Serial.printf("[2] PM2.5 ug/m3: %d\r\n", pm25_2);
Serial.printf("[2] PM10 ug/m3: %d\r\n", pm10_2);
Serial.printf("[2] PM3.0 Count: %d\r\n", pm03PCount_2);
Serial.printf("[2] Temperature in C: %0.2f\r\n", temp_2);
Serial.printf("[2] Relative Humidity: %d\r\n", hum_2);
} else {
pm01_2 = -1;
pm25_2 = -1;
@ -1193,7 +1209,7 @@ static void co2Update(void) {
if (value >= 0) {
co2Ppm = value;
getCO2FailCount = 0;
Serial.printf("CO2 index: %d\r\n", co2Ppm);
Serial.printf("CO2 ppm: %d\r\n", co2Ppm);
} else {
getCO2FailCount++;
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
@ -1211,7 +1227,7 @@ static void updateServerConfiguration(void) {
if (hasSensorS8) {
co2Calibration();
} else {
Serial.println("CO2 S8 not available, calib ignored");
Serial.println("CO2 S8 not available, calibration ignored");
}
}
@ -1223,13 +1239,13 @@ static void updateServerConfiguration(void) {
int curHour = ag.s8.getAbcPeriod();
Serial.printf("Current config: %d (hours)\r\n", curHour);
if (curHour == newHour) {
Serial.println("set 'abcDays' ignored");
Serial.println("Set 'abcDays' ignored");
} else {
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
false) {
Serial.println("Set S8 abcDays period calib failed");
Serial.println("Set S8 abcDays period calibration failed");
} else {
Serial.println("Set S8 abcDays period calib success");
Serial.println("Set S8 abcDays period calibration success");
}
}
}
@ -1246,10 +1262,10 @@ static void updateServerConfiguration(void) {
mqttTask = NULL;
}
if (agMqtt.begin(mqttUri)) {
Serial.println("Connect to new mqtt broker success");
Serial.println("Connect to MQTT broker successful");
createMqttTask();
} else {
Serial.println("Connect to new mqtt broker failed");
Serial.println("Connect to MQTT broker failed");
}
}
}
@ -1366,6 +1382,8 @@ static const char *getFwMode(int mode) {
return "FW_MODE_PPT";
case FW_MODE_PP:
return "FW_MODE_PP";
case FW_MDOE_PS:
return "FW_MODE_PS";
default:
break;
}
@ -1394,9 +1412,16 @@ static void webServerInit(void) {
webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet);
webServer.begin();
MDNS.addService("http", "tcp", 80);
MDNS.addServiceTxt("http", "_tcp", "model", ag.getBoardName());
MDNS.addServiceTxt("http", "_tcp", "model", mdnsModelName);
MDNS.addServiceTxt("http", "_tcp", "serialno", getDevId());
MDNS.addServiceTxt("http", "_tcp", "fw_ver", ag.getVersion());
MDNS.addServiceTxt("http", "_tcp", "vendor", "AirGradient");
MDNS.addService("http", "tcp", 80);
MDNS.addService("_airgradient", "tcp", 80);
MDNS.addServiceTxt("airgradient", "_tcp", "model", mdnsModelName);
MDNS.addServiceTxt("airgradient", "_tcp", "serialno", getDevId());
MDNS.addServiceTxt("airgradient", "_tcp", "fw_ver", ag.getVersion());
MDNS.addServiceTxt("airgradient", "_tcp", "vendor", "AirGradient");
if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) !=
pdTRUE) {

View File

@ -1,5 +1,5 @@
name=AirGradient Air Quality Sensor
version=3.0.6
version=3.0.7
author=AirGradient <support@airgradient.com>
maintainer=AirGradient <support@airgradient.com>
sentence=ESP32-C3 / ESP8266 library for air quality monitor measuring PM, CO2, Temperature, TVOC and Humidity with OLED display.

View File

@ -1,6 +1,6 @@
#include "AirGradient.h"
#define AG_LIB_VER "3.0.6"
#define AG_LIB_VER "3.0.7"
AirGradient::AirGradient(BoardType type)
: pms5003(type), pms5003t_1(type), pms5003t_2(type), s8(type), sgp41(type),