Skip to content

Commit 3226c14

Browse files
authored
Merge pull request #278 from airgradienthq/feat/disable-cloud
Fully disable cloud connection to airgradient server option
2 parents 2c27c69 + 0e26aa1 commit 3226c14

File tree

14 files changed

+284
-171
lines changed

14 files changed

+284
-171
lines changed

docs/local-server.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,14 @@ If the monitor is set up on the AirGradient dashboard, it will also receive the
154154
| `ledBarTestRequested` | Can be set to trigger a test. | Boolean | `true` : LEDs will run test sequence | `{"ledBarTestRequested": true}` |
155155
| `noxLearningOffset` | Set NOx learning gain offset. | Number | 0-720 (default 12) | `{"noxLearningOffset": 12}` |
156156
| `tvocLearningOffset` | Set VOC learning gain offset. | Number | 0-720 (default 12) | `{"tvocLearningOffset": 12}` |
157-
| `offlineMode` | Set monitor to run without WiFi. | Boolean | `false`: Disabled (default) <br> `true`: Enabled | `{"offlineMode": true}` |
158157
| `monitorDisplayCompensatedValues` | Set the display show the PM value with/without compensate value (only on [3.1.9]()) | Boolean | `false`: Without compensate (default) <br> `true`: with compensate | `{"monitorDisplayCompensatedValues": false }` |
159158
| `corrections` | Sets correction options to display and measurement values on local server response. (version >= [3.1.11]()) | Object | _see corrections section_ | _see corrections section_ |
160159

161160

161+
**Notes**
162+
163+
- `offlineMode` : the device will disable all network operation, and only show measurements on the display and ledbar; Read-Only; Change can be apply using reset button on boot.
164+
- `disableCloudConnection` : disable every request to AirGradient server, means features like post data to AirGradient server, configuration from AirGradient server and automatic firmware updates are disabled. This configuration overrides `configurationControl` and `postDataToAirGradient`; Read-Only; Change can be apply from wifi setup webpage.
162165

163166
#### Corrections
164167

