Compare commits

...

22 Commits
3.1.1 ... 3.1.2

Author SHA1 Message Date
2e62abe2d7 Merge pull request #156 from airgradienthq/develop
Develop
2024-05-29 18:02:27 +07:00
7569b114bf Merge pull request #155 from airgradienthq/feature/update-led-bar-button-test
Handle LED bar test button before init sensor initialize
2024-05-29 16:36:08 +07:00
3c1d0a862f update comment 2024-05-29 16:34:00 +07:00
4d883af77e Merge pull request #138 from airgradienthq/hotfix/ledbar-flickers
Fix LED bar flickers
2024-05-29 08:01:05 +07:00
e9224a5de0 Remove test logging message 2024-05-29 07:58:49 +07:00
af0fbadd80 Handle LED bar button test before init sensor. 2024-05-29 07:55:27 +07:00
79f6c040c7 Merge pull request #143 from airgradienthq/feature/reboot-after-wifi-connect-timeout
Reboot After 180s WiFi Manager not Connect.
2024-05-28 13:43:08 +07:00
f262866148 Merge pull request #154 from airgradienthq/hotfix/display-co2-calibration-message
Update CO2 calibration message show on display
2024-05-28 13:42:14 +07:00
78a2a78020 Update CO2 calibration message show on display 2024-05-25 20:25:50 +07:00
3fc7e4b55e Merge pull request #149 from airgradienthq/hotfix/reporting-fw-version-on-dashboard
Official OTA 3.1.1 version not reporting FW version on dashboard
2024-05-24 09:30:13 +07:00
5857388c2d Merge pull request #152 from airgradienthq/hotfix/remove-configuration-missleading-message
Remove `Update ignored due to local unofficial changes`
2024-05-24 09:01:04 +07:00
5770b41fd4 remove Update ignored due to local unofficial changes 2024-05-24 08:45:50 +07:00
d85d890878 Change OTA update period from 2h to 1h 2024-05-24 08:26:24 +07:00
9fbd31d0c8 Merge pull request #150 from airgradienthq/hotfix/show-message-monitor-not-setup-on-dashboard
disp.setText("Monitor not", "setup on", "dashboard") called when monitor is actually already on dashboard
2024-05-24 08:23:52 +07:00
c5b7c43293 disp.setText("Monitor not", "setup on", "dashboard") called when monitor is actually already on dashboard 2024-05-22 12:13:57 +07:00
7550ef7b0c change OTA update period each 2h. 2024-05-22 11:45:56 +07:00
805546b78e check firmware update after powerup 2024-05-22 11:34:42 +07:00
59880f4be5 fix typo 2024-05-22 11:17:11 +07:00
ee7837a471 Merge pull request #148 from MallocArray/patch-1
Correct API value for boot
2024-05-20 08:50:57 +07:00
ebbf0adf2f Correct API value for boot 2024-05-18 21:19:40 -05:00
d9551dc560 Reboot After 180s WiFi Manager not Connect. 2024-05-18 08:47:49 +07:00
f35bc4feaa Fix LED bar flickers 2024-05-17 11:52:22 +07:00
11 changed files with 110 additions and 41 deletions

View File

@ -224,7 +224,7 @@ static void failedHandler(String msg) {
static void executeCo2Calibration(void) { static void executeCo2Calibration(void) {
/** Count down for co2CalibCountdown secs */ /** Count down for co2CalibCountdown secs */
for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) { for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) {
displayShowText("CO2 calib", "after", displayShowText("CO2 calib.", "after",
String(SENSOR_CO2_CALIB_COUNTDOWN_MAX - i) + " sec"); String(SENSOR_CO2_CALIB_COUNTDOWN_MAX - i) + " sec");
delay(1000); delay(1000);
} }
@ -232,16 +232,16 @@ static void executeCo2Calibration(void) {
if (ag.s8.setBaselineCalibration()) { if (ag.s8.setBaselineCalibration()) {
displayShowText("Calib", "success", ""); displayShowText("Calib", "success", "");
delay(1000); delay(1000);
displayShowText("Wait for", "finish", "..."); displayShowText("Wait to", "complete", "...");
int count = 0; int count = 0;
while (ag.s8.isBaseLineCalibrationDone() == false) { while (ag.s8.isBaseLineCalibrationDone() == false) {
delay(1000); delay(1000);
count++; count++;
} }
displayShowText("Finish", "after", String(count) + " sec"); displayShowText("Finished", "after", String(count) + " sec");
delay(DISPLAY_DELAY_SHOW_CONTENT_MS); delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
} else { } else {
displayShowText("Calib", "failure!!!", ""); displayShowText("Calibration", "failure", "");
delay(DISPLAY_DELAY_SHOW_CONTENT_MS); delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
} }
} }

