From b653ce1e87efca4cad8d8afea57905837af9e41a Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Sun, 26 Jul 2020 23:48:19 +0200 Subject: [PATCH] start version --- .gitignore | 7 + .vscode/extensions.json | 7 + .vscode/settings.json | 66 + data/.exclude.files | 2 + data/conf/c001.txt | 3 + data/conf/c002.txt | 6 + data/conf/c003.txt | 4 + data/conf/c004.txt | 3 + data/conf/c005.txt | 4 + data/conf/c006.txt | 6 + data/conf/c007.txt | 6 + data/conf/c008.txt | 6 + data/conf/c009.txt | 7 + data/conf/c010.txt | 7 + data/conf/c011.txt | 8 + data/conf/c012.txt | 6 + data/conf/c013.txt | 9 + data/conf/c014.txt | 7 + data/conf/c015.txt | 12 + data/conf/c016.txt | 12 + data/conf/c017.txt | 11 + data/conf/c018.txt | 12 + data/conf/c019.txt | 17 + data/conf/c020.txt | 17 + data/conf/c021.txt | 7 + data/conf/c100.txt | 12 + data/conf/s001.txt | 1 + data/conf/s002.txt | 6 + data/conf/s003.txt | 6 + data/conf/s004.txt | 8 + data/conf/s005.txt | 3 + data/conf/s006.txt | 8 + data/conf/s007.txt | 4 + data/conf/s008.txt | 1 + data/conf/s009.txt | 1 + data/conf/s010.txt | 1 + data/conf/s011.txt | 1 + data/conf/s012.txt | 1 + data/conf/s013.txt | 1 + data/conf/s014.txt | 1 + data/conf/s015.txt | 6 + data/conf/s016.txt | 6 + data/conf/s017.txt | 7 + data/conf/s018.txt | 10 + data/conf/s019.txt | 12 + data/conf/s020.txt | 12 + data/conf/s021.txt | 6 + data/conf/s100.txt | 13 + data/config.json | 22 + data/css/build.css.gz | Bin 0 -> 15178 bytes data/dev_conf.txt | 12 + data/dev_scen.txt | 13 + data/favicon.ico | Bin 0 -> 1150 bytes data/icon.jpeg | Bin 0 -> 15396 bytes data/index.htm.gz | Bin 0 -> 1444 bytes data/index.json | 69 + data/js/build.chart.js.gz | Bin 0 -> 12758 bytes data/js/function.js.gz | Bin 0 -> 17521 bytes data/lang/lang.ru.json | 39 + data/set.device.json | 142 + data/set.mqtt.json | 133 + data/set.push.json | 51 + data/set.udp.json | 96 + data/set.utilities.json | 65 + data/set.wifi.json | 185 + data/widgets/anydata.json | 5 + data/widgets/chart.json | 5 + data/widgets/fillgauge.json | 7 + data/widgets/inputDate.json | 6 + data/widgets/inputNum.json | 5 + data/widgets/inputText.json | 6 + data/widgets/inputTime.json | 5 + data/widgets/progress-line.json | 12 + data/widgets/progress-round.json | 11 + data/widgets/range.json | 9 + data/widgets/select.json | 7 + data/widgets/toggle.json | 5 + doc/pictures/pic1.png | Bin 0 -> 78309 bytes include/Bus/BusScanner.h | 56 + include/Bus/BusScannerFactory.h | 23 + include/Bus/I2CScanner.h | 12 + include/Bus/OneWireBus.h | 21 + include/Bus/OneWireScanner.h | 15 + include/Clock.h | 165 + include/Consts.h | 116 + include/ESP32.h | 26 + include/ESP8266.h | 19 + include/Errors.h | 52 + include/Global.h | 272 + include/HttpServer.h | 9 + include/Module/CharBuffer.h | 72 + include/Module/CircularBuffer.h | 86 + include/Module/CommandShell.h | 45 + include/Module/EditLine.h | 68 + include/Module/Module.h | 84 + include/Module/Runner.h | 16 + include/Module/Telnet.h | 51 + include/Module/Terminal.h | 186 + include/MqttClient.h | 27 + include/MqttDiscovery.h | 8 + include/Servo/Servos.h | 25 + include/Strings_.h | 139 + include/Upgrade.h | 5 + include/Utils/FileHelper.h | 55 + include/Utils/FileUtils.h | 62 + include/Utils/JsonUtils.h | 17 + include/Utils/PrintMessage.h | 31 + include/Utils/StringUtils.h | 25 + include/Utils/SysUtils.h | 13 + include/Utils/TimeUtils.h | 51 + include/Utils/Timings.h | 71 + include/Utils/WebUtils.h | 73 + include/Utils/WiFiUtils.h | 12 + lib/ESP8266-StringCommand/StringCommand.cpp | 132 + lib/ESP8266-StringCommand/StringCommand.h | 75 + lib/ESP8266-StringCommand/keywords.txt | 23 + lib/ESP8266-StringCommand/readme.md | 5 + .../scripts/install-arduino-core-esp32.sh | 36 + .../scripts/install-arduino-core-esp8266.sh | 29 + .../.github/scripts/install-arduino-ide.sh | 228 + .../.github/scripts/install-platformio.sh | 140 + .../.github/scripts/on-push.sh | 71 + lib/ESPAsyncWebServer/.github/stale.yml | 31 + .../.github/workflows/push.yml | 34 + lib/ESPAsyncWebServer/.gitignore | 2 + lib/ESPAsyncWebServer/.travis.yml | 46 + lib/ESPAsyncWebServer/CMakeLists.txt | 17 + lib/ESPAsyncWebServer/README.md | 1521 +++++ lib/ESPAsyncWebServer/_config.yml | 1 + lib/ESPAsyncWebServer/component.mk | 3 + .../examples/CaptivePortal/CaptivePortal.ino | 47 + .../ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino | 221 + .../ESP_AsyncFSBrowser/data/.exclude.files | 2 + .../ESP_AsyncFSBrowser/data/ace.js.gz | Bin 0 -> 98943 bytes .../data/ext-searchbox.js.gz | Bin 0 -> 3131 bytes .../ESP_AsyncFSBrowser/data/favicon.ico | Bin 0 -> 1150 bytes .../ESP_AsyncFSBrowser/data/index.htm | 131 + .../ESP_AsyncFSBrowser/data/mode-css.js.gz | Bin 0 -> 6102 bytes .../ESP_AsyncFSBrowser/data/mode-html.js.gz | Bin 0 -> 17037 bytes .../data/mode-javascript.js.gz | Bin 0 -> 6315 bytes .../ESP_AsyncFSBrowser/data/worker-html.js.gz | Bin 0 -> 50024 bytes .../examples/regex_patterns/.test.build_flags | 1 + .../regex_patterns/regex_patterns.ino | 77 + .../examples/simple_server/simple_server.ino | 74 + lib/ESPAsyncWebServer/keywords.txt | 3 + lib/ESPAsyncWebServer/library.json | 33 + lib/ESPAsyncWebServer/library.properties | 9 + .../src/AsyncEventSource.cpp | 368 ++ lib/ESPAsyncWebServer/src/AsyncEventSource.h | 133 + lib/ESPAsyncWebServer/src/AsyncJson.h | 252 + lib/ESPAsyncWebServer/src/AsyncWebSocket.cpp | 1303 +++++ lib/ESPAsyncWebServer/src/AsyncWebSocket.h | 350 ++ .../src/AsyncWebSynchronization.h | 87 + lib/ESPAsyncWebServer/src/ESPAsyncWebServer.h | 501 ++ lib/ESPAsyncWebServer/src/SPIFFSEditor.cpp | 544 ++ lib/ESPAsyncWebServer/src/SPIFFSEditor.h | 29 + lib/ESPAsyncWebServer/src/StringArray.h | 193 + .../src/WebAuthentication.cpp | 235 + lib/ESPAsyncWebServer/src/WebAuthentication.h | 34 + lib/ESPAsyncWebServer/src/WebHandlerImpl.h | 138 + lib/ESPAsyncWebServer/src/WebHandlers.cpp | 220 + lib/ESPAsyncWebServer/src/WebRequest.cpp | 1008 ++++ lib/ESPAsyncWebServer/src/WebResponseImpl.h | 136 + lib/ESPAsyncWebServer/src/WebResponses.cpp | 699 +++ lib/ESPAsyncWebServer/src/WebServer.cpp | 193 + lib/ESPAsyncWebServer/src/edit.htm | 627 +++ .../examples/GFilterRA/GFilterRA.ino | 16 + .../GLinear_arrays/GLinear_arrays.ino | 32 + .../examples/GLinear_arrays/excel.jpg | Bin 0 -> 48954 bytes .../GLinear_running/GLinear_running.ino | 34 + .../alphabeta_example/alphabeta_example.ino | 24 + .../filters_comparsion/filters_comparsion.ino | 30 + .../kalman_example/kalman_example.ino | 31 + .../median3_example/median3_example.ino | 21 + .../median_example/median_example.ino | 23 + lib/GyverFilters/keywords.txt | 28 + lib/GyverFilters/library.properties | 9 + lib/GyverFilters/src/GyverFilters.h | 26 + lib/GyverFilters/src/filters/alfaBeta.h | 37 + lib/GyverFilters/src/filters/kalman.h | 38 + lib/GyverFilters/src/filters/linear.h | 30 + lib/GyverFilters/src/filters/median.h | 35 + lib/GyverFilters/src/filters/median3.h | 30 + .../src/filters/runningAverage.cpp | 43 + lib/GyverFilters/src/filters/runningAverage.h | 24 + lib/LITTLEFS/LICENSE | 339 ++ lib/LITTLEFS/README.md | 59 + .../examples/LittleFS_test/LittleFS_test.ino | 182 + lib/LITTLEFS/library.json | 22 + lib/LITTLEFS/library.properties | 9 + lib/LITTLEFS/src/LITTLEFS.cpp | 106 + lib/LITTLEFS/src/LITTLEFS.h | 38 + lib/LITTLEFS/src/esp_littlefs.c | 1481 +++++ lib/LITTLEFS/src/esp_littlefs.h | 114 + lib/LITTLEFS/src/lfs.c | 4913 +++++++++++++++++ lib/LITTLEFS/src/lfs.h | 655 +++ lib/LITTLEFS/src/lfs_util.c | 33 + lib/LITTLEFS/src/lfs_util.h | 234 + lib/LITTLEFS/src/littlefs_api.c | 58 + lib/LITTLEFS/src/littlefs_api.h | 106 + lib/README | 46 + lib/TickerScheduler/README.md | 81 + lib/TickerScheduler/TickerScheduler.cpp | 116 + lib/TickerScheduler/TickerScheduler.h | 91 + .../example/blink/blink/blink.ino | 29 + partitions_custom.csv | 6 + platformio.ini | 67 + src/Bus/I2CScanner.cpp | 26 + src/Bus/OneWireBus.cpp | 25 + src/Bus/OneWireScanner.cpp | 26 + src/CaptiveRequestHandler.cpp | 52 + src/Cmd.cpp | 599 ++ src/Global.cpp | 82 + src/HttpServer.cpp | 200 + src/Init.cpp | 123 + src/Logging.cpp | 153 + src/Module/Telnet.cpp | 86 + src/Module/Terminal.cpp | 320 ++ src/MqttClient.cpp | 308 ++ src/MqttDiscovery.cpp | 75 + src/PushingBox.cpp | 60 + src/Scenario.cpp | 98 + src/Sensors.cpp | 651 +++ src/Servo/Servs.cpp | 40 + src/Timers.cpp | 91 + src/Upgrade.cpp | 87 + src/Utils/FileUtils.cpp | 150 + src/Utils/JsonUtils.cpp | 52 + src/Utils/StringUtils.cpp | 131 + src/Utils/SysUtils.cpp | 187 + src/Utils/TimeUtils.cpp | 212 + src/Utils/WiFiUtils.cpp | 118 + src/Web.cpp | 261 + src/Widgets.cpp | 93 + src/main.cpp | 218 + src/udp.cpp | 166 + tools/littlefsbuilder.py | 2 + tools/mklittlefs.exe | Bin 0 -> 982528 bytes 238 files changed, 27327 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 data/.exclude.files create mode 100644 data/conf/c001.txt create mode 100644 data/conf/c002.txt create mode 100644 data/conf/c003.txt create mode 100644 data/conf/c004.txt create mode 100644 data/conf/c005.txt create mode 100644 data/conf/c006.txt create mode 100644 data/conf/c007.txt create mode 100644 data/conf/c008.txt create mode 100644 data/conf/c009.txt create mode 100644 data/conf/c010.txt create mode 100644 data/conf/c011.txt create mode 100644 data/conf/c012.txt create mode 100644 data/conf/c013.txt create mode 100644 data/conf/c014.txt create mode 100644 data/conf/c015.txt create mode 100644 data/conf/c016.txt create mode 100644 data/conf/c017.txt create mode 100644 data/conf/c018.txt create mode 100644 data/conf/c019.txt create mode 100644 data/conf/c020.txt create mode 100644 data/conf/c021.txt create mode 100644 data/conf/c100.txt create mode 100644 data/conf/s001.txt create mode 100644 data/conf/s002.txt create mode 100644 data/conf/s003.txt create mode 100644 data/conf/s004.txt create mode 100644 data/conf/s005.txt create mode 100644 data/conf/s006.txt create mode 100644 data/conf/s007.txt create mode 100644 data/conf/s008.txt create mode 100644 data/conf/s009.txt create mode 100644 data/conf/s010.txt create mode 100644 data/conf/s011.txt create mode 100644 data/conf/s012.txt create mode 100644 data/conf/s013.txt create mode 100644 data/conf/s014.txt create mode 100644 data/conf/s015.txt create mode 100644 data/conf/s016.txt create mode 100644 data/conf/s017.txt create mode 100644 data/conf/s018.txt create mode 100644 data/conf/s019.txt create mode 100644 data/conf/s020.txt create mode 100644 data/conf/s021.txt create mode 100644 data/conf/s100.txt create mode 100644 data/config.json create mode 100644 data/css/build.css.gz create mode 100644 data/dev_conf.txt create mode 100644 data/dev_scen.txt create mode 100644 data/favicon.ico create mode 100644 data/icon.jpeg create mode 100644 data/index.htm.gz create mode 100644 data/index.json create mode 100644 data/js/build.chart.js.gz create mode 100644 data/js/function.js.gz create mode 100644 data/lang/lang.ru.json create mode 100644 data/set.device.json create mode 100644 data/set.mqtt.json create mode 100644 data/set.push.json create mode 100644 data/set.udp.json create mode 100644 data/set.utilities.json create mode 100644 data/set.wifi.json create mode 100644 data/widgets/anydata.json create mode 100644 data/widgets/chart.json create mode 100644 data/widgets/fillgauge.json create mode 100644 data/widgets/inputDate.json create mode 100644 data/widgets/inputNum.json create mode 100644 data/widgets/inputText.json create mode 100644 data/widgets/inputTime.json create mode 100644 data/widgets/progress-line.json create mode 100644 data/widgets/progress-round.json create mode 100644 data/widgets/range.json create mode 100644 data/widgets/select.json create mode 100644 data/widgets/toggle.json create mode 100644 doc/pictures/pic1.png create mode 100644 include/Bus/BusScanner.h create mode 100644 include/Bus/BusScannerFactory.h create mode 100644 include/Bus/I2CScanner.h create mode 100644 include/Bus/OneWireBus.h create mode 100644 include/Bus/OneWireScanner.h create mode 100644 include/Clock.h create mode 100644 include/Consts.h create mode 100644 include/ESP32.h create mode 100644 include/ESP8266.h create mode 100644 include/Errors.h create mode 100644 include/Global.h create mode 100644 include/HttpServer.h create mode 100644 include/Module/CharBuffer.h create mode 100644 include/Module/CircularBuffer.h create mode 100644 include/Module/CommandShell.h create mode 100644 include/Module/EditLine.h create mode 100644 include/Module/Module.h create mode 100644 include/Module/Runner.h create mode 100644 include/Module/Telnet.h create mode 100644 include/Module/Terminal.h create mode 100644 include/MqttClient.h create mode 100644 include/MqttDiscovery.h create mode 100644 include/Servo/Servos.h create mode 100644 include/Strings_.h create mode 100644 include/Upgrade.h create mode 100644 include/Utils/FileHelper.h create mode 100644 include/Utils/FileUtils.h create mode 100644 include/Utils/JsonUtils.h create mode 100644 include/Utils/PrintMessage.h create mode 100644 include/Utils/StringUtils.h create mode 100644 include/Utils/SysUtils.h create mode 100644 include/Utils/TimeUtils.h create mode 100644 include/Utils/Timings.h create mode 100644 include/Utils/WebUtils.h create mode 100644 include/Utils/WiFiUtils.h create mode 100644 lib/ESP8266-StringCommand/StringCommand.cpp create mode 100644 lib/ESP8266-StringCommand/StringCommand.h create mode 100644 lib/ESP8266-StringCommand/keywords.txt create mode 100644 lib/ESP8266-StringCommand/readme.md create mode 100644 lib/ESPAsyncWebServer/.github/scripts/install-arduino-core-esp32.sh create mode 100644 lib/ESPAsyncWebServer/.github/scripts/install-arduino-core-esp8266.sh create mode 100644 lib/ESPAsyncWebServer/.github/scripts/install-arduino-ide.sh create mode 100644 lib/ESPAsyncWebServer/.github/scripts/install-platformio.sh create mode 100644 lib/ESPAsyncWebServer/.github/scripts/on-push.sh create mode 100644 lib/ESPAsyncWebServer/.github/stale.yml create mode 100644 lib/ESPAsyncWebServer/.github/workflows/push.yml create mode 100644 lib/ESPAsyncWebServer/.gitignore create mode 100644 lib/ESPAsyncWebServer/.travis.yml create mode 100644 lib/ESPAsyncWebServer/CMakeLists.txt create mode 100644 lib/ESPAsyncWebServer/README.md create mode 100644 lib/ESPAsyncWebServer/_config.yml create mode 100644 lib/ESPAsyncWebServer/component.mk create mode 100644 lib/ESPAsyncWebServer/examples/CaptivePortal/CaptivePortal.ino create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/.exclude.files create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/ace.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/ext-searchbox.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/favicon.ico create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/index.htm create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/mode-css.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/mode-html.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/mode-javascript.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/data/worker-html.js.gz create mode 100644 lib/ESPAsyncWebServer/examples/regex_patterns/.test.build_flags create mode 100644 lib/ESPAsyncWebServer/examples/regex_patterns/regex_patterns.ino create mode 100644 lib/ESPAsyncWebServer/examples/simple_server/simple_server.ino create mode 100644 lib/ESPAsyncWebServer/keywords.txt create mode 100644 lib/ESPAsyncWebServer/library.json create mode 100644 lib/ESPAsyncWebServer/library.properties create mode 100644 lib/ESPAsyncWebServer/src/AsyncEventSource.cpp create mode 100644 lib/ESPAsyncWebServer/src/AsyncEventSource.h create mode 100644 lib/ESPAsyncWebServer/src/AsyncJson.h create mode 100644 lib/ESPAsyncWebServer/src/AsyncWebSocket.cpp create mode 100644 lib/ESPAsyncWebServer/src/AsyncWebSocket.h create mode 100644 lib/ESPAsyncWebServer/src/AsyncWebSynchronization.h create mode 100644 lib/ESPAsyncWebServer/src/ESPAsyncWebServer.h create mode 100644 lib/ESPAsyncWebServer/src/SPIFFSEditor.cpp create mode 100644 lib/ESPAsyncWebServer/src/SPIFFSEditor.h create mode 100644 lib/ESPAsyncWebServer/src/StringArray.h create mode 100644 lib/ESPAsyncWebServer/src/WebAuthentication.cpp create mode 100644 lib/ESPAsyncWebServer/src/WebAuthentication.h create mode 100644 lib/ESPAsyncWebServer/src/WebHandlerImpl.h create mode 100644 lib/ESPAsyncWebServer/src/WebHandlers.cpp create mode 100644 lib/ESPAsyncWebServer/src/WebRequest.cpp create mode 100644 lib/ESPAsyncWebServer/src/WebResponseImpl.h create mode 100644 lib/ESPAsyncWebServer/src/WebResponses.cpp create mode 100644 lib/ESPAsyncWebServer/src/WebServer.cpp create mode 100644 lib/ESPAsyncWebServer/src/edit.htm create mode 100644 lib/GyverFilters/examples/GFilterRA/GFilterRA.ino create mode 100644 lib/GyverFilters/examples/GLinear_arrays/GLinear_arrays.ino create mode 100644 lib/GyverFilters/examples/GLinear_arrays/excel.jpg create mode 100644 lib/GyverFilters/examples/GLinear_running/GLinear_running.ino create mode 100644 lib/GyverFilters/examples/alphabeta_example/alphabeta_example.ino create mode 100644 lib/GyverFilters/examples/filters_comparsion/filters_comparsion.ino create mode 100644 lib/GyverFilters/examples/kalman_example/kalman_example.ino create mode 100644 lib/GyverFilters/examples/median3_example/median3_example.ino create mode 100644 lib/GyverFilters/examples/median_example/median_example.ino create mode 100644 lib/GyverFilters/keywords.txt create mode 100644 lib/GyverFilters/library.properties create mode 100644 lib/GyverFilters/src/GyverFilters.h create mode 100644 lib/GyverFilters/src/filters/alfaBeta.h create mode 100644 lib/GyverFilters/src/filters/kalman.h create mode 100644 lib/GyverFilters/src/filters/linear.h create mode 100644 lib/GyverFilters/src/filters/median.h create mode 100644 lib/GyverFilters/src/filters/median3.h create mode 100644 lib/GyverFilters/src/filters/runningAverage.cpp create mode 100644 lib/GyverFilters/src/filters/runningAverage.h create mode 100644 lib/LITTLEFS/LICENSE create mode 100644 lib/LITTLEFS/README.md create mode 100644 lib/LITTLEFS/examples/LittleFS_test/LittleFS_test.ino create mode 100644 lib/LITTLEFS/library.json create mode 100644 lib/LITTLEFS/library.properties create mode 100644 lib/LITTLEFS/src/LITTLEFS.cpp create mode 100644 lib/LITTLEFS/src/LITTLEFS.h create mode 100644 lib/LITTLEFS/src/esp_littlefs.c create mode 100644 lib/LITTLEFS/src/esp_littlefs.h create mode 100644 lib/LITTLEFS/src/lfs.c create mode 100644 lib/LITTLEFS/src/lfs.h create mode 100644 lib/LITTLEFS/src/lfs_util.c create mode 100644 lib/LITTLEFS/src/lfs_util.h create mode 100644 lib/LITTLEFS/src/littlefs_api.c create mode 100644 lib/LITTLEFS/src/littlefs_api.h create mode 100644 lib/README create mode 100644 lib/TickerScheduler/README.md create mode 100644 lib/TickerScheduler/TickerScheduler.cpp create mode 100644 lib/TickerScheduler/TickerScheduler.h create mode 100644 lib/TickerScheduler/example/blink/blink/blink.ino create mode 100644 partitions_custom.csv create mode 100644 platformio.ini create mode 100644 src/Bus/I2CScanner.cpp create mode 100644 src/Bus/OneWireBus.cpp create mode 100644 src/Bus/OneWireScanner.cpp create mode 100644 src/CaptiveRequestHandler.cpp create mode 100644 src/Cmd.cpp create mode 100644 src/Global.cpp create mode 100644 src/HttpServer.cpp create mode 100644 src/Init.cpp create mode 100644 src/Logging.cpp create mode 100644 src/Module/Telnet.cpp create mode 100644 src/Module/Terminal.cpp create mode 100644 src/MqttClient.cpp create mode 100644 src/MqttDiscovery.cpp create mode 100644 src/PushingBox.cpp create mode 100644 src/Scenario.cpp create mode 100644 src/Sensors.cpp create mode 100644 src/Servo/Servs.cpp create mode 100644 src/Timers.cpp create mode 100644 src/Upgrade.cpp create mode 100644 src/Utils/FileUtils.cpp create mode 100644 src/Utils/JsonUtils.cpp create mode 100644 src/Utils/StringUtils.cpp create mode 100644 src/Utils/SysUtils.cpp create mode 100644 src/Utils/TimeUtils.cpp create mode 100644 src/Utils/WiFiUtils.cpp create mode 100644 src/Web.cpp create mode 100644 src/Widgets.cpp create mode 100644 src/main.cpp create mode 100644 src/udp.cpp create mode 100644 tools/littlefsbuilder.py create mode 100644 tools/mklittlefs.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..65469d13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch +lib/libraies-master + diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..e80666bf --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..03d0d454 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "terminal.integrated.env.windows": { + "PATH": "C:\\Users\\ytrikoz\\.platformio\\penv\\Scripts;C:\\Users\\ytrikoz\\.platformio\\penv;C:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\Git\\cmd\\;c:\\android-studio\\jre\\jre\\bin\\;C:\\Program Files (x86)\\Microsoft SQL Server\\150\\DTS\\Binn\\;C:\\Front\\Shared\\;C:\\Program Files (x86)\\Plantronics\\Spokes3G\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files\\nodejs\\;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\dotnet\\;C:\\Users\\ytrikoz\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\ytrikoz\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\ytrikoz\\AppData\\Roaming\\npm;C:\\MinGW\\bin;;C:\\Program Files (x86)\\West Wind Html Help Builder;C:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\Git\\cmd\\;c:\\android-studio\\jre\\jre\\bin\\;C:\\Program Files (x86)\\Microsoft SQL Server\\150\\DTS\\Binn\\;C:\\Front\\Shared\\;C:\\Program Files (x86)\\Plantronics\\Spokes3G\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files\\nodejs\\;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\dotnet\\;C:\\Users\\ytrikoz\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\ytrikoz\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\ytrikoz\\AppData\\Roaming\\npm;C:\\MinGW\\bin;;C:\\Program Files (x86)\\West Wind Html Help Builder", + "PLATFORMIO_CALLER": "vscode" + }, + "files.associations": { + "*.cpp": "cpp", + "functional": "cpp", + "*.tcc": "cpp", + "optional": "cpp", + "ratio": "cpp", + "system_error": "cpp", + "array": "cpp", + "regex": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "algorithm": "cpp", + "random": "cpp", + "atomic": "cpp", + "cctype": "cpp", + "cerrno": "cpp", + "cfloat": "cpp", + "climits": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "iterator": "cpp", + "memory": "cpp", + "numeric": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "locale": "cpp", + "new": "cpp", + "ostream": "cpp", + "queue": "cpp", + "sstream": "cpp", + "stack": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "cstdbool": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/data/.exclude.files b/data/.exclude.files new file mode 100644 index 00000000..955397fa --- /dev/null +++ b/data/.exclude.files @@ -0,0 +1,2 @@ +/*.js.gz +/.exclude.files diff --git a/data/conf/c001.txt b/data/conf/c001.txt new file mode 100644 index 00000000..733f4c95 --- /dev/null +++ b/data/conf/c001.txt @@ -0,0 +1,3 @@ +button 1 5 Включить#реле Реле 0 1 + +//это простая кнопка номер 1 управляющая пином 5 имеющая начальное состояние 0 \ No newline at end of file diff --git a/data/conf/c002.txt b/data/conf/c002.txt new file mode 100644 index 00000000..1e54f5dd --- /dev/null +++ b/data/conf/c002.txt @@ -0,0 +1,6 @@ +inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1 +inputTime time2 Во#сколько#выключить? Таймеры 20-35-00 2 +button 1 5 Кнопка#(по#таймеру) Таймеры 0 3 + +//время в приложение необходимо вводить в строгом формате: ЧЧ-ММ-СС +//можно создавать любое количество таймеров, копируя строку inputTime... \ No newline at end of file diff --git a/data/conf/c003.txt b/data/conf/c003.txt new file mode 100644 index 00000000..9f0c5c45 --- /dev/null +++ b/data/conf/c003.txt @@ -0,0 +1,4 @@ +button 1 5 Вкл#на#время Таймеры 0 1 +inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2 + +//в сценариях можно поменять на sec, min или hours если нужны другие размерности времени \ No newline at end of file diff --git a/data/conf/c004.txt b/data/conf/c004.txt new file mode 100644 index 00000000..b0978b0d --- /dev/null +++ b/data/conf/c004.txt @@ -0,0 +1,3 @@ +button 1 na Включить#все Освещение 0 1 + +//при нажатии на эту кнопку пины номер 5 и 13 поведут себя как установленно в сценариях \ No newline at end of file diff --git a/data/conf/c005.txt b/data/conf/c005.txt new file mode 100644 index 00000000..5ef7e5f5 --- /dev/null +++ b/data/conf/c005.txt @@ -0,0 +1,4 @@ +button 1 13 Включить#реле Реле 0 1 +switch 1 0 10 + +//можно управлять реле на пине 13 кнопкой на пине 0 или кнопкой в приложении \ No newline at end of file diff --git a/data/conf/c006.txt b/data/conf/c006.txt new file mode 100644 index 00000000..db812455 --- /dev/null +++ b/data/conf/c006.txt @@ -0,0 +1,6 @@ +button 1 5 Включить#все Реле 0 1 + + +//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет +//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID +//того esp, кнопка на этом девайсе будет выключать другие устройства по воздуху \ No newline at end of file diff --git a/data/conf/c007.txt b/data/conf/c007.txt new file mode 100644 index 00000000..739a1424 --- /dev/null +++ b/data/conf/c007.txt @@ -0,0 +1,6 @@ +switch 1 0 10 + +//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет +//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID +//того esp, к данному модулю нужно подключить кнопку к пину 0 и тогда +//один девайс будет управлять другим по воздуху \ No newline at end of file diff --git a/data/conf/c008.txt b/data/conf/c008.txt new file mode 100644 index 00000000..09eef72c --- /dev/null +++ b/data/conf/c008.txt @@ -0,0 +1,6 @@ +pwm 1 3 Яркость#коредор: Реле 1023 1 +pwm 2 4 Яркость#ванная: Реле 510 2 + +//в приложении появятся ползунки, соответствующее значение pwm +//будет установленно на пинах 3 и 4 +//1023 и 510 это начальные значения после загрузки модуля \ No newline at end of file diff --git a/data/conf/c009.txt b/data/conf/c009.txt new file mode 100644 index 00000000..496b4761 --- /dev/null +++ b/data/conf/c009.txt @@ -0,0 +1,7 @@ +dhtT t 2 dht11 Температура#DHT,#t°C Датчики anydata 1 +dhtH h 2 dht11 Влажность#DHT,#t°C Датчики anydata 2 +dhtComfort Степень#комфорта: Датчики 3 +dhtPerception Восприятие: Датчики 4 +dhtDewpoint Точка#росы: Датчики 5 +logging t 1 50 Температура Датчики 6 +logging h 1 50 Влажность Датчики 7 \ No newline at end of file diff --git a/data/conf/c010.txt b/data/conf/c010.txt new file mode 100644 index 00000000..0972be00 --- /dev/null +++ b/data/conf/c010.txt @@ -0,0 +1,7 @@ +dhtT t 2 dht22 Температура#DHT,#t°C Датчики anydata 1 +dhtH h 2 dht22 Влажность#DHT,#t°C Датчики anydata 2 +dhtComfort Степень#комфорта: Датчики 3 +dhtPerception Восприятие: Датчики 4 +dhtDewpoint Точка#росы: Датчики 5 +logging t 1 50 Температура Датчики 6 +logging h 1 50 Влажность Датчики 7 \ No newline at end of file diff --git a/data/conf/c011.txt b/data/conf/c011.txt new file mode 100644 index 00000000..acf8f5e3 --- /dev/null +++ b/data/conf/c011.txt @@ -0,0 +1,8 @@ +analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1 +logging adc 5 100 Аналоговый#вход Датчики 2 + +//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит +//значение чтения аналогового входа будут примерно равным +//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции) +//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении +//варианты отображения: anydata, progress-round, progress-line, fillgauge diff --git a/data/conf/c012.txt b/data/conf/c012.txt new file mode 100644 index 00000000..3793a877 --- /dev/null +++ b/data/conf/c012.txt @@ -0,0 +1,6 @@ +bmp280T temp1 0x76 Температура#bmp280 Датчики anydata 1 +bmp280P press1 0x76 Давление#bmp280 Датчики anydata 2 +logging temp1 1 100 Температура Датчики 3 +logging press1 1 100 Давление Датчики 4 + +//Чтение и логгирование датчика bmp280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4) \ No newline at end of file diff --git a/data/conf/c013.txt b/data/conf/c013.txt new file mode 100644 index 00000000..78630cfe --- /dev/null +++ b/data/conf/c013.txt @@ -0,0 +1,9 @@ +bme280T temp1 0x76 Температура#bmp280 Датчики anydata 1 +bme280P pres1 0x76 Давление#bmp280 Датчики anydata 2 +bme280H hum1 0x76 Влажность#bmp280 Датчики anydata 3 +bme280A altit1 0x76 Высота#bmp280 Датчики anydata 4 +logging temp1 1 100 Температура Датчики 5 +logging press1 1 100 Давление Датчики 6 +logging hum1 1 100 Влажность Датчики 7 + +//Чтение и логгирование датчика bme280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4) \ No newline at end of file diff --git a/data/conf/c014.txt b/data/conf/c014.txt new file mode 100644 index 00000000..c850b3e2 --- /dev/null +++ b/data/conf/c014.txt @@ -0,0 +1,7 @@ +dallas temp1 2 1 Температура Датчики anydata 1 +dallas temp2 2 2 Температура Датчики anydata 2 +logging temp1 1 100 Температура Датчики 3 +logging temp2 1 100 Температура Датчики 4 + +//2 - номер пина датчика +//варианты отображения: anydata, progress-round, progress-line, fillgauge \ No newline at end of file diff --git a/data/conf/c015.txt b/data/conf/c015.txt new file mode 100644 index 00000000..6567cf6d --- /dev/null +++ b/data/conf/c015.txt @@ -0,0 +1,12 @@ +dallas 2 Водонагреватель,#t°C Термостат anydata 1 +logging dallas 5 100 Температура Термостат 2 +inputDigit digit1 При#скольки#выключить? Термостат 40 3 +inputDigit digit2 При#скольки#включить? Термостат 20 4 +button 1 5 Нагреватель Термостат 0 5 +button 2 line1,line2, Автоматический#режим Термостат 1 6 + +//2 - номер пина датчика +//5 - номер пина реле +//это термостат который будет держать температуру между двумя +//установленными в приложении значениями, так же можно выключить +//автоматический режим, и тогда нагреватель будет управляться в ручную \ No newline at end of file diff --git a/data/conf/c016.txt b/data/conf/c016.txt new file mode 100644 index 00000000..0b82f2b9 --- /dev/null +++ b/data/conf/c016.txt @@ -0,0 +1,12 @@ +levelPr p 14 12 Уровень#в#баке,#% Датчики fillgauge 125 25 1 +ultrasonicCm cm 14 12 Дистанция,#см Датчики anydata 2 +inputDigit digit1 При#скольки#выключить? Датчики 95 3 +inputDigit digit2 При#скольки#включить? Датчики 10 4 +button 1 5 Насос Датчики 0 5 +logging p 1 100 Вода#в#баке Датчики 6 + +//125 - это расстояние от датчика до дна бака в сантиметрах +//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах +//distancePr - эта строка выводит процент заполнения бака +//distanceCm - эта строка выводит расстояние в сантиметрах +//варианты отображения: anydata, progress-round, progress-line, fillgauge \ No newline at end of file diff --git a/data/conf/c017.txt b/data/conf/c017.txt new file mode 100644 index 00000000..fa0b78ac --- /dev/null +++ b/data/conf/c017.txt @@ -0,0 +1,11 @@ +button 1 5 Прихожая Освещение 0 1 +inputDigit digit1 Задержка#выключения Освещение 30 2 +switch 1 0 10 + +//0 - номер пина датчика движения +//5 - номер пина реле +//при срабатывании датчика движения включится реле и обратный таймер на 30 сек +//если движение не будет обнаружено повтороно в течении 30 секунд - свет выключится +//если движение повторится в течении 30 секунд то таймер продлится опять на 30 сек +//свет выключится только в том случае если в комнате все замрет на 30 сек +//задержку выключения можно будет настраивать в приложении \ No newline at end of file diff --git a/data/conf/c018.txt b/data/conf/c018.txt new file mode 100644 index 00000000..bc7d8192 --- /dev/null +++ b/data/conf/c018.txt @@ -0,0 +1,12 @@ +switch 1 0 20 +text 1 Вход: Охрана 1 +textSet 1 не#обнаружено-time +button 1 na Сбросить Охрана 0 2 +button 2 line3, Включить#push Охрана 1 3 + +//0 - номер пина датчика +//при срабатывании датчика движения устройство пошлет пуш и в приложении будет +//написано в текстовом поле, что движение было обнаружено +//так же будет зафиксирован момент времени срабатывания датчика +//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин +//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении \ No newline at end of file diff --git a/data/conf/c019.txt b/data/conf/c019.txt new file mode 100644 index 00000000..82b41ae2 --- /dev/null +++ b/data/conf/c019.txt @@ -0,0 +1,17 @@ +stepper 1 12 4 +stepper 2 13 5 +button 1 na Открыть#штору#1 Шторы 0 1 +button 2 na Открыть#штору#2 Шторы 0 2 + +//для подключения необходим драйвер шагового двигателя A4988 + +//stepper 1 12 4 шаговый двигатель с параметрами: 1 - номер шагового двигателя, +//12 - номер пина количества шагов, 4 - номер пина направления + +//stepper 2 13 5 шаговый двигатель с параметрами: 2 - номер шагового двигателя, +//13 - номер пина количества шагов, 5 - номер пина направления + +//stepperSet 1 200 5 - прокрутить шаговик номер 1 на 200 шагов по часовой стрелке +//с задержкой между шагами 5 милисекунд (чем меньше задержка тем больше скорость) +//если поставить -200 то будет вращаться против часовой стрелки +//можно подключить не более двух шаговиков \ No newline at end of file diff --git a/data/conf/c020.txt b/data/conf/c020.txt new file mode 100644 index 00000000..5d45aea0 --- /dev/null +++ b/data/conf/c020.txt @@ -0,0 +1,17 @@ +servo 1 12 50 Мой#сервопривод Сервоприводы 0 100 0 180 1 +servo 2 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2 +button 1 na Открыть1 Сервоприводы 0 3 +button 2 na Открыть2 Сервоприводы 0 4 + +//Можно создавать не более двух сервоприводов на одном устройстве. +//1 - номер привода +//12 - номер пина +//50 - начальное значение в процентах + +//0 - 100 диапазон ползунка +//0 - 180 диапазон угла + +//Представим ситуацию когда есть некая заслонка и при угле в 30 градусов она закрыта, +//а при угле в 90 градусов открыта. В этом случае необходимо написать +//0 100 30 90 и тогда поставив ползунок в 0 % серва встанет в положение 30 градусов, +//а если поставить ползунок в 100 % серва встанет в положение 90 градусов. \ No newline at end of file diff --git a/data/conf/c021.txt b/data/conf/c021.txt new file mode 100644 index 00000000..615742f3 --- /dev/null +++ b/data/conf/c021.txt @@ -0,0 +1,7 @@ +serialBegin 9600 12 13 +button 1 na Управляется#из#arduino Serial 0 1 +button 2 na Отправить#в#arduino Serial 0 2 +text 1 Текст#из#arduino Serial 3 + +//12 13 это пины uart к которым вы можете подключить arduino. Скетч для arduino выложен в группу. +//команда serialWrite ard-on отправит в arduino текст ard-on \ No newline at end of file diff --git a/data/conf/c100.txt b/data/conf/c100.txt new file mode 100644 index 00000000..c943b43b --- /dev/null +++ b/data/conf/c100.txt @@ -0,0 +1,12 @@ +button 1 na Включить#все Реле 0 1 +button 2 13 Прихожая Реле 0 2 +button 3 14 Кухня Реле 0 3 +pwm 1 3 Яркость#коредор: Реле 1023 4 +pwm 2 4 Яркость#ванная: Реле 510 5 +analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6 +logging adc 1 100 Аналоговый#вход Датчики 7 + +//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев +//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 +//Так же продемонстрированна система логгирования данных строкой logging +//1 - это интервал между точками в минутах, 100 это количество точек \ No newline at end of file diff --git a/data/conf/s001.txt b/data/conf/s001.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s001.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s002.txt b/data/conf/s002.txt new file mode 100644 index 00000000..5deba589 --- /dev/null +++ b/data/conf/s002.txt @@ -0,0 +1,6 @@ +timenow = time1 +buttonSet 1 1 +end +timenow = time2 +buttonSet 1 0 +end diff --git a/data/conf/s003.txt b/data/conf/s003.txt new file mode 100644 index 00000000..f8ced990 --- /dev/null +++ b/data/conf/s003.txt @@ -0,0 +1,6 @@ +button1 = 1 +timerStart 1 digit1 sec +end +timer1 = 0 +buttonSet 1 0 +end \ No newline at end of file diff --git a/data/conf/s004.txt b/data/conf/s004.txt new file mode 100644 index 00000000..276282c3 --- /dev/null +++ b/data/conf/s004.txt @@ -0,0 +1,8 @@ +button1 = 1 +pinSet 5 1 +pinSet 13 0 +end +button1 = 0 +pinSet 5 0 +pinSet 13 1 +end \ No newline at end of file diff --git a/data/conf/s005.txt b/data/conf/s005.txt new file mode 100644 index 00000000..093de1fe --- /dev/null +++ b/data/conf/s005.txt @@ -0,0 +1,3 @@ +switch1 = 1 +buttonChange 1 +end \ No newline at end of file diff --git a/data/conf/s006.txt b/data/conf/s006.txt new file mode 100644 index 00000000..9eb30933 --- /dev/null +++ b/data/conf/s006.txt @@ -0,0 +1,8 @@ +button1 = 1 +mqtt 3233662-1589485 buttonSet_1_1 +mqtt 2233662-1589486 buttonSet_1_1 +end +button1 = 0 +mqtt 3233662-1589485 buttonSet_1_0 +mqtt 2233662-1589486 buttonSet_1_0 +end \ No newline at end of file diff --git a/data/conf/s007.txt b/data/conf/s007.txt new file mode 100644 index 00000000..0c48cbdf --- /dev/null +++ b/data/conf/s007.txt @@ -0,0 +1,4 @@ +switch1 = 1 +mqtt 3233662-1589485 buttonChange_1 +mqtt 2233662-1589486 buttonChange_1 +end \ No newline at end of file diff --git a/data/conf/s008.txt b/data/conf/s008.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s008.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s009.txt b/data/conf/s009.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s009.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s010.txt b/data/conf/s010.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s010.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s011.txt b/data/conf/s011.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s011.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s012.txt b/data/conf/s012.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s012.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s013.txt b/data/conf/s013.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s013.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s014.txt b/data/conf/s014.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/conf/s014.txt @@ -0,0 +1 @@ + diff --git a/data/conf/s015.txt b/data/conf/s015.txt new file mode 100644 index 00000000..60782623 --- /dev/null +++ b/data/conf/s015.txt @@ -0,0 +1,6 @@ +dallas > digit1 +buttonSet 1 0 +end +dallas < digit2 +buttonSet 1 1 +end \ No newline at end of file diff --git a/data/conf/s016.txt b/data/conf/s016.txt new file mode 100644 index 00000000..babd78ab --- /dev/null +++ b/data/conf/s016.txt @@ -0,0 +1,6 @@ +p > digit1 +buttonSet 1 0 +end +p < digit2 +buttonSet 1 1 +end \ No newline at end of file diff --git a/data/conf/s017.txt b/data/conf/s017.txt new file mode 100644 index 00000000..899b7035 --- /dev/null +++ b/data/conf/s017.txt @@ -0,0 +1,7 @@ +switch1 = 1 +timerStart 1 digit1 sec +buttonSet 1 1 +end +timer1 = 0 +buttonSet 1 0 +end \ No newline at end of file diff --git a/data/conf/s018.txt b/data/conf/s018.txt new file mode 100644 index 00000000..f764dc9d --- /dev/null +++ b/data/conf/s018.txt @@ -0,0 +1,10 @@ +switch1 = 1 +textSet 1 обнаружено#движение-time +end +button1 = 1 +textSet 1 не#обнаружено-time +buttonSet 1 0 +end +switch1 = 1 +push Внимание обнаружено#движение! +end \ No newline at end of file diff --git a/data/conf/s019.txt b/data/conf/s019.txt new file mode 100644 index 00000000..16e7cfa6 --- /dev/null +++ b/data/conf/s019.txt @@ -0,0 +1,12 @@ +button1 = 1 +stepperSet 1 200 1 +end +button1 = 0 +stepperSet 1 -200 1 +end +button2 = 1 +stepperSet 2 200 1 +end +button2 = 0 +stepperSet 2 -200 1 +end \ No newline at end of file diff --git a/data/conf/s020.txt b/data/conf/s020.txt new file mode 100644 index 00000000..b4340463 --- /dev/null +++ b/data/conf/s020.txt @@ -0,0 +1,12 @@ +button1 = 1 +servoSet 1 100 +end +button1 = 0 +servoSet 1 0 +end +button2 = 1 +servoSet 2 100 +end +button2 = 0 +servoSet 2 0 +end \ No newline at end of file diff --git a/data/conf/s021.txt b/data/conf/s021.txt new file mode 100644 index 00000000..9ae72453 --- /dev/null +++ b/data/conf/s021.txt @@ -0,0 +1,6 @@ +button2 = 1 +serialWrite ard-11-1 +end +button2 = 0 +serialWrite ard-11-0 +end \ No newline at end of file diff --git a/data/conf/s100.txt b/data/conf/s100.txt new file mode 100644 index 00000000..4927ac1e --- /dev/null +++ b/data/conf/s100.txt @@ -0,0 +1,13 @@ +button1 = 1 +buttonSet 2 1 +buttonSet 3 1 +pwmSet 2 1024 +end +button1 = 0 +buttonSet 2 0 +buttonSet 3 0 +pwmSet 2 0 +end +adc > 50 +buttonSet 2 1 +end \ No newline at end of file diff --git a/data/config.json b/data/config.json new file mode 100644 index 00000000..7aa21254 --- /dev/null +++ b/data/config.json @@ -0,0 +1,22 @@ +{ + "name": "IoTmanager", + "chipID": "", + "apssid": "IoTmanager", + "appass": "", + "routerssid": "VOLODYA", + "routerpass": "BELCHENKO", + "timezone": 2, + "ntp": "pool.ntp.org", + "mqttServer": "91.204.228.124", + "mqttPort": 1883, + "mqttPrefix": "/iotTeam", + "mqttUser": "test", + "mqttPass": "test", + "scen": "1", + "pushingboxid": "v7C133E426B0C69E", + "weblogin": "admin", + "webpass": "admin", + "udponoff": "1", + "blink": "1", + "oneWirePin": "2" +} \ No newline at end of file diff --git a/data/css/build.css.gz b/data/css/build.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..4bf6e06001ba59fb28f775adfad194fffa985f28 GIT binary patch literal 15178 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 E0O(?Z-~a#s literal 0 HcmV?d00001 diff --git a/data/dev_conf.txt b/data/dev_conf.txt new file mode 100644 index 00000000..2c5bb9ae --- /dev/null +++ b/data/dev_conf.txt @@ -0,0 +1,12 @@ +button 1 na Включить#все Реле 0 1 +button 2 13 Прихожая Реле 0 2 +button 3 14 Кухня Реле 0 3 +pwm 1 3 Яркость#коредор: Реле 1023 4 +pwm 2 4 Яркость#ванная: Реле 510 5 +analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6 +logging adc 1 100 Аналоговый#вход Датчики 7 + +//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев +//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 +//Так же продемонстрированна система логгирования данных строкой logging +//1 - это интервал между точками в минутах, 100 это количество точек diff --git a/data/dev_scen.txt b/data/dev_scen.txt new file mode 100644 index 00000000..4927ac1e --- /dev/null +++ b/data/dev_scen.txt @@ -0,0 +1,13 @@ +button1 = 1 +buttonSet 2 1 +buttonSet 3 1 +pwmSet 2 1024 +end +button1 = 0 +buttonSet 2 0 +buttonSet 3 0 +pwmSet 2 0 +end +adc > 50 +buttonSet 2 1 +end \ No newline at end of file diff --git a/data/favicon.ico b/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..50d908fa6d3f6f710e4d3d0f9fb3e96f3466895c GIT binary patch literal 1150 zcmbW1Yfy|)7{^~TzWHLtjL$y0jv2QSq6~#f#7e|agTf3mXcR503wx_}tj&marGz54 zp)gY^BiC^Wt!lJL)4EK`ZoB)w`*UPujO#dO{?9q*dFKC|=ltiKBS`~9A3RtRc9^to zpd<~IBx$&Sa0$;>zZfJ*#D)y|ioUfl{G$21UOX;0e!u@0(cimd!FyIyLs@Dnw)M$W zWSOWx{+QQIZWQ^?xfEHZ;dm*z5s_q04`x?j0BPgKvU5^6+K2)!nO@P=>HF>Gt+(%B zS`fpYX+i7`3KW=(I$$E|zzOUL4n`BQ7we`LoQ~d~a(G-W%F@!wnmwMJj9}N) z(SkpLjNoZxhlZdHn?vR-3q@NUq7Ls5IUEljVVoa^IcW?9DWf>FbtKkpQ^;STLNg@@ zZFo3Fajx9xc(UhS;fmRb?ES7seNizvag(v72T+(cp2OQlaqFUi_wDUilh=s-LoqE} zj9Ik=!+Zml_!l@HxcX|4eLl`;)Er5f$w}QDO0q&J%?!o)@=0IZ+15t>s+HtKMq!DK zMIV)mdC3cISU=!b{PgyG;zY^@%8V+`<;QW#FpsO&^~gR?{~4b*+(aL-2wh}0`sjO< ztn1*K{++lZ3hwS6$}_fbsW6GEV;eY=7e&K)v(QN9O|zTEnl36W?HFQikQZa8B&man z%}%Ow-{W;F_&h$Ui%nFQr&3$7gR}b=b70L;a#XGCjkJ>)*2KPf%^XnsnFYwabXMQrEL_f5PBv&r}|(Ez1?y@ zzo)B%`?VIq-^ay6%P_`gurtI?x`1YOGuo(T@>KW9PdLG4i;a)(I{Ud_CVszy!(L1M zc@33E*HWaOOWx}3=;L%4mTNGt-AKvqMDA7<;Och%!2PyR6d#?h8hKb}<@)LERM}Qh nS(rdwxtgZir|Ejz_D}E8uPAsuE6M9Ip6+){~bRA#ZfP9 literal 0 HcmV?d00001 diff --git a/data/icon.jpeg b/data/icon.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..abdd18c00ecd49330a896317621726204bdf4bac GIT binary patch literal 15396 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 literal 0 HcmV?d00001 diff --git a/data/index.htm.gz b/data/index.htm.gz new file mode 100644 index 0000000000000000000000000000000000000000..139f0040889174476a6bea5be844dae04d7ea073 GIT binary patch literal 1444 zcmV;V1zY+biwFp#k1|^V0BLSyWq2-VbZr2&SJ{r!Fcf|7SC}A3$}~yKPTK%t-vkH{ zh)p9mxoJ#YJJ?P;1LEJgc9JGjHi5)T;@WpPK6gv!r|vwv{p#)WyQDB{etj^nUu0eY z&G1d;r^0aX1{UNFY=FxW)RepcL5(JlVWWU+62MVJ-pMZ&r^CTZW?+iOOgW9??RFbU zk#d%>+j|Zy8gmI5AM+v z7E-QGILMpLD3$BD)4tElgKAMrY7|{EQ&fvRp?gZMr{oDW8%9UuHRWptiVniiU40FP zI{gqnS8S7b_5vVGXb`DK()w5888|YrC2mI2f+`IrsZ1VT^_&&X#0qc46HgaXnY1#5 zp{hr$mBeFfx`g;BtoI59dE(`CV}C~YsBP#}vC@zXa!^F8H1R&^cu_H)Mb@KQspf&fnv2*wQD7`gcAs<%~9pmOVoL+K7{K%JyDA zg!)hP(ZC@!uTYmNpih{9z^z6cmrtwp zkbJE*NV5@!vwFkYcAJ_c#OXvE$}5O;$(aef55gPvMK#Kp=h8}#M+8KM>pe{lVrhz2 zDVHj+ibqyshOc?;t`WnXgM$tpVR?X(3F&|@(DG{btr6$|93&)gmfjzIY>XXDc38i4 zm^+lUcw>5})LLv*Ed(12i7$66ORl5&r4<~KQwi}Zfw_ftGOvfd7SCl`>0k$h{LBbq zX}$hR?yksC%0cgB6qrg0VpIit7j2Jn%5{78&85kfiA>rN!X>pP+oTB^B)hg zGo_91z&p!b4dAjFXY+;3j$P(vY(r8`wZ=lUV+jdS#JT|$E|%VP=YL*t!ZK`Miib_X zc&%2!vJ8aRPO!wwki0cYL`yJtIoRc`}V$LyW*tGM?Ewt?aa|@iyjqL8=x}^b+_9@vYpa;JgU(NToesY#m_CVcGVa6J ztvVyQlsKSK=*J_-nE5}P)%Tz_>6Ui394hht!Bjk^E4k4$ekp~_^TRjn9y`?dDUufPmaSNP=Fa%cwe$9Q>#loV zanIYmoy+cdr`?&HxjJ#rTI*_9;>eHigW=4Dd*?iYL9)Q_I~c_JKt|b)GvH;&)=SGW zyKYbCF>OdNP1kH?v0<$p=}L0T@(PZt5k;clgQLdZa$agWa&DkF!eI;<7 z7GT5TDzQ$mos9M0`rFGTP)aH%)TP2+-Y$#?mr7P8v8x4_>B>gZi7`=DrYGn`bd{!{ zbraTROieG2&-7r~Y1T`oelx&x+Y7qeCjJvFZYGvd6!|mzu@?Bfvi3*BC#c|&TH1S! zw%f_QsEm=~_jofZmY{wMSJMsj;M(?%2%cju=%nd%$P0A?T?18V5$S4y-x!EGm<*e- z=AZS4@5di!Hhb@2$2Ac6v47B7I`AVKh-mo*Z=IoT Manager" + }, + { + "type": "link", + "title": "Конфигурация устройства", + "action": "/?set.device", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Список других устройств в сети", + "action": "/?set.udp", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Конфигурация WIFI", + "action": "/?set.wifi", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Конфигурация MQTT", + "action": "/?set.mqtt", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Конфигурация push", + "action": "/?set.push", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Утилиты", + "action": "/?set.utilities", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Скачать приложение IoT Manager для android", + "action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Скачать приложение IoT Manager для iphone", + "action": "https://apps.apple.com/ru/app/iot-manager/id1155934877", + "class": "btn btn-block btn-default" + } + ] +} diff --git a/data/js/build.chart.js.gz b/data/js/build.chart.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..ac021668f0edf424e2fb22d4a8fe7ba6388bb3da GIT binary patch literal 12758 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