@alteriom/painlessmesh 1.6.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +380 -143
  2. package/LICENSE +674 -674
  3. package/README.md +477 -434
  4. package/RELEASE_GUIDE.md +504 -418
  5. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
  6. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
  7. package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
  8. package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
  9. package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
  10. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
  11. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
  12. package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
  13. package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
  14. package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
  15. package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
  16. package/docs/PHASE1_GUIDE.md +349 -0
  17. package/docs/PHASE2_GUIDE.md +543 -0
  18. package/docs/README.md +77 -70
  19. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
  20. package/docs/alteriom/overview.md +507 -507
  21. package/docs/api/core-api.md +606 -606
  22. package/docs/architecture/mesh-architecture.md +378 -378
  23. package/docs/architecture/plugin-system.md +516 -516
  24. package/docs/getting-started/first-mesh.md +409 -409
  25. package/docs/getting-started/installation.md +274 -274
  26. package/docs/getting-started/quickstart.md +157 -157
  27. package/docs/improvements/FEATURE_PROPOSALS.md +337 -0
  28. package/docs/improvements/PHASE1_IMPLEMENTATION.md +325 -0
  29. package/docs/improvements/PHASE2_IMPLEMENTATION.md +567 -0
  30. package/docs/improvements/README.md +86 -68
  31. package/docs/improvements/ota-and-status-enhancements.md +911 -0
  32. package/docs/improvements/ota-status-architecture-diagrams.md +658 -0
  33. package/docs/improvements/ota-status-quick-reference.md +284 -0
  34. package/docs/platformio-publishing.md +255 -0
  35. package/docs/platformio-setup-summary.md +121 -0
  36. package/docs/troubleshooting/common-issues.md +520 -520
  37. package/docs/troubleshooting/faq.md +472 -472
  38. package/docs/tutorials/basic-examples.md +717 -717
  39. package/docs/wiki/API-Reference.md +245 -245
  40. package/docs/wiki/Complete-Documentation.md +122 -122
  41. package/examples/alteriom/README.md +139 -81
  42. package/examples/alteriom/alteriom.ino +186 -185
  43. package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
  44. package/examples/alteriom/platformio.ini +24 -24
  45. package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
  46. package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
  47. package/examples/alteriomImproved/platformio.ini +25 -0
  48. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
  49. package/examples/alteriomPhase1/phase1_features.ino +242 -0
  50. package/examples/alteriomPhase1/platformio.ini +25 -0
  51. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
  52. package/examples/alteriomPhase2/phase2_features.ino +186 -0
  53. package/examples/alteriomPhase2/platformio.ini +25 -0
  54. package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
  55. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
  56. package/examples/alteriomSensorNode/platformio.ini +25 -0
  57. package/examples/basic/basic.ino +66 -66
  58. package/examples/basic/platformio.ini +25 -25
  59. package/examples/bridge/bridge.ino +51 -51
  60. package/examples/bridge/mesh_event_publisher.hpp +253 -0
  61. package/examples/bridge/mesh_topology_reporter.hpp +303 -0
  62. package/examples/bridge/mqtt_command_bridge.hpp +459 -0
  63. package/examples/bridge/mqtt_status_bridge.hpp +519 -0
  64. package/examples/bridge/platformio.ini +25 -25
  65. package/examples/echoNode/echoNode.ino +33 -33
  66. package/examples/echoNode/platformio.ini +25 -25
  67. package/examples/logClient/logClient.ino +109 -109
  68. package/examples/logClient/platformio.ini +25 -25
  69. package/examples/logServer/logServer.ino +81 -81
  70. package/examples/logServer/platformio.ini +25 -25
  71. package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
  72. package/examples/meshCommandNode/meshCommandNode.ino +263 -0
  73. package/examples/meshCommandNode/platformio.ini +25 -0
  74. package/examples/mqttBridge/mqttBridge.ino +118 -118
  75. package/examples/mqttBridge/platformio.ini +26 -26
  76. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
  77. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
  78. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
  79. package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
  80. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
  81. package/examples/mqttCommandBridge/platformio.ini +26 -0
  82. package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
  83. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
  84. package/examples/mqttStatusBridge/platformio.ini +26 -0
  85. package/examples/mqttTopologyTest/README.md +467 -0
  86. package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
  87. package/examples/mqttTopologyTest/platformio.ini +26 -0
  88. package/examples/namedMesh/namedMesh.ino +97 -97
  89. package/examples/namedMesh/platformio.ini +25 -25
  90. package/examples/otaReceiver/otaReceiver.ino +79 -79
  91. package/examples/otaReceiver/platformio.ini +25 -25
  92. package/examples/otaSender/otaSender.ino +160 -151
  93. package/examples/otaSender/platformio.ini +25 -25
  94. package/examples/startHere/platformio.ini +25 -25
  95. package/examples/startHere/startHere.ino +159 -159
  96. package/examples/webServer/platformio.ini +27 -27
  97. package/examples/webServer/webServer.ino +89 -89
  98. package/keywords.txt +48 -48
  99. package/library.json +55 -34
  100. package/library.properties +10 -10
  101. package/package.json +86 -78
  102. package/src/AlteriomPainlessMesh.h +97 -97
  103. package/src/arduino/wifi.hpp +365 -365
  104. package/src/boost/asynctcp.hpp +279 -279
  105. package/src/painlessMesh.h +70 -70
  106. package/src/painlessMeshSTA.cpp +236 -236
  107. package/src/painlessMeshSTA.h +58 -58
  108. package/src/painlessTaskOptions.h +4 -4
  109. package/src/painlessmesh/base64.hpp +111 -111
  110. package/src/painlessmesh/buffer.hpp +229 -229
  111. package/src/painlessmesh/callback.hpp +91 -91
  112. package/src/painlessmesh/configuration.hpp +77 -77
  113. package/src/painlessmesh/connection.hpp +192 -192
  114. package/src/painlessmesh/layout.hpp +188 -188
  115. package/src/painlessmesh/logger.hpp +158 -158
  116. package/src/painlessmesh/memory.hpp +119 -119
  117. package/src/painlessmesh/mesh.hpp +761 -560
  118. package/src/painlessmesh/metrics.hpp +322 -322
  119. package/src/painlessmesh/ntp.hpp +263 -263
  120. package/src/painlessmesh/ota.hpp +582 -553
  121. package/src/painlessmesh/plugin.hpp +188 -188
  122. package/src/painlessmesh/protocol.hpp +813 -813
  123. package/src/painlessmesh/router.hpp +322 -322
  124. package/src/painlessmesh/tcp.hpp +71 -71
  125. package/src/painlessmesh/validation.hpp +238 -238
  126. package/src/plugin/performance.hpp +214 -214
  127. package/src/plugin/remote.hpp +64 -64
  128. package/src/scheduler.cpp +10 -10
  129. package/src/wifi.cpp +2 -2