View File

@ -152,8 +152,6 @@ void setup() {
} }
Serial.println("Detected " + ag->getBoardName()); Serial.println("Detected " + ag->getBoardName());
/** Init sensor */
boardInit();
configuration.setAirGradient(ag); configuration.setAirGradient(ag);
oledDisplay.setAirGradient(ag); oledDisplay.setAirGradient(ag);
stateMachine.setAirGradient(ag); stateMachine.setAirGradient(ag);
@ -162,11 +160,13 @@ void setup() {
openMetrics.setAirGradient(ag); openMetrics.setAirGradient(ag);
localServer.setAirGraident(ag); localServer.setAirGraident(ag);
/** Init sensor */
boardInit();
/** Connecting wifi */ /** Connecting wifi */
bool connectToWifi = false; bool connectToWifi = false;
if (ag->isOne()) { if (ag->isOne()) {
if (ledBarButtonTest) { if (ledBarButtonTest) {
stateMachine.executeLedBarPowerUpTest();
if (ag->button.getState() == PushButton::BUTTON_PRESSED) { if (ag->button.getState() == PushButton::BUTTON_PRESSED) {
WiFi.begin("airgradient", "cleanair"); WiFi.begin("airgradient", "cleanair");
Serial.println("WiFi Credential reset to factory defaults"); Serial.println("WiFi Credential reset to factory defaults");
@ -219,15 +219,20 @@ void setup() {
#ifdef ESP8266 #ifdef ESP8266
// ota not supported // ota not supported
#else #else
// otaHandler.updateFirmwareIfOutdated(ag->deviceId()); otaHandler.updateFirmwareIfOutdated(ag->deviceId());
/** Update first OTA */
measurements.otaBootCount = 0;
#endif #endif
apiClient.fetchServerConfiguration(); apiClient.fetchServerConfiguration();
configSchedule.update(); configSchedule.update();
if (apiClient.isFetchConfigureFailed()) { if (apiClient.isFetchConfigureFailed()) {
if (ag->isOne()) { if (ag->isOne()) {
stateMachine.displayHandle( if (apiClient.isNotAvailableOnDashboard()) {
AgStateMachineWiFiOkServerOkSensorConfigFailed); stateMachine.displayHandle(
AgStateMachineWiFiOkServerOkSensorConfigFailed);
}
} }
stateMachine.handleLeds( stateMachine.handleLeds(
AgStateMachineWiFiOkServerOkSensorConfigFailed); AgStateMachineWiFiOkServerOkSensorConfigFailed);
@ -235,6 +240,9 @@ void setup() {
} else { } else {
ledBarEnabledUpdate(); ledBarEnabledUpdate();
} }
} else {
oledDisplay.showRebooting();
delay(2500);
} }
} }
} }
@ -459,9 +467,10 @@ static void ledBarEnabledUpdate(void) {
if ((brightness == 0) || (configuration.getLedBarMode() == LedBarModeOff)) { if ((brightness == 0) || (configuration.getLedBarMode() == LedBarModeOff)) {
ag->ledBar.setEnable(false); ag->ledBar.setEnable(false);
} else { } else {
ag->ledBar.setBrighness(brightness); ag->ledBar.setBrightness(brightness);
ag->ledBar.setEnable(configuration.getLedBarMode() != LedBarModeOff); ag->ledBar.setEnable(configuration.getLedBarMode() != LedBarModeOff);
} }
ag->ledBar.show();
} }
} }
@ -615,6 +624,23 @@ static void oneIndoorInit(void) {
ag->button.begin(); ag->button.begin();
ag->watchdog.begin(); ag->watchdog.begin();
/** Run LED test on start up if button pressed */
oledDisplay.setText("Press now for", "LED test", "");
ledBarButtonTest = false;
uint32_t stime = millis();
while (true) {
if (ag->button.getState() == ag->button.BUTTON_PRESSED) {
ledBarButtonTest = true;
stateMachine.executeLedBarPowerUpTest();
break;
}
delay(1);
uint32_t ms = (uint32_t)(millis() - stime);
if (ms >= 3000) {
break;
}
}
/** Init sensor SGP41 */ /** Init sensor SGP41 */
if (sgp41Init() == false) { if (sgp41Init() == false) {
dispSensorNotFound("SGP41"); dispSensorNotFound("SGP41");
@ -641,22 +667,6 @@ static void oneIndoorInit(void) {
dispSensorNotFound("PMS"); dispSensorNotFound("PMS");
} }
/** Run LED test on start up */
oledDisplay.setText("Press now for", "LED test", "");
ledBarButtonTest = false;
uint32_t stime = millis();
while (true) {
if (ag->button.getState() == ag->button.BUTTON_PRESSED) {
ledBarButtonTest = true;
break;
}
delay(1);
uint32_t ms = (uint32_t)(millis() - stime);
if (ms >= 3000) {
break;
}
}
} }
static void openAirInit(void) { static void openAirInit(void) {
configuration.hasSensorSHT = false; configuration.hasSensorSHT = false;
@ -804,10 +814,6 @@ static void configUpdateHandle() {
return; return;
} }
if (ag->isOne()) {
ledBarEnabledUpdate();
stateMachine.executeLedBarTest();
}
stateMachine.executeCo2Calibration(); stateMachine.executeCo2Calibration();
String mqttUri = configuration.getMqttBrokerUri(); String mqttUri = configuration.getMqttBrokerUri();
@ -843,15 +849,36 @@ static void configUpdateHandle() {
if (ag->isOne()) { if (ag->isOne()) {
if (configuration.isLedBarBrightnessChanged()) { if (configuration.isLedBarBrightnessChanged()) {
ag->ledBar.setBrighness(configuration.getLedBarBrightness()); if (configuration.getLedBarBrightness() == 0) {
Serial.println("Set 'LedBarBrightness' brightness: " + ag->ledBar.setEnable(false);
String(configuration.getLedBarBrightness())); } else {
if (configuration.getLedBarMode() != LedBarMode::LedBarModeOff) {
ag->ledBar.setEnable(true);
}
ag->ledBar.setBrightness(configuration.getLedBarBrightness());
}
ag->ledBar.show();
} }
if (configuration.isLedBarModeChanged()) {
if (configuration.getLedBarBrightness() == 0) {
ag->ledBar.setEnable(false);
} else {
if(configuration.getLedBarMode() == LedBarMode::LedBarModeOff) {
ag->ledBar.setEnable(false);
} else {
ag->ledBar.setEnable(true);
ag->ledBar.setBrightness(configuration.getLedBarBrightness());
}
}
ag->ledBar.show();
}
if (configuration.isDisplayBrightnessChanged()) { if (configuration.isDisplayBrightnessChanged()) {
oledDisplay.setBrightness(configuration.getDisplayBrightness()); oledDisplay.setBrightness(configuration.getDisplayBrightness());
Serial.println("Set 'DisplayBrightness' brightness: " +
String(configuration.getDisplayBrightness()));
} }
stateMachine.executeLedBarTest();
} }
fwNewVersion = configuration.newFirmwareVersion(); fwNewVersion = configuration.newFirmwareVersion();
@ -861,7 +888,9 @@ static void configUpdateHandle() {
doOta = true; doOta = true;
Serial.println("First OTA"); Serial.println("First OTA");
} else { } else {
if ((measurements.bootCount - measurements.otaBootCount) >= 30) { /** Only check for update each 1h*/
const float otaBootCount = 60.0f / (SERVER_SYNC_INTERVAL / 60000.0f);
if ((measurements.bootCount - measurements.otaBootCount) >= (int)otaBootCount) {
doOta = true; doOta = true;
} else { } else {
Serial.println( Serial.println(

View File

@ -69,11 +69,17 @@ bool AgApiClient::fetchServerConfiguration(void) {
if (retCode != 200) { if (retCode != 200) {
client.end(); client.end();
getConfigFailed = true; getConfigFailed = true;
/** Return code 400 mean device not setup on cloud. */
if (retCode == 400) {
notAvailableOnDashboard = true;
}
return false; return false;
} }
/** clear failed */ /** clear failed */
getConfigFailed = false; getConfigFailed = false;
notAvailableOnDashboard = false;
/** Get response string */ /** Get response string */
String respContent = client.getString(); String respContent = client.getString();
@ -144,6 +150,17 @@ bool AgApiClient::isFetchConfigureFailed(void) { return getConfigFailed; }
*/ */
bool AgApiClient::isPostToServerFailed(void) { return postToServerFailed; } bool AgApiClient::isPostToServerFailed(void) { return postToServerFailed; }
/**
* @brief Get status device has available on dashboard or not. should get after
* fetch configuration return failed
*
* @return true
* @return false
*/
bool AgApiClient::isNotAvailableOnDashboard(void) {
return notAvailableOnDashboard;
}
void AgApiClient::setAirGradient(AirGradient *ag) { this->ag = ag; } void AgApiClient::setAirGradient(AirGradient *ag) { this->ag = ag; }
/** /**

View File

@ -23,6 +23,7 @@ private:
bool getConfigFailed; bool getConfigFailed;
bool postToServerFailed; bool postToServerFailed;
bool notAvailableOnDashboard = false; // Device not setup on Airgradient cloud dashboard.
public: public:
AgApiClient(Stream &stream, Configuration &config); AgApiClient(Stream &stream, Configuration &config);
@ -33,6 +34,7 @@ public:
bool postToServer(String data); bool postToServer(String data);
bool isFetchConfigureFailed(void); bool isFetchConfigureFailed(void);
bool isPostToServerFailed(void); bool isPostToServerFailed(void);
bool isNotAvailableOnDashboard(void);
void setAirGradient(AirGradient *ag); void setAirGradient(AirGradient *ag);
bool sendPing(int rssi, int bootCount); bool sendPing(int rssi, int bootCount);
}; };

View File

@ -372,6 +372,7 @@ bool Configuration::parse(String data, bool isLocal) {
} }
} }
_ledBarModeChanged = false;
if (JSON.typeof_(root[jprop_ledBarMode]) == "string") { if (JSON.typeof_(root[jprop_ledBarMode]) == "string") {
String mode = root[jprop_ledBarMode]; String mode = root[jprop_ledBarMode];
if (mode == getLedBarModeName(LedBarMode::LedBarModeCO2) || if (mode == getLedBarModeName(LedBarMode::LedBarModeCO2) ||
@ -380,6 +381,7 @@ bool Configuration::parse(String data, bool isLocal) {
String oldMode = jconfig[jprop_ledBarMode]; String oldMode = jconfig[jprop_ledBarMode];
if (mode != oldMode) { if (mode != oldMode) {
jconfig[jprop_ledBarMode] = mode; jconfig[jprop_ledBarMode] = mode;
_ledBarModeChanged = true;
changed = true; changed = true;
} }
} else { } else {
@ -559,6 +561,7 @@ bool Configuration::parse(String data, bool isLocal) {
} }
} }
ledBarBrightnessChanged = false;
if (JSON.typeof_(root[jprop_ledBarBrightness]) == "number") { if (JSON.typeof_(root[jprop_ledBarBrightness]) == "number") {
int value = root[jprop_ledBarBrightness]; int value = root[jprop_ledBarBrightness];
int oldValue = jconfig[jprop_ledBarBrightness]; int oldValue = jconfig[jprop_ledBarBrightness];
@ -628,7 +631,6 @@ bool Configuration::parse(String data, bool isLocal) {
saveConfig(); saveConfig();
printConfig(); printConfig();
} else { } else {
logInfo("Update ignored due to local unofficial changes");
if (ledBarTestRequested || co2CalibrationRequested) { if (ledBarTestRequested || co2CalibrationRequested) {
udpated = true; udpated = true;
} }
@ -1148,6 +1150,12 @@ void Configuration::setOfflineModeWithoutSave(bool offline) {
_offlineMode = offline; _offlineMode = offline;
} }
bool Configuration::isLedBarModeChanged(void) {
bool changed = _ledBarModeChanged;
_ledBarModeChanged = false;
return changed;
}
bool Configuration::isDisplayBrightnessChanged(void) { bool Configuration::isDisplayBrightnessChanged(void) {
bool changed = displayBrightnessChanged; bool changed = displayBrightnessChanged;
displayBrightnessChanged = false; displayBrightnessChanged = false;

View File

@ -18,6 +18,7 @@ private:
bool displayBrightnessChanged = false; bool displayBrightnessChanged = false;
String otaNewFirmwareVersion; String otaNewFirmwareVersion;
bool _offlineMode = false; bool _offlineMode = false;
bool _ledBarModeChanged = false;
AirGradient* ag; AirGradient* ag;
@ -80,6 +81,7 @@ public:
bool isOfflineMode(void); bool isOfflineMode(void);
void setOfflineMode(bool offline); void setOfflineMode(bool offline);
void setOfflineModeWithoutSave(bool offline); void setOfflineModeWithoutSave(bool offline);
bool isLedBarModeChanged(void);
}; };
#endif /** _AG_CONFIG_H_ */ #endif /** _AG_CONFIG_H_ */

View File

@ -384,3 +384,13 @@ void OledDisplay::showNewFirmwareFailed(void) {
setCentralText(60, String("Retry after 24h")); setCentralText(60, String("Retry after 24h"));
} while (DISP()->nextPage()); } while (DISP()->nextPage());
} }
void OledDisplay::showRebooting(void) {
DISP()->firstPage();
do {
DISP()->setFont(u8g2_font_t0_16_tf);
// setCentralText(20, "Firmware Update");
setCentralText(40, "Rebooting...");
// setCentralText(60, String("Retry after 24h"));
} while (DISP()->nextPage());
}

View File

@ -40,6 +40,7 @@ public:
void showNewFirmwareUpdating(String percent); void showNewFirmwareUpdating(String percent);
void showNewFirmwareSuccess(String count); void showNewFirmwareSuccess(String count);
void showNewFirmwareFailed(void); void showNewFirmwareFailed(void);
void showRebooting(void);
}; };
#endif /** _AG_OLED_DISPLAY_H_ */ #endif /** _AG_OLED_DISPLAY_H_ */

View File

@ -173,7 +173,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
root["noxRaw"] = this->NOxRaw; root["noxRaw"] = this->NOxRaw;
} }
} }
root["bootCount"] = bootCount; root["boot"] = bootCount;
if (localServer) { if (localServer) {
root["ledMode"] = config->getLedBarModeName(); root["ledMode"] = config->getLedBarModeName();

View File

@ -64,7 +64,7 @@ void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum) {
* *
* @param brightness Brightness (0 - 100)% * @param brightness Brightness (0 - 100)%
*/ */
void LedBar::setBrighness(uint8_t brightness) { void LedBar::setBrightness(uint8_t brightness) {
if (this->isBegin() == false) { if (this->isBegin() == false) {
return; return;
} }

View File

@ -19,7 +19,7 @@ public:
void begin(void); void begin(void);
void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum); void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum);
void setColor(uint8_t red, uint8_t green, uint8_t blue); void setColor(uint8_t red, uint8_t green, uint8_t blue);
void setBrighness(uint8_t brightness); void setBrightness(uint8_t brightness);
int getNumberOfLeds(void); int getNumberOfLeds(void);
void show(void); void show(void);
void clear(void); void clear(void);