examples/BASIC/BASIC.ino

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,12 @@ void setup() {
149149
initMqtt();
150150
sendDataToAg();
151151

152-
apiClient.fetchServerConfiguration();
152+
if (configuration.getConfigurationControl() !=
153+
ConfigurationControl::ConfigurationControlLocal) {
154+
apiClient.fetchServerConfiguration();
155+
}
153156
configSchedule.update();
154-
if (apiClient.isFetchConfigureFailed()) {
157+
if (apiClient.isFetchConfigurationFailed()) {
155158
if (apiClient.isNotAvailableOnDashboard()) {
156159
stateMachine.displaySetAddToDashBoard();
157160
stateMachine.displayHandle(
@@ -415,6 +418,14 @@ static void failedHandler(String msg) {
415418
}
416419

417420
static void configurationUpdateSchedule(void) {
421+
if (configuration.isOfflineMode() ||
422+
configuration.getConfigurationControl() == ConfigurationControl::ConfigurationControlLocal) {
423+
Serial.println("Ignore fetch server configuration. Either mode is offline "
424+
"or configurationControl set to local");
425+
apiClient.resetFetchConfigurationStatus();
426+
return;
427+
}
428+
418429
if (apiClient.fetchServerConfiguration()) {
419430
configUpdateHandle();
420431
}
@@ -472,7 +483,7 @@ static void appDispHandler(void) {
472483
if (configuration.isOfflineMode() == false) {
473484
if (wifiConnector.isConnected() == false) {
474485
state = AgStateMachineWiFiLost;
475-
} else if (apiClient.isFetchConfigureFailed()) {
486+
} else if (apiClient.isFetchConfigurationFailed()) {
476487
state = AgStateMachineSensorConfigFailed;
477488
if (apiClient.isNotAvailableOnDashboard()) {
478489
stateMachine.displaySetAddToDashBoard();
@@ -521,17 +532,21 @@ static void sendDataToServer(void) {
521532
int bootCount = measurements.bootCount() + 1;
522533
measurements.setBootCount(bootCount);
523534

524-
/** Ignore send data to server if postToAirGradient disabled */
525-
if (configuration.isPostDataToAirGradient() == false ||
526-
configuration.isOfflineMode()) {
535+
if (configuration.isOfflineMode() || !configuration.isPostDataToAirGradient()) {
536+
Serial.println("Skipping transmission of data to AG server. Either mode is offline "
537+
"or post data to server disabled");
538+
return;
539+
}
540+
541+
if (wifiConnector.isConnected() == false) {
542+
Serial.println("WiFi not connected, skipping data transmission to AG server");
527543
return;
528544
}
529545

530546
String syncData = measurements.toString(false, fwMode, wifiConnector.RSSI(), ag, configuration);
531547
if (apiClient.postToServer(syncData)) {
532548
Serial.println();
533-
Serial.println(
534-
"Online mode and isPostToAirGradient = true: watchdog reset");
549+
Serial.println("Online mode and isPostToAirGradient = true");
535550
Serial.println();
536551
}
537552
}

examples/BASIC/OpenMetrics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ String OpenMetrics::getPayload(void) {
4343
"1 if the AirGradient device was able to successfully fetch its "
4444
"configuration from the server",
4545
"gauge");
46-
add_metric_point("", apiClient.isFetchConfigureFailed() ? "0" : "1");
46+
add_metric_point("", apiClient.isFetchConfigurationFailed() ? "0" : "1");
4747

4848
add_metric(
4949
"post_ok",

examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,12 @@ void setup() {
149149
initMqtt();
150150
sendDataToAg();
151151

152-
apiClient.fetchServerConfiguration();
152+
if (configuration.getConfigurationControl() !=
153+
ConfigurationControl::ConfigurationControlLocal) {
154+
apiClient.fetchServerConfiguration();
155+
}
153156
configSchedule.update();
154-
if (apiClient.isFetchConfigureFailed()) {
157+
if (apiClient.isFetchConfigurationFailed()) {
155158
if (apiClient.isNotAvailableOnDashboard()) {
156159
stateMachine.displaySetAddToDashBoard();
157160
stateMachine.displayHandle(
@@ -467,6 +470,14 @@ static void failedHandler(String msg) {
467470
}
468471

469472
static void configurationUpdateSchedule(void) {
473+
if (configuration.isOfflineMode() ||
474+
configuration.getConfigurationControl() == ConfigurationControl::ConfigurationControlLocal) {
475+
Serial.println("Ignore fetch server configuration. Either mode is offline "
476+
"or configurationControl set to local");
477+
apiClient.resetFetchConfigurationStatus();
478+
return;
479+
}
480+
470481
if (apiClient.fetchServerConfiguration()) {
471482
configUpdateHandle();
472483
}
@@ -524,7 +535,7 @@ static void appDispHandler(void) {
524535
if (configuration.isOfflineMode() == false) {
525536
if (wifiConnector.isConnected() == false) {
526537
state = AgStateMachineWiFiLost;
527-
} else if (apiClient.isFetchConfigureFailed()) {
538+
} else if (apiClient.isFetchConfigurationFailed()) {
528539
state = AgStateMachineSensorConfigFailed;
529540
if (apiClient.isNotAvailableOnDashboard()) {
530541
stateMachine.displaySetAddToDashBoard();
@@ -573,17 +584,21 @@ static void sendDataToServer(void) {
573584
int bootCount = measurements.bootCount() + 1;
574585
measurements.setBootCount(bootCount);
575586

576-
/** Ignore send data to server if postToAirGradient disabled */
577-
if (configuration.isPostDataToAirGradient() == false ||
578-
configuration.isOfflineMode()) {
587+
if (configuration.isOfflineMode() || !configuration.isPostDataToAirGradient()) {
588+
Serial.println("Skipping transmission of data to AG server. Either mode is offline "
589+
"or post data to server disabled");
590+
return;
591+
}
592+
593+
if (wifiConnector.isConnected() == false) {
594+
Serial.println("WiFi not connected, skipping data transmission to AG server");
579595
return;
580596
}
581597

582598
String syncData = measurements.toString(false, fwMode, wifiConnector.RSSI(), ag, configuration);
583599
if (apiClient.postToServer(syncData)) {
584600
Serial.println();
585-
Serial.println(
586-
"Online mode and isPostToAirGradient = true: watchdog reset");
601+
Serial.println("Online mode and isPostToAirGradient = true");
587602
Serial.println();
588603
}
589604
}

examples/DiyProIndoorV3_3/OpenMetrics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ String OpenMetrics::getPayload(void) {
4343
"1 if the AirGradient device was able to successfully fetch its "
4444
"configuration from the server",
4545
"gauge");
46-
add_metric_point("", apiClient.isFetchConfigureFailed() ? "0" : "1");
46+
add_metric_point("", apiClient.isFetchConfigurationFailed() ? "0" : "1");
4747

4848
add_metric(
4949
"post_ok",

examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,12 @@ void setup() {
176176
initMqtt();
177177
sendDataToAg();
178178

179-
apiClient.fetchServerConfiguration();
179+
if (configuration.getConfigurationControl() !=
180+
ConfigurationControl::ConfigurationControlLocal) {
181+
apiClient.fetchServerConfiguration();
182+
}
180183
configSchedule.update();
181-
if (apiClient.isFetchConfigureFailed()) {
184+
if (apiClient.isFetchConfigurationFailed()) {
182185
if (apiClient.isNotAvailableOnDashboard()) {
183186
stateMachine.displaySetAddToDashBoard();
184187
stateMachine.displayHandle(
@@ -507,6 +510,14 @@ static void failedHandler(String msg) {
507510
}
508511

509512
static void configurationUpdateSchedule(void) {
513+
if (configuration.isOfflineMode() ||
514+
configuration.getConfigurationControl() == ConfigurationControl::ConfigurationControlLocal) {
515+
Serial.println("Ignore fetch server configuration. Either mode is offline "
516+
"or configurationControl set to local");
517+
apiClient.resetFetchConfigurationStatus();
518+
return;
519+
}
520+
510521
if (apiClient.fetchServerConfiguration()) {
511522
configUpdateHandle();
512523
}
@@ -564,7 +575,7 @@ static void appDispHandler(void) {
564575
if (configuration.isOfflineMode() == false) {
565576
if (wifiConnector.isConnected() == false) {
566577
state = AgStateMachineWiFiLost;
567-
} else if (apiClient.isFetchConfigureFailed()) {
578+
} else if (apiClient.isFetchConfigurationFailed()) {
568579
state = AgStateMachineSensorConfigFailed;
569580
if (apiClient.isNotAvailableOnDashboard()) {
570581
stateMachine.displaySetAddToDashBoard();
@@ -614,17 +625,21 @@ static void sendDataToServer(void) {
614625
int bootCount = measurements.bootCount() + 1;
615626
measurements.setBootCount(bootCount);
616627

617-
/** Ignore send data to server if postToAirGradient disabled */
618-
if (configuration.isPostDataToAirGradient() == false ||
619-
configuration.isOfflineMode()) {
628+
if (configuration.isOfflineMode() || !configuration.isPostDataToAirGradient()) {
629+
Serial.println("Skipping transmission of data to AG server. Either mode is offline "
630+
"or post data to server disabled");
631+
return;
632+
}
633+
634+
if (wifiConnector.isConnected() == false) {
635+
Serial.println("WiFi not connected, skipping data transmission to AG server");
620636
return;
621637
}
622638

623639
String syncData = measurements.toString(false, fwMode, wifiConnector.RSSI(), ag, configuration);
624640
if (apiClient.postToServer(syncData)) {
625641
Serial.println();
626-
Serial.println(
627-
"Online mode and isPostToAirGradient = true: watchdog reset");
642+
Serial.println("Online mode and isPostToAirGradient = true");
628643
Serial.println();
629644
}
630645
}

examples/DiyProIndoorV4_2/OpenMetrics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ String OpenMetrics::getPayload(void) {
4343
"1 if the AirGradient device was able to successfully fetch its "
4444
"configuration from the server",
4545
"gauge");
46-
add_metric_point("", apiClient.isFetchConfigureFailed() ? "0" : "1");
46+
add_metric_point("", apiClient.isFetchConfigurationFailed() ? "0" : "1");
4747

4848
add_metric(
4949
"post_ok",

0 commit comments

Comments
 (0)