@@ -1,151 +1,160 @@
1
- //************************************************************
2
- // this is an example that uses the painlessmesh library to
3
- // upload firmware to another node on the network.
4
- // This will upload to an ESP device running the otaReceiver.ino
5
- //
6
- // The naming convetions should be as follows for bin files
7
- // firmware_<hardware>_<role>.bin
8
- // To create your own binary files, export them and rename
9
- // them to follow this format, where hardware will be
10
- // "ESP8266" or "ESP32" (capitalized.)
11
- // If sending to the otacreceiver sketch, role should be
12
- // "otareceiver" (lowercase)
13
- //
14
- // This sketch assumes a Nodemcu-32s with an SD card
15
- // connected as shown in the jpg included in the sketch folder
16
- // This code may have to be reworked/hardware adjusted for
17
- // other boards or ESP8266. The core code works well though
18
- //
19
- // MAKE SURE YOUR UPLOADED OTA FIRMWARE INCLUDES OTA SUPPORT
20
- // OR YOU WILL LOSE THE ABILITY TO UPLOAD MORE FIRMWARE.
21
- // THE INCLUDED .bin DOES NOT HAVE OTA SUPPORT SO THIS MUST BE
22
- // REFLASHED
23
- //************************************************************
24
-
25
- #ifdef ESP32
26
- #else
27
- #define CS_PIN D8
28
- #endif
29
-
30
- #include "painlessMesh.h"
31
-
32
- #include <FS.h>
33
- #include "SD.h"
34
- #include "SPI.h"
35
-
36
- #define MESH_PREFIX "whateverYouLike"
37
- #define MESH_PASSWORD "somethingSneaky"
38
- #define MESH_PORT 5555
39
-
40
- #define OTA_PART_SIZE 1024 //How many bytes to send per OTA data packet
41
-
42
- painlessMesh mesh;
43
-
44
- void setup() {
45
- Serial.begin(115200);
46
- delay(1000);
47
- mesh.setDebugMsgTypes(
48
- ERROR | STARTUP | CONNECTION |
49
- DEBUG); // set before init() so that you can see startup messages
50
-
51
- mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
52
-
53
- // Bridge node, should (in most cases) be a root node. See [the
54
- // wiki](https://gitlab.com/painlessMesh/painlessMesh/wikis/Possible-challenges-in-mesh-formation)
55
- // for some background
56
- mesh.setRoot(true);
57
- // This node and all other nodes should ideally know the mesh contains a root,
58
- // so call this on all nodes
59
- mesh.setContainsRoot(true);
60
-
61
- delay(1000);
62
- #ifdef ESP32
63
- if (!SD.begin()) {
64
- #else
65
- if (!SD.begin(CS_PIN)) {
66
- #endif
67
- rebootEspWithReason("Could not mount SD card, restarting");
68
- }
69
-
70
- File dir = SD.open("/");
71
- while (true) {
72
- File entry = dir.openNextFile();
73
- if (!entry) { //End of files
74
- rebootEspWithReason("Could not find valid firmware, please validate");
75
- }
76
-
77
- //This block of code parses the file name to make sure it is valid.
78
- //It will also get the role and hardware the firmware is targeted at.
79
- if (!entry.isDirectory()) {
80
- TSTRING name = entry.name();
81
- if (name.length() > 1 && name.indexOf('_') != -1 &&
82
- name.indexOf('_') != name.lastIndexOf('_') &&
83
- name.indexOf('.') != -1) {
84
- TSTRING firmware = name.substring(1, name.indexOf('_'));
85
- TSTRING hardware =
86
- name.substring(name.indexOf('_') + 1, name.lastIndexOf('_'));
87
- TSTRING role =
88
- name.substring(name.lastIndexOf('_') + 1, name.indexOf('.'));
89
- TSTRING extension =
90
- name.substring(name.indexOf('.') + 1, name.length());
91
- if (firmware.equals("firmware") &&
92
- (hardware.equals("ESP8266") || hardware.equals("ESP32")) &&
93
- extension.equals("bin")) {
94
-
95
- Serial.println("OTA FIRMWARE FOUND, NOW BROADCASTING");
96
-
97
- //This is the important bit for OTA, up to now was just getting the file.
98
- //If you are using some other way to upload firmware, possibly from
99
- //mqtt or something, this is what needs to be changed.
100
- //This function could also be changed to support OTA of multiple files
101
- //at the same time, potentially through using the pkg.md5 as a key in
102
- //a map to determine which to send
103
- mesh.initOTASend(
104
- [&entry](painlessmesh::plugin::ota::DataRequest pkg,
105
- char* buffer) {
106
-
107
- //fill the buffer with the requested data packet from the node.
108
- entry.seek(OTA_PART_SIZE * pkg.partNo);
109
- entry.readBytes(buffer, OTA_PART_SIZE);
110
-
111
- //The buffer can hold OTA_PART_SIZE bytes, but the last packet may
112
- //not be that long. Return the actual size of the packet.
113
- return min((unsigned)OTA_PART_SIZE,
114
- entry.size() - (OTA_PART_SIZE * pkg.partNo));
115
- },
116
- OTA_PART_SIZE);
117
-
118
- //Calculate the MD5 hash of the firmware we are trying to send. This will be used
119
- //to validate the firmware as well as tell if a node needs this firmware.
120
- MD5Builder md5;
121
- md5.begin();
122
- md5.addStream(entry, entry.size());
123
- md5.calculate();
124
-
125
- //Make it known to the network that there is OTA firmware available.
126
- //This will send a message every minute for an hour letting nodes know
127
- //that firmware is available.
128
- //This returns a task that allows you to do things on disable or more,
129
- //like closing your files or whatever.
130
- mesh.offerOTA(role, hardware, md5.toString(),
131
- ceil(((float)entry.size()) / OTA_PART_SIZE), false);
132
-
133
- while (true) {
134
- //This program will not reach loop() so we dont have to worry about
135
- //file scope.
136
- mesh.update();
137
- delay(1000);
138
- }
139
- }
140
- }
141
- }
142
- }
143
- }
144
-
145
- void rebootEspWithReason(String reason) {
146
- Serial.println(reason);
147
- delay(1000);
148
- ESP.restart();
149
- }
150
-
151
- void loop(){};
1
+ //************************************************************
2
+ // this is an example that uses the painlessmesh library to
3
+ // upload firmware to another node on the network.
4
+ // This will upload to an ESP device running the otaReceiver.ino
5
+ //
6
+ // The naming convetions should be as follows for bin files
7
+ // firmware_<hardware>_<role>.bin
8
+ // To create your own binary files, export them and rename
9
+ // them to follow this format, where hardware will be
10
+ // "ESP8266" or "ESP32" (capitalized.)
11
+ // If sending to the otacreceiver sketch, role should be
12
+ // "otareceiver" (lowercase)
13
+ //
14
+ // This sketch assumes a Nodemcu-32s with an SD card
15
+ // connected as shown in the jpg included in the sketch folder
16
+ // This code may have to be reworked/hardware adjusted for
17
+ // other boards or ESP8266. The core code works well though
18
+ //
19
+ // MAKE SURE YOUR UPLOADED OTA FIRMWARE INCLUDES OTA SUPPORT
20
+ // OR YOU WILL LOSE THE ABILITY TO UPLOAD MORE FIRMWARE.
21
+ // THE INCLUDED .bin DOES NOT HAVE OTA SUPPORT SO THIS MUST BE
22
+ // REFLASHED
23
+ //************************************************************
24
+
25
+ #ifdef ESP32
26
+ #else
27
+ #define CS_PIN D8
28
+ #endif
29
+
30
+ #include "painlessMesh.h"
31
+
32
+ #include <FS.h>
33
+ #include "SD.h"
34
+ #include "SPI.h"
35
+
36
+ #define MESH_PREFIX "whateverYouLike"
37
+ #define MESH_PASSWORD "somethingSneaky"
38
+ #define MESH_PORT 5555
39
+
40
+ #define OTA_PART_SIZE 1024 //How many bytes to send per OTA data packet
41
+
42
+ painlessMesh mesh;
43
+
44
+ void setup() {
45
+ Serial.begin(115200);
46
+ delay(1000);
47
+ mesh.setDebugMsgTypes(
48
+ ERROR | STARTUP | CONNECTION |
49
+ DEBUG); // set before init() so that you can see startup messages
50
+
51
+ mesh.init(MESH_PREFIX, MESH_PASSWORD, MESH_PORT);
52
+
53
+ // Bridge node, should (in most cases) be a root node. See [the
54
+ // wiki](https://gitlab.com/painlessMesh/painlessMesh/wikis/Possible-challenges-in-mesh-formation)
55
+ // for some background
56
+ mesh.setRoot(true);
57
+ // This node and all other nodes should ideally know the mesh contains a root,
58
+ // so call this on all nodes
59
+ mesh.setContainsRoot(true);
60
+
61
+ delay(1000);
62
+ #ifdef ESP32
63
+ if (!SD.begin()) {
64
+ #else
65
+ if (!SD.begin(CS_PIN)) {
66
+ #endif
67
+ rebootEspWithReason("Could not mount SD card, restarting");
68
+ }
69
+
70
+ File dir = SD.open("/");
71
+ while (true) {
72
+ File entry = dir.openNextFile();
73
+ if (!entry) { //End of files
74
+ rebootEspWithReason("Could not find valid firmware, please validate");
75
+ }
76
+
77
+ //This block of code parses the file name to make sure it is valid.
78
+ //It will also get the role and hardware the firmware is targeted at.
79
+ if (!entry.isDirectory()) {
80
+ TSTRING name = entry.name();
81
+ if (name.length() > 1 && name.indexOf('_') != -1 &&
82
+ name.indexOf('_') != name.lastIndexOf('_') &&
83
+ name.indexOf('.') != -1) {
84
+ TSTRING firmware = name.substring(1, name.indexOf('_'));
85
+ TSTRING hardware =
86
+ name.substring(name.indexOf('_') + 1, name.lastIndexOf('_'));
87
+ TSTRING role =
88
+ name.substring(name.lastIndexOf('_') + 1, name.indexOf('.'));
89
+ TSTRING extension =
90
+ name.substring(name.indexOf('.') + 1, name.length());
91
+ if (firmware.equals("firmware") &&
92
+ (hardware.equals("ESP8266") || hardware.equals("ESP32")) &&
93
+ extension.equals("bin")) {
94
+
95
+ Serial.println("OTA FIRMWARE FOUND, NOW BROADCASTING");
96
+
97
+ //This is the important bit for OTA, up to now was just getting the file.
98
+ //If you are using some other way to upload firmware, possibly from
99
+ //mqtt or something, this is what needs to be changed.
100
+ //This function could also be changed to support OTA of multiple files
101
+ //at the same time, potentially through using the pkg.md5 as a key in
102
+ //a map to determine which to send
103
+ mesh.initOTASend(
104
+ [&entry](painlessmesh::plugin::ota::DataRequest pkg,
105
+ char* buffer) {
106
+
107
+ //fill the buffer with the requested data packet from the node.
108
+ entry.seek(OTA_PART_SIZE * pkg.partNo);
109
+ entry.readBytes(buffer, OTA_PART_SIZE);
110
+
111
+ //The buffer can hold OTA_PART_SIZE bytes, but the last packet may
112
+ //not be that long. Return the actual size of the packet.
113
+ return min((unsigned)OTA_PART_SIZE,
114
+ entry.size() - (OTA_PART_SIZE * pkg.partNo));
115
+ },
116
+ OTA_PART_SIZE);
117
+
118
+ //Calculate the MD5 hash of the firmware we are trying to send. This will be used
119
+ //to validate the firmware as well as tell if a node needs this firmware.
120
+ MD5Builder md5;
121
+ md5.begin();
122
+ md5.addStream(entry, entry.size());
123
+ md5.calculate();
124
+
125
+ //Make it known to the network that there is OTA firmware available.
126
+ //This will send a message every minute for an hour letting nodes know
127
+ //that firmware is available.
128
+ //This returns a task that allows you to do things on disable or more,
129
+ //like closing your files or whatever.
130
+
131
+ // Phase 1 Enhancement: To enable compressed OTA (40-60% bandwidth reduction),
132
+ // add two additional parameters: broadcasted and compressed flags:
133
+ // mesh.offerOTA(role, hardware, md5.toString(),
134
+ // ceil(((float)entry.size()) / OTA_PART_SIZE),
135
+ // false, // forced
136
+ // false, // broadcasted (Phase 2 feature)
137
+ // true); // compressed (Phase 1 feature - 40-60% savings!)
138
+
139
+ mesh.offerOTA(role, hardware, md5.toString(),
140
+ ceil(((float)entry.size()) / OTA_PART_SIZE), false);
141
+
142
+ while (true) {
143
+ //This program will not reach loop() so we dont have to worry about
144
+ //file scope.
145
+ mesh.update();
146
+ delay(1000);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
+ void rebootEspWithReason(String reason) {
155
+ Serial.println(reason);
156
+ delay(1000);
157
+ ESP.restart();
158
+ }
159
+
160
+ void loop(){};
@@ -1,25 +1,25 @@
1
- [platformio]
2
- src_dir = .
3
-
4
- [env]
5
- lib_deps =
6
- bblanchon/ArduinoJson
7
- arkhipenko/TaskScheduler
8
-
9
- [env:esp8266]
10
- platform = espressif8266
11
- board = nodemcuv2
12
- framework = arduino
13
- lib_extra_dirs = ../../
14
- lib_deps =
15
- ${env.lib_deps} ; Inherit common dependencies
16
- esp32async/ESPAsyncTCP@^2.0.0 ; Only for ESP8266
17
-
18
- [env:esp32]
19
- platform = espressif32
20
- board = esp32dev
21
- framework = arduino
22
- lib_extra_dirs = ../../
23
- lib_deps =
24
- ${env.lib_deps} ; Inherit common dependencies
25
- esp32async/AsyncTCP
1
+ [platformio]
2
+ src_dir = .
3
+
4
+ [env]
5
+ lib_deps =
6
+ bblanchon/ArduinoJson
7
+ arkhipenko/TaskScheduler
8
+
9
+ [env:esp8266]
10
+ platform = espressif8266
11
+ board = nodemcuv2
12
+ framework = arduino
13
+ lib_extra_dirs = ../../
14
+ lib_deps =
15
+ ${env.lib_deps} ; Inherit common dependencies
16
+ esp32async/ESPAsyncTCP@^2.0.0 ; Only for ESP8266
17
+
18
+ [env:esp32]
19
+ platform = espressif32
20
+ board = esp32dev
21
+ framework = arduino
22
+ lib_extra_dirs = ../../
23
+ lib_deps =
24
+ ${env.lib_deps} ; Inherit common dependencies
25
+ esp32async/AsyncTCP
@@ -1,25 +1,25 @@
1
- [platformio]
2
- src_dir = .
3
-
4
- [env]
5
- lib_deps =
6
- bblanchon/ArduinoJson
7
- arkhipenko/TaskScheduler
8
-
9
- [env:esp8266]
10
- platform = espressif8266
11
- board = nodemcuv2
12
- framework = arduino
13
- lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
14
- lib_deps =
15
- ${env.lib_deps} ; Inherit common dependencies
16
- esp32async/ESPAsyncTCP ; Only for ESP8266
17
-
18
- [env:esp32]
19
- platform = espressif32
20
- board = esp32dev
21
- framework = arduino
22
- lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
23
- lib_deps =
24
- ${env.lib_deps} ; Inherit common dependencies
25
- esp32async/AsyncTCP
1
+ [platformio]
2
+ src_dir = .
3
+
4
+ [env]
5
+ lib_deps =
6
+ bblanchon/ArduinoJson
7
+ arkhipenko/TaskScheduler
8
+
9
+ [env:esp8266]
10
+ platform = espressif8266
11
+ board = nodemcuv2
12
+ framework = arduino
13
+ lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
14
+ lib_deps =
15
+ ${env.lib_deps} ; Inherit common dependencies
16
+ esp32async/ESPAsyncTCP ; Only for ESP8266
17
+
18
+ [env:esp32]
19
+ platform = espressif32
20
+ board = esp32dev
21
+ framework = arduino
22
+ lib_extra_dirs = ../../ ; Load the local copy of painlessmesh. For your own example add painlessmesh to the lib_deps
23
+ lib_deps =
24
+ ${env.lib_deps} ; Inherit common dependencies
25
+ esp32async/AsyncTCP