516 Commits
2.1.0 ... 278

Author SHA1 Message Date
IoTManagerProject
0b5d7236aa Merge pull request #77 from IoTManagerProject/beta
Исправил баг с обновлением по воздуху
2021-01-05 17:07:21 +01:00
Dmitry Borisenko
bce8723ecf Исправил баг с обновлением по воздуху 2021-01-05 16:53:22 +01:00
Dmitry Borisenko
b7fcedb6c3 Merge pull request #76 from IoTManagerProject/beta
Beta
2021-01-05 15:11:51 +01:00
Dmitry Borisenko
54cb92d2bb esp32 adc bug 2021-01-05 14:57:01 +01:00
Dmitry Borisenko
6902d57be2 Исправил Uptime и ccs811 2021-01-05 12:17:48 +01:00
Dmitry Borisenko
57c12e43f1 Merge pull request #75 from IoTManagerProject/beta
ccs811 полная интеграция
2021-01-05 03:54:48 +01:00
Dmitry Borisenko
c72af8650b ccs811 полная интеграция 2021-01-05 03:48:52 +01:00
Dmitry Borisenko
a68dfb37fc Merge pull request #74 from IoTManagerProject/beta
Beta
2021-01-04 16:57:58 +01:00
Dmitry Borisenko
3cdd8fc2b9 Отремантировал uptime 2021-01-04 16:56:20 +01:00
Dmitry Borisenko
a4ae02736c Добавил сенсор ccs811 2021-01-04 01:49:57 +01:00
Dmitry Borisenko
e822414187 Uptime 2021-01-04 01:17:11 +01:00
Dmitry Borisenko
4e630fd0b0 275 2021-01-04 01:02:54 +01:00
Dmitry Borisenko
988fb94c52 Merge pull request #73 from IoTManagerProject/beta
Beta
2021-01-04 00:51:56 +01:00
Dmitry Borisenko
9906fade9a cleaning 2021-01-04 00:51:25 +01:00
Dmitry Borisenko
4cf68f417f readme 2021-01-04 00:49:35 +01:00
Dmitry Borisenko
05f726e378 doc 2021-01-04 00:48:44 +01:00
Dmitry Borisenko
75a7d4e16a Merge pull request #72 from IoTManagerProject/LastStableVersion
pr
2021-01-04 00:44:25 +01:00
Dmitry Borisenko
691126a2d0 Merge pull request #71 from IoTManagerProject/beta
Beta
2021-01-04 00:40:53 +01:00
Dmitry Borisenko
5eb3c6d3a3 first 2021-01-04 00:39:35 +01:00
Dmitry Borisenko
bf9855aa60 remoove all 2021-01-04 00:33:32 +01:00
Dmitry Borisenko
50c616c61b Merge branch 'LastStableVersion' of https://github.com/IoTManagerProject/IoTManager into LastStableVersion 2021-01-04 00:31:42 +01:00
Dmitry Borisenko
2d2148d2c4 Поддержка нескольких DHT 2021-01-03 19:44:09 +01:00
Dmitry Borisenko
6ae001232d telegram 2021-01-03 02:14:12 +01:00
Dmitry Borisenko
965b09cc78 Доп 2021-01-03 01:20:38 +01:00
Dmitry Borisenko
a8534c4a73 Партии выгрузки в логгировании 2021-01-03 00:33:04 +01:00
Dmitry Borisenko
401564a778 Проверка дробей и отрицательных чисел 2021-01-02 13:07:45 +01:00
Dmitry Borisenko
673bfe6b6b переписано логгирование 2021-01-02 04:27:19 +01:00
Dmitry Borisenko
f8d574d15a change 2021-01-02 03:28:43 +01:00
Dmitry Borisenko
e39806e0ac попытка использовать альтнрнативный метод поиска 2021-01-02 03:26:16 +01:00
Dmitry Borisenko
0fa7876b80 исправлена опечатка 2020-12-30 17:02:11 +01:00
Dmitry Borisenko
7eac8dde3b Возможность быстрого переключения прошивок 2020-12-30 16:56:26 +01:00
Dmitry Borisenko
746ecc9c7a некоторые изменения 2020-12-30 14:04:42 +01:00
Dmitry Borisenko
dad08c1686 Версия для esp32 2020-12-30 13:48:29 +01:00
Dmitry Borisenko
e0bb6d58e8 исправлена проблема с дробными числами 2020-12-27 01:26:19 +01:00
Dmitry Borisenko
a30dc04055 274 2020-12-26 23:24:37 +01:00
Dmitry Borisenko
454922b8b4 get mqtt remote 2020-12-26 23:10:07 +01:00
Dmitry Borisenko
02c363f1d6 dht preset 2020-12-26 16:31:10 +01:00
Dmitry Borisenko
d20f30d5e9 fix dht 2020-12-26 16:28:58 +01:00
Dmitry Borisenko
ddc3a92c15 переписан полностью датчик bme и bmp 2020-12-26 01:22:43 +01:00
Dmitry Borisenko
e33ec57a1e fixed dht22 bug 2020-12-25 22:07:27 +01:00
Dmitry Borisenko
7e4f852bf1 cleaning 2020-12-24 02:01:58 +01:00
Dmitry Borisenko
1a097ff2b7 change table 2020-12-24 01:58:14 +01:00
Dmitry Borisenko
99134cb6fd dht working 2020-12-24 01:41:15 +01:00
Dmitry Borisenko
5955743426 dht пока без коробки 2020-12-24 01:05:54 +01:00
Dmitry Borisenko
5c664594af in progress not working version!!! 2020-12-22 12:38:05 +01:00
Dmitry Borisenko
0df63ba642 последние изменения 2020-12-21 20:51:59 +01:00
Dmitry Borisenko
d9672d17b0 переписан dht 2020-12-21 01:46:11 +01:00
Dmitry Borisenko
c5772f8451 баг аналогового сенсора исправлен 2020-12-20 17:44:40 +01:00
Dmitry Borisenko
1df87f8986 устранен баг телеграма, баг сценариев.... 2020-12-20 17:08:16 +01:00
Dmitry Borisenko
3417d0c915 1мб 4мб переключение версий 2020-12-20 14:11:59 +01:00
Dmitry Borisenko
f4e917afba Merge pull request #69 from IoTManagerProject/alpha
mqtt reserve #2
2020-12-20 13:04:06 +01:00
Yuri Trikoz
2aa3b56e85 #SPIFFS 2020-12-20 01:24:08 +03:00
Yuri Trikoz
e60d5eb62f mqtt reserve #2 2020-12-19 20:12:31 +03:00
Dmitry Borisenko
6573b2c145 удалил little fs для esp32 из lib 2020-12-19 15:27:45 +01:00
Dmitry Borisenko
017c6f6234 размер страницы и размер блока 2020-12-19 14:18:22 +01:00
Dmitry Borisenko
305b3f32d6 1мб версия для теста с пресетами и с edit 2020-12-19 14:06:58 +01:00
Dmitry Borisenko
5280a8914f some 2020-12-19 13:51:53 +01:00
Dmitry Borisenko
cab8aff562 fixed var type 2020-12-19 13:39:04 +01:00
Dmitry Borisenko
4711af6589 fixed 2020-12-19 13:31:38 +01:00
Dmitry Borisenko
fe029a624c some 2020-12-19 00:10:45 +01:00
Dmitry Borisenko
17162a2d85 memory remain 2020-12-18 23:52:35 +01:00
Dmitry Borisenko
433d28a785 wrong pin error warning added 2020-12-18 23:20:42 +01:00
Dmitry Borisenko
19f728e209 prime and sec broker 2020-12-18 21:48:06 +01:00
Dmitry Borisenko
07b75afb94 Merge pull request #68 from ytrikoz/beta
FS info
2020-12-18 20:26:33 +01:00
Dmitry Borisenko
916116bbc4 Merge branch 'beta' into beta 2020-12-18 20:26:23 +01:00
Dmitry Borisenko
9ac72f14e0 telegram 2020-12-18 14:28:31 +01:00
Yuri Trikoz
eddb2eb289 Mqtt Reserve 2020-12-18 13:43:13 +03:00
Yuri Trikoz
5f9d9ec48e Use system defined led 2020-12-18 04:44:23 +03:00
Yuri Trikoz
0d6d1a7f6c FSInfo 2020-12-18 04:39:44 +03:00
Dmitry Borisenko
a467117df9 change to 4mb 2020-12-18 00:53:39 +01:00
Dmitry Borisenko
0bb028229a ziped data 2020-12-17 22:59:44 +01:00
Dmitry Borisenko
ce383fe7fe global change 1 mb working version 2020-12-17 22:48:20 +01:00
Dmitry Borisenko
2e240def88 working version 2020-12-17 02:01:12 +01:00
Dmitry Borisenko
245475ae99 full change of constuction 2020-12-17 01:29:30 +01:00
Yuri Trikoz
c4df80e904 Merge pull request #1 from IoTManagerProject/beta
Beta
2020-12-16 21:37:52 +03:00
Dmitry Borisenko
d5826b7038 1mb 2020-12-16 19:30:39 +01:00
Dmitry Borisenko
8f08459a5a 1mb 2020-12-16 19:28:44 +01:00
Dmitry Borisenko
2fc82c3311 Merge pull request #67 from ytrikoz/beta
pemz
2020-12-16 18:52:36 +01:00
Dmitry Borisenko
078c4389b5 1 mb compiling version 2020-12-16 13:59:01 +01:00
Dmitry Borisenko
9934690d0a some 2020-12-15 22:10:40 +01:00
Yuri Trikoz
b8a9f9b6b3 pemz 2020-12-13 02:23:04 +03:00
Dmitry Borisenko
9fd88ffae1 4mb build version 2020-12-13 01:06:08 +03:00
Dmitry Borisenko
9a7f6c5b05 4 mb version 2020-12-13 00:59:56 +03:00
Dmitry Borisenko
ef01d08053 Merge pull request #65 from ytrikoz/LastStableVersion
Remote build changes 1/x
2020-12-13 00:54:21 +03:00
Dmitry Borisenko
9a8061a84d Merge pull request #66 from saloid/patch-1
Fix typo in readme
2020-12-13 00:53:40 +03:00
Dmitry Borisenko
e9820efff9 1_mb_final 2020-12-12 01:14:31 +03:00
Dmitry Borisenko
b2385bbc4c 1 мб version 2020-12-12 00:43:36 +03:00
Dmitry Borisenko
3e5d9770a1 272 2020-12-11 17:37:29 +03:00
Dmitry Borisenko
71468599fe stability of san 2020-12-11 03:21:50 +03:00
Dmitry Borisenko
71c8fec27b bug fixed 2020-12-10 20:19:21 +03:00
Dmitry Borisenko
f487a691fb uart working version 2020-12-10 19:12:15 +03:00
Dmitry Borisenko
d17112b3ff uart 2020-12-10 05:13:09 +03:00
Dmitry Borisenko
81866043bc bug with virtual button fixed 2020-12-10 02:11:47 +03:00
Dmitry Borisenko
253a9a5ae5 Some more 2020-12-09 04:35:39 +03:00
Dmitry Borisenko
5c774c29bd some 2020-12-09 04:12:46 +03:00
Dmitry Borisenko
6205f6959c Gisteresis termostat 2020-12-09 04:08:36 +03:00
Dmitry Borisenko
6e44f76385 UART working condition 2020-12-06 02:08:37 +03:00
Dmitry Borisenko
8dd4d8491c UART in Progress 2020-12-06 00:59:47 +03:00
Dmitry Borisenko
4436991205 esp32 uart 2020-12-06 00:40:48 +03:00
Dmitry Borisenko
d15cf619f1 Fixed Ultrasonic, Start uart 2020-12-06 00:34:30 +03:00
Dmytro
9a2bdb54d1 Fix typo in readme 2020-12-02 22:30:21 +02:00
Dmitry Borisenko
7043855e3d randomSeed 2020-12-02 05:05:16 +03:00
Dmitry Borisenko
49f11841be Telegram 2020-12-02 04:50:29 +03:00
Dmitry Borisenko
e88718ada0 268 Single Scenario changed to MQTT source 2020-12-02 04:12:10 +03:00
Yuri Trikoz
0fc7cccda7 #remote build 2020-12-01 21:40:33 +03:00
Dmitry Borisenko
38924e4ed3 Single network space for scenario added 2020-11-21 06:03:02 +03:00
Dmitry Borisenko
70c34d3d8d Cleaning and optimization 2020-11-19 04:14:52 +03:00
Dmitry Borisenko
4f9763334b fix some more bugs 2020-11-18 13:29:53 +03:00
Dmitry Borisenko
b2e9d90686 timer bug fully fixed 2020-11-18 13:18:08 +03:00
Dmitry Borisenko
ceb516ddbe add count down timer 2020-11-18 03:25:05 +03:00
Dmitry Borisenko
06df1f17b6 Progress of renew of class 2020-11-17 01:01:42 +03:00
Dmitry Borisenko
a20c2b8564 Save date to flash added 2020-11-16 18:47:09 +03:00
Dmitry Borisenko
3c3a4a33ca RSSI to web interface added 2020-11-16 13:58:26 +03:00
Dmitry Borisenko
28c24562bc pic 2020-11-16 00:51:03 +03:00
Dmitry Borisenko
d0ef8ec82e new 2020-11-15 22:57:21 +03:00
Dmitry Borisenko
452110225d new 2020-11-15 22:55:21 +03:00
Dmitry Borisenko
bdc9cd9b31 123 2020-11-15 22:49:27 +03:00
Dmitry Borisenko
6cd60c9eef h 2020-11-15 22:48:17 +03:00
Dmitry Borisenko
3e9da81b8c p 2020-11-15 22:40:46 +03:00
Dmitry Borisenko
2e73eac2f1 13 2020-11-15 22:39:38 +03:00
Dmitry Borisenko
6f45148d75 cleaning 2020-11-15 03:09:21 +03:00
Dmitry Borisenko
3766a744f4 bug fixed with scenario init 2020-11-15 02:52:24 +03:00
Dmitry Borisenko
94d93d3be6 Working version 2020-11-15 02:46:27 +03:00
Dmitry Borisenko
d6aab0cf94 Big changes. Compiling version 2020-11-15 01:44:25 +03:00
Dmitry Borisenko
6135f3322e some 2020-11-14 23:00:09 +03:00
Dmitry Borisenko
b53e7d15a4 pic 2020-11-14 04:21:24 +03:00
Dmitry Borisenko
7daa49083b pic 2020-11-14 04:06:59 +03:00
Dmitry Borisenko
68dc9c7bb3 pic 2020-11-14 04:00:02 +03:00
Dmitry Borisenko
b5cf1fd347 pic 2020-11-14 03:57:39 +03:00
Dmitry Borisenko
22f44afa1e pic 2020-11-14 03:49:44 +03:00
Dmitry Borisenko
964abc9f0c pic 2020-11-14 03:45:38 +03:00
Dmitry Borisenko
dfae6ebf09 Add files via upload 2020-11-14 03:39:48 +03:00
Dmitry Borisenko
50ad50efb2 ButtonOut changed (not working version) 2020-11-13 17:13:50 +03:00
Dmitry Borisenko
96f160fc88 editor changed 2020-11-13 02:58:45 +03:00
Dmitry Borisenko
8bfba7ab4a some change 2020-11-08 18:36:36 +03:00
Dmitry Borisenko
6d52a181f0 udp changed for Vadim 2020-11-08 18:27:01 +03:00
Dmitry Borisenko
044dd6294e Update README.md 2020-11-08 03:09:48 +03:00
Dmitry Borisenko
c2baece068 Update README.md 2020-11-08 03:09:17 +03:00
Dmitry Borisenko
9d6ec18bb2 add one more preset 2020-11-07 02:51:44 +03:00
Dmitry Borisenko
50a5d51281 Merge pull request #63 from IoTManagerProject/beta
Beta
2020-11-07 01:40:13 +03:00
Dmitry Borisenko
709a1fe1f7 267 Scenario bug fully fixed Stable 2020-11-07 01:11:32 +03:00
Dmitry Borisenko
1f46226a46 fixed scenario bug 2020-11-06 20:17:49 +03:00
Dmitry Borisenko
8cd84a09e2 Merge pull request #62 from IoTManagerProject/beta
Beta
2020-11-06 00:18:48 +03:00
Dmitry Borisenko
e52437b828 266 (fix scenario bug) 2020-11-05 17:27:18 +03:00
Dmitry Borisenko
1f69019bb3 265 Telegram support added 2020-11-05 02:23:08 +03:00
Dmitry Borisenko
2cad740fc6 telegram bot added (working version) 2020-11-04 23:48:21 +03:00
Dmitry Borisenko
aec1d50732 264 2020-11-03 22:49:57 +03:00
Dmitry Borisenko
8817c532f4 esp32 compiling version 2020-11-03 22:45:43 +03:00
Dmitry Borisenko
3d42b96676 Merge pull request #61 from IoTManagerProject/beta
Beta
2020-11-03 19:10:53 +03:00
Dmitry Borisenko
9845f010fd some 2020-11-03 19:07:59 +03:00
Dmitry Borisenko
c02abefb43 264 stable. Dallas bug fixed! 2020-11-03 19:07:22 +03:00
Dmitry Borisenko
aba00d9a70 compiling version 2020-11-03 01:22:00 +03:00
Dmitry Borisenko
0efae6949d presets added 2020-11-03 00:04:07 +03:00
Dmitry Borisenko
777a04b901 impuls bug fixed 2020-11-02 15:20:04 +03:00
Dmitry Borisenko
50590bc90e fixed some bugs 2020-11-02 04:09:15 +03:00
Dmitry Borisenko
0bfc876c65 263 Impuls added 2020-11-02 01:21:51 +03:00
Dmitry Borisenko
518a0e0404 Impuls generator in progress 2020-11-01 16:50:44 +03:00
IoTManagerProject
245db32e0b Merge pull request #60 from IoTManagerProject/beta
262
2020-11-01 05:03:47 +03:00
Dmitry Borisenko
24de398a32 262 2020-11-01 05:02:59 +03:00
IoTManagerProject
b2163c7626 Merge pull request #59 from IoTManagerProject/beta
Beta
2020-11-01 04:50:26 +03:00
Dmitry Borisenko
d96aea8eef 262 Logging added, working version 2020-11-01 04:48:35 +03:00
Dmitry Borisenko
1126575822 logging and udp 2020-11-01 02:52:57 +03:00
Dmitry Borisenko
8445dd3b0c Logging in progress 2020-11-01 00:03:08 +03:00
Dmitry Borisenko
b7a98e19d2 vector final working version 2020-10-31 21:12:55 +03:00
Dmitry Borisenko
ff12345b12 logging class working vector 2020-10-31 21:07:49 +03:00
Dmitry Borisenko
0385beccdd add logging class (not working version) 2020-10-27 02:13:45 +03:00
IoTManagerProject
f3a6add753 Merge pull request #58 from IoTManagerProject/beta
261
2020-10-21 22:52:30 +03:00
Dmitry Borisenko
e984768a8d some 2020-10-21 01:51:13 +03:00
Dmitry Borisenko
fb218fea76 open long names 2020-10-21 01:46:47 +03:00
Dmitry Borisenko
600e66c345 261 2020-10-21 01:08:24 +03:00
Dmitry Borisenko
29e5a55ad3 Optimization 2020-10-20 23:58:23 +03:00
Dmitry Borisenko
a5171f1178 Optimization 2020-10-20 22:55:45 +03:00
IoTManagerProject
a18f95d4e5 Create README.md 2020-10-20 17:54:33 +03:00
Dmitry Borisenko
6064b9eac9 260 add uptime to iot manager 2020-10-20 17:22:26 +03:00
Dmitry Borisenko
c389792081 259 2020-10-20 01:40:40 +03:00
Dmitry Borisenko
7f0993f33b update 2020-10-19 02:23:26 +03:00
Dmitry Borisenko
56e98e27f6 some changes 2020-10-19 02:01:43 +03:00
Dmitry Borisenko
bea7afd057 fix ota update for esp32 2020-10-19 01:44:06 +03:00
Dmitry Borisenko
cfd9d5baa0 esp32 version 2020-10-19 01:21:20 +03:00
Dmitry Borisenko
b43fd9e389 update little fs lib to last version 2020-10-19 00:46:38 +03:00
Dmitry Borisenko
92371f01da esp32 compiling version 2020-10-19 00:20:49 +03:00
Dmitry Borisenko
5b72a9b37f 258 test version 2020-10-18 22:23:19 +03:00
Dmitry Borisenko
d2855270cf Merge pull request #54 from ytrikoz/beta
ESP32 target build
2020-10-18 21:18:38 +02:00
Yuri Trikoz
8778de1ffd -40b 2020-10-18 10:17:24 +03:00
Yuri Trikoz
281f338f97 Typos with Asinc and \ in path 2020-10-18 09:52:17 +03:00
Yuri Trikoz
d3ad04eae6 https://en.cppreference.com/w/c/comment 2020-10-18 09:39:37 +03:00
Yuri Trikoz
74b526e2f1 new platformio lib_deps format 2020-10-18 09:38:24 +03:00
Yuri Trikoz
6426959060 ESP32 SSDP 2020-10-18 02:27:08 +03:00
Yuri Trikoz
cd9a6c98fa SSDP_EN 2020-10-18 01:47:02 +03:00
Yuri Trikoz
3bafbb88df ESP32 target 2020-10-18 00:07:57 +03:00
Yuri Trikoz
eaef10aee2 Merge pull request #1 from IoTManagerProject/beta
Beta
2020-10-17 22:58:00 +03:00
Dmitry Borisenko
d9556f5b31 257 Median filter added to ultasonic 2020-10-12 01:30:24 +03:00
Dmitry Borisenko
a1eb94c4b3 256 stable 2020-10-10 12:38:29 +03:00
Dmitry Borisenko
5b6128ca21 254 fixed bug of items list 2020-10-10 12:04:40 +03:00
Dmitry Borisenko
65456398ac 253 2020-10-10 02:40:04 +03:00
Dmitry Borisenko
23fc8ec469 time working 2020-10-10 02:36:23 +03:00
Dmitry Borisenko
3607c26ae0 251 2020-10-10 02:03:05 +03:00
Dmitry Borisenko
54841d59cf 252 added delete function in items list 2020-10-10 01:44:11 +03:00
Dmitry Borisenko
8bf136373c 251 fixed ultrasonic bug 2020-10-07 11:39:08 +03:00
Dmitry Borisenko
716aa697dc 250 fixed list bug 2020-10-05 01:09:00 +03:00
Dmitry Borisenko
12cdefd531 249 button bug fixed 2020-10-05 00:03:53 +03:00
Dmitry Borisenko
19bc027083 249 2020-10-04 23:54:41 +03:00
Dmitry Borisenko
1e4206f31d 248 2020-10-04 02:45:26 +03:00
Dmitry Borisenko
d6cb8b8d9a 247 2020-10-02 01:37:40 +03:00
Dmitry Borisenko
7472863b05 wifi reconnection bug fixed 2020-10-02 01:14:45 +03:00
Dmitry Borisenko
8a80d509c7 245 2020-10-01 21:06:45 +03:00
Dmitry Borisenko
a77784abc7 changes 2020-10-01 20:38:46 +03:00
Dmitry Borisenko
52b8d971d8 Some changes 2020-09-30 23:21:46 +03:00
Dmitry Borisenko
65175e3663 modbus rtu final 2020-09-18 03:44:03 +03:00
Dmitry Borisenko
9619a17abf Modbus rtu reading 2020-09-18 02:32:37 +03:00
Dmitry Borisenko
3d1f1ec524 modbus support 2020-09-18 02:26:34 +03:00
Dmitry Borisenko
734f3e1b36 Bus scanner added 2020-09-18 00:24:07 +03:00
Dmitry Borisenko
b66b4ab947 cleaning 2020-09-18 00:02:20 +03:00
Dmitry Borisenko
0598a20beb add bmp sensor 2020-09-17 23:45:10 +03:00
Dmitry Borisenko
16b2498d6a bme 280 support 2020-09-17 22:49:55 +03:00
Dmitry Borisenko
716dfd095d changes 2020-09-17 21:51:56 +03:00
Dmitry Borisenko
e23481eef2 ota added 2020-09-17 21:33:54 +03:00
Dmitry Borisenko
d6f5506812 last version 2020-09-17 18:32:39 +03:00
Dmitry Borisenko
8568e945a4 modules 2020-09-17 18:04:06 +03:00
Dmitry Borisenko
0a212e0933 Debug changed 2020-09-17 17:27:44 +03:00
Dmitry Borisenko
fc91a60bab udp support 2020-09-17 00:21:14 +03:00
Dmitry Borisenko
e0a83189d9 telemetry final version 2020-09-16 15:16:01 +03:00
Dmitry Borisenko
fe35633d23 Worktime 2020-09-15 23:50:08 +03:00
Dmitry Borisenko
251f7ee83f changes 2020-09-09 16:44:19 +03:00
Dmitry Borisenko
c960e5c5e5 cleaning 2020-09-08 01:26:18 +03:00
Dmitry Borisenko
807a6855e4 Stable 2020-09-07 17:00:22 +03:00
Dmitry Borisenko
bac9396e9a last working version 2020-09-07 02:22:13 +03:00
Dmitry Borisenko
dcbc928896 Working version 2020-09-07 01:32:09 +03:00
Dmitry Borisenko
d8dfe7f60c working version 2020-09-07 00:36:03 +03:00
Dmitry Borisenko
e505eb9b6e changes 2020-09-06 23:00:33 +03:00
Dmitry Borisenko
799118d763 Changes 2020-09-04 18:58:03 +03:00
Dmitry Borisenko
a258c8c1b6 Add DHT sensor 2020-09-04 15:35:35 +03:00
Dmitry Borisenko
26b5c173a2 sensor dht support 2020-09-04 13:44:49 +03:00
Dmitry Borisenko
551b35ff4f working version 2020-09-04 00:35:38 +03:00
Dmitry Borisenko
eea82a7edb Var changes 2020-09-03 23:29:34 +03:00
Dmitry Borisenko
26b211dc07 ssdp on 2020-09-03 02:08:11 +03:00
Dmitry Borisenko
ab65cda820 working version with optimization 2020-09-03 02:07:12 +03:00
Dmitry Borisenko
89fed305c8 compiling version 2020-09-03 01:24:16 +03:00
Dmitry Borisenko
93c6b05238 not working version 2020-09-03 01:12:43 +03:00
Dmitry Borisenko
8a07b7cbd7 devide into files 2020-09-02 23:37:11 +03:00
Dmitry Borisenko
4a57cf69d1 working version 2020-09-02 23:05:30 +03:00
Dmitry Borisenko
2e8ea582d2 reverting version 2020-09-02 22:34:49 +03:00
Dmitry Borisenko
70096c71c8 revert 2020-09-02 22:33:03 +03:00
Dmitry Borisenko
26383c0a19 123 2020-09-02 22:31:08 +03:00
Dmitry Borisenko
a8e7799011 change 2020-09-02 22:08:39 +03:00
Dmitry Borisenko
a9fc6f73f5 test 2020-08-31 02:13:02 +03:00
Dmitry Borisenko
e66b49ddc3 test 2020-08-31 01:55:03 +03:00
Dmitry Borisenko
3816711f04 optimization 2020-08-31 01:45:43 +03:00
Dmitry Borisenko
0005760774 comments 2020-08-30 13:55:51 +03:00
Dmitry Borisenko
86ee523182 esp32 compiling version 2020-08-30 00:12:11 +03:00
Dmitry Borisenko
01248f41da esp32 2020-08-29 23:33:45 +03:00
Dmitry Borisenko
786468e0b9 optimization scenario 2020-08-29 23:30:04 +03:00
Dmitry Borisenko
490a2f1f5b optimization of scenario 2020-08-29 23:02:19 +03:00
Dmitry Borisenko
61f1ad64a1 Scenario class in working condition 2020-08-29 22:14:35 +03:00
Dmitry Borisenko
25d58d3471 Scenario class 2020-08-29 20:17:39 +03:00
Dmitry Borisenko
b1ca2ad511 ssdp 2020-08-29 15:25:28 +03:00
Dmitry Borisenko
8219cf3271 ssdp fixed 2020-08-29 15:15:38 +03:00
Dmitry Borisenko
21e7297035 SSDP added 2020-08-28 23:18:18 +03:00
Dmitry Borisenko
3ab75bcea6 progress 2020-08-28 04:58:38 +03:00
Dmitry Borisenko
eb6c06c8e9 not working version 2020-08-28 03:58:54 +03:00
Dmitry Borisenko
0c1a1940d2 progress of sensors 2020-08-28 03:25:13 +03:00
Dmitry Borisenko
c473f616b6 add analog sensor 2020-08-28 02:49:26 +03:00
Dmitry Borisenko
74a7c8f528 some changes 2020-08-27 00:58:41 +03:00
Dmitry Borisenko
f16d336575 changes 2020-08-26 20:07:08 +03:00
Dmitry Borisenko
ffc5e6c894 output text module added 2020-08-26 16:39:42 +03:00
Dmitry Borisenko
90e6822d3b working wersion with elements 2020-08-26 15:44:19 +03:00
Dmitry Borisenko
e3f3ae7664 add iputs for time and value 2020-08-26 01:47:16 +03:00
Dmitry Borisenko
abbfcec92c Working version with NotAsinc class 2020-08-26 01:03:45 +03:00
Dmitry Borisenko
7f7bad305c great changes 2020-08-25 19:25:54 +03:00
Dmitry Borisenko
532925756f process to asinc 2020-08-25 18:36:05 +03:00
Dmitry Borisenko
b1318de1dc call back test class 2020-08-25 15:45:06 +03:00
Dmitry Borisenko
c11983003b working example of callback with date passing inside and outside for using 2020-08-25 01:55:43 +03:00
Dmitry Borisenko
ce7c550410 working example of callback with date passing inside and outside 2020-08-24 15:09:43 +03:00
Dmitry Borisenko
e44d2dc793 callback 2020-08-24 13:56:12 +03:00
Dmitry Borisenko
82b1fb6846 changes 2020-08-22 13:31:25 +03:00
Dmitry Borisenko
0485feeabe web interface constructor 2020-08-21 02:34:38 +03:00
Dmitry Borisenko
e0d0e30e93 Continue making web interface 2020-08-20 03:12:04 +03:00
Dmitry Borisenko
0ebe372848 pic 2020-08-19 02:46:36 +03:00
Dmitry Borisenko
e32097f563 pic 2020-08-19 02:46:18 +03:00
Dmitry Borisenko
10975cc8df pic 2020-08-19 02:10:01 +03:00
Dmitry Borisenko
1fa2add718 pic 2020-08-19 02:07:28 +03:00
Dmitry Borisenko
6c8be73d3a pictures 2020-08-19 01:56:13 +03:00
Dmitry Borisenko
b2c8437c05 pic 2020-08-19 01:53:59 +03:00
Dmitry Borisenko
ef6930350e Class renaming 2020-08-19 01:28:10 +03:00
Dmitry Borisenko
7ec3c05e6c Merge branch 'stable' into beta 2020-08-19 01:22:42 +03:00
Dmitry Borisenko
b95a56d3a5 Merge pull request #52 from ytrikoz/stable
FSEditor
2020-08-18 18:12:50 +03:00
Yuri Trikoz
b512c0258d FSEditor 2020-08-08 02:00:20 +03:00
Yuri Trikoz
33ebb36aec FSEditor 2020-08-06 02:10:08 +03:00
Dmitry Borisenko
8d31bcb5dd Start to make constructor 2020-08-04 02:21:20 +02:00
Dmitry Borisenko
78fb96d50d input time and input digit done 2020-08-03 01:09:11 +02:00
Dmitry Borisenko
6c969a2455 input completed 2020-08-02 15:58:10 +02:00
Dmitry Borisenko
8df3ab8946 Button added and input 2020-08-02 01:54:26 +02:00
IoTManagerProject
b2496bbc9f Merge pull request #51 from IoTManagerProject/stable
bme
2020-08-01 20:08:28 +02:00
Dmitry Borisenko
614b456b24 Merge branch 'stable' of https://github.com/IoTManagerProject/IoTManager into stable 2020-08-01 20:06:40 +02:00
Dmitry Borisenko
feab9e9afd Fix bug with bme pressure 2020-08-01 20:06:15 +02:00
Dmitry Borisenko
924b6a1e84 switch in progress 2020-07-31 01:52:57 +02:00
Dmitry Borisenko
f4a5bc0218 pwm add 2020-07-31 01:29:16 +02:00
Dmitry Borisenko
217cdfc080 Buttons done 2020-07-31 00:56:10 +02:00
Dmitry Borisenko
b0fe94ddd4 Change name 2020-07-30 21:39:50 +02:00
Dmitry Borisenko
6831c49a13 working with class 2020-07-30 21:18:04 +02:00
Dmitry Borisenko
715ae0584a Merge branch 'beta' of https://github.com/IoTManagerProject/IoTManager into beta 2020-07-30 21:15:39 +02:00
IoTManagerProject
3dab9e484f Merge pull request #50 from IoTManagerProject/stable
bugs
2020-07-30 21:15:19 +02:00
Dmitry Borisenko
1eac8a2f0e ESP8266httpUpdate renaming 2020-07-30 21:08:48 +02:00
Dmitry Borisenko
2434602d78 fixed bug with missing dallas lib dep 2020-07-30 21:04:25 +02:00
Dmitry Borisenko
854d5f42e5 наследование 2020-07-30 11:27:12 +02:00
Dmitry Borisenko
7806aa1ae8 changge 2020-07-29 21:53:32 +02:00
Dmitry Borisenko
98d59615a3 changed 2020-07-29 21:44:49 +02:00
Dmitry Borisenko
7134c07f60 Class 2020-07-29 21:41:12 +02:00
Dmitry Borisenko
9fa3ec05c2 class 2020-07-29 21:38:39 +02:00
Dmitry Borisenko
832e6a36f1 Add class item for all items in systed 2020-07-29 00:58:59 +02:00
Dmitry Borisenko
5aa6f9482f button with name 2020-07-28 22:22:14 +02:00
Dmitry Borisenko
bcbec5a9d8 change name 2020-07-28 19:45:03 +02:00
Dmitry Borisenko
2e66c93814 add button with name (wo number) 2020-07-28 00:52:49 +02:00
IoTManagerProject
e04bb7bb78 Merge pull request #49 from IoTManagerProject/beta
Удаление сканера one wire
2020-07-27 22:25:58 +02:00
Dmitry Borisenko
110fc167a1 Удаление сканера one wire 2020-07-27 21:10:11 +02:00
IoTManagerProject
be60311f35 Merge pull request #48 from IoTManagerProject/beta
Fixed bug with little fs system in platformio ini
2020-07-27 20:21:02 +02:00
Dmitry Borisenko
bdd9f1d3bd Fixed bug with little fs system in platformio ini 2020-07-27 00:59:41 +02:00
IoTManagerProject
291373fe6f Merge pull request #47 from IoTManagerProject/beta
Beta
2020-07-27 00:58:27 +02:00
Dmitry Borisenko
b653ce1e87 start version 2020-07-26 23:48:19 +02:00
Dmitry Borisenko
4aa0dc39b9 dell all 2020-07-26 23:47:00 +02:00
Dmitry Borisenko
f7f4e176b2 Merge pull request #39 from IoTManagerProject/dev
Dev
2020-06-27 11:20:14 +02:00
Dmitry Borisenko
62d0355a1e Merge pull request #38 from DmitryBorisenko33/dev
Изменил версию
2020-06-27 11:19:24 +02:00
Dmitry Borisenko
9b94aef8ca Изменил версию на 2.3.5 2020-06-27 11:17:38 +02:00
Dmitry Borisenko
3dc49f66a8 Merge pull request #37 from IoTManagerProject/dev
Dev
2020-06-27 11:13:10 +02:00
Dmitry Borisenko
d96ba8cb2c Merge pull request #36 from ytrikoz/dev
Dev
2020-06-27 11:12:18 +02:00
Dmitry Borisenko
2dfca14478 Merge pull request #25 from ytrikoz/dev
Dev
2020-06-27 11:06:31 +02:00
Yuri Trikoz
b6eedca37e extract isScenarioEnabled() 2020-06-27 05:22:24 +03:00
Yuri Trikoz
d7e6e0e9b8 skip time 2020-06-27 04:37:11 +03:00
Dmitry Borisenko
9e291bfc9c Merge pull request #24 from ytrikoz/dev
clock fix
2020-06-27 03:23:22 +02:00
Yuri Trikoz
7ac0691347 clock fix 2020-06-27 04:20:48 +03:00
Dmitry Borisenko
eb2881ee0a Merge pull request #23 from ytrikoz/dev
clock timezone
2020-06-27 03:19:18 +02:00
Yuri Trikoz
39a3cb04ed clock timezone 2020-06-27 02:37:30 +03:00
Dmitry Borisenko
e561f82b02 Merge pull request #22 from ytrikoz/dev
Dev
2020-06-27 00:35:48 +02:00
Yuri Trikoz
00fd9f9bb9 clock 2020-06-27 01:21:58 +03:00
Yuri Trikoz
b51ec4d0e2 Merge pull request #2 from DmitryBorisenko33/dev
Проверил модуль serial работают все функции
2020-06-26 22:13:23 +03:00
Dmitry Borisenko
e60269ed1e Merge pull request #35 from DmitryBorisenko33/dev
Some changes
2020-06-26 16:43:36 +02:00
Dmitry Borisenko
0f0d2ea209 Merge pull request #34 from DmitryBorisenko33/dev
Some changes
2020-06-26 16:43:14 +02:00
Dmitry Borisenko
5faa708c83 Some changes 2020-06-26 16:41:39 +02:00
Dmitry Borisenko
3ece57fc18 Merge pull request #33 from DmitryBorisenko33/dev
Проверил полностью модуль serial
2020-06-26 15:23:56 +02:00
Dmitry Borisenko
f75f0b5a50 Merge pull request #32 from DmitryBorisenko33/dev
Проверил полностью модуль serial
2020-06-26 15:23:33 +02:00
Dmitry Borisenko
9add7c9e8e Проверил полностью модуль serial 2020-06-26 15:20:56 +02:00
Dmitry Borisenko
5de838beb8 Merge pull request #31 from DmitryBorisenko33/dev
12
2020-06-26 01:09:05 +02:00
Dmitry Borisenko
b7899aa059 Merge pull request #30 from DmitryBorisenko33/dev
123
2020-06-26 01:08:10 +02:00
Dmitry Borisenko
c0b7cdddf8 Merge pull request #29 from ytrikoz/dev
Dev
2020-06-26 01:06:23 +02:00
Dmitry Borisenko
d802758b6f Merge pull request #21 from ytrikoz/dev
time works
2020-06-26 01:04:43 +02:00
Yuri Trikoz
a13dda46ca time works 2020-06-26 01:38:29 +03:00
Dmitry Borisenko
a73747c3dc Merge pull request #20 from ytrikoz/dev
Dev
2020-06-25 20:08:33 +02:00
Yuri Trikoz
e9a8e44a7a time 2020-06-25 20:13:20 +03:00
Dmitry Borisenko
cd6008435e Обновление брокера mqtt 2020-06-25 19:11:43 +02:00
Yuri Trikoz
6277d2a9db Merge branch 'dev' of https://github.com/ytrikoz/IoTManager into dev 2020-06-25 17:57:30 +03:00
Yuri Trikoz
d0c6d34f4a BusScanner 2020-06-25 17:57:17 +03:00
Yuri Trikoz
428efff8d5 BusScanner 2020-06-25 17:55:22 +03:00
IoTManagerProject
7330849262 Merge pull request #28 from IoTManagerProject/dev
First stable version
2020-06-25 15:59:53 +02:00
Dmitry Borisenko
3dfee0eabe Merge pull request #27 from ytrikoz/dev
Dev
2020-06-25 15:58:18 +02:00
Dmitry Borisenko
b6d346f779 Merge pull request #19 from ytrikoz/dev
typos fix
2020-06-25 15:57:34 +02:00
Yuri Trikoz
a1bd008867 typos fix 2020-06-25 14:20:22 +03:00
Dmitry Borisenko
1264f12314 Merge pull request #18 from ytrikoz/dev
Dev
2020-06-25 11:38:10 +02:00
Yuri Trikoz
7c61ff2810 getData 2020-06-25 09:21:42 +03:00
Yuri Trikoz
5ed1c23c62 widgets 2020-06-25 07:08:09 +03:00
Yuri Trikoz
b50e1c9791 renaming 2020-06-25 05:09:11 +03:00
Dmitry Borisenko
baba0b77b2 Merge pull request #17 from ytrikoz/dev
renaming
2020-06-24 23:16:36 +02:00
Yuri Trikoz
3daa517c7e renaming 2020-06-25 00:15:10 +03:00
Dmitry Borisenko
6618e6fa7e Merge pull request #26 from DmitryBorisenko33/dev
изменения
2020-06-24 23:10:02 +02:00
Dmitry Borisenko
688a769798 Merge pull request #16 from ytrikoz/dev
Merge pull request #1 from DmitryBorisenko33/dev
2020-06-24 23:09:01 +02:00
Yuri Trikoz
a25288ef79 Merge pull request #1 from DmitryBorisenko33/dev
Data
2020-06-24 22:12:44 +03:00
Dmitry Borisenko
5643804d77 Переименовал файлы присетов! Добавил присет для модуля uart 2020-06-24 15:54:15 +02:00
Dmitry Borisenko
90a342bc27 Порядок 2020-06-24 14:40:47 +02:00
Dmitry Borisenko
c4dfdee7e5 Changed preset order to correct one 2020-06-24 14:28:13 +02:00
Dmitry Borisenko
a422c72565 No need replace 2020-06-24 14:26:52 +02:00
Dmitry Borisenko
2c3efd6309 Merge pull request #15 from ytrikoz/platformio
12
2020-06-24 01:51:50 +02:00
Yuri Trikoz
e400de1e1c Serial active on create 2020-06-24 02:49:44 +03:00
Yuri Trikoz
cc3c17dfb2 Serial 2020-06-24 02:11:08 +03:00
Yuri Trikoz
f9933ea55e Serial 2020-06-24 01:46:05 +03:00
Dmitry Borisenko
59f65abda8 Merge pull request #14 from ytrikoz/platformio
Serial
2020-06-24 00:44:04 +02:00
Yuri Trikoz
7dd13b7fcf Serial 2020-06-24 01:42:56 +03:00
Dmitry Borisenko
f54cac95bb Merge pull request #13 from ytrikoz/platformio
Serial
2020-06-24 00:41:48 +02:00
Yuri Trikoz
cb9c0efac6 Serial 2020-06-24 01:40:35 +03:00
Dmitry Borisenko
06bbecd0bb Merge pull request #12 from ytrikoz/platformio
изменения
2020-06-24 00:34:35 +02:00
Yuri Trikoz
dfeb25a8fa Serial 2020-06-24 01:33:42 +03:00
Dmitry Borisenko
ecd124dacc Merge pull request #11 from IoTManagerProject/dev
Merge pull request #25 from DmitryBorisenko33/dev
2020-06-24 00:25:15 +02:00
Dmitry Borisenko
6e97ec5845 Merge pull request #25 from DmitryBorisenko33/dev
123
2020-06-24 00:24:51 +02:00
Yuri Trikoz
e375cca3dc Terminal 2020-06-24 01:16:00 +03:00
Dmitry Borisenko
8f76cbac74 Merge pull request #10 from IoTManagerProject/platformio
Изменения
2020-06-22 22:32:18 +02:00
Yuri Trikoz
b50911ddcf mqtt publish state fix 2020-06-22 18:09:39 +03:00
Yuri Trikoz
8f395ccc8a SoftwareSerial 2020-06-22 17:40:29 +03:00
Dmitry Borisenko
fea662aed2 Merge pull request #9 from IoTManagerProject/platformio
Изменения
2020-06-22 13:58:08 +02:00
Yuri Trikoz
f7e3515c82 Merge pull request #24 from ytrikoz/platformio
some updates
2020-06-22 14:06:42 +03:00
Yuri Trikoz
1bfe58766d Merge branch 'platformio' of https://github.com/ytrikoz/esp32-esp8266_iot-manager_modules_firmware into platformio 2020-06-22 14:01:54 +03:00
Yuri Trikoz
274678f17a Updates 2020-06-22 14:01:12 +03:00
Dmitry Borisenko
059b08fb8b Merge pull request #8 from IoTManagerProject/platformio
Изменения 4
2020-06-22 02:22:33 +02:00
Yuri Trikoz
f638de4139 Merge pull request #23 from ytrikoz/platformio
32 broken
2020-06-22 03:20:40 +03:00
Yuri Trikoz
8cdc271c48 Merge branch 'platformio' into platformio 2020-06-22 03:18:19 +03:00
Yuri Trikoz
092bec7dde 32 broken 2020-06-22 03:11:02 +03:00
Dmitry Borisenko
4967f66238 Merge pull request #22 from DmitryBorisenko33/platformio
Исправлен баг с bmp280
2020-06-21 18:10:56 +02:00
Dmitry Borisenko
3a3d27492b Исправлен баг с bmp280 2020-06-21 18:10:14 +02:00
Dmitry Borisenko
4013a21262 Merge pull request #21 from DmitryBorisenko33/platformio
Исправил кнопку правильно!
2020-06-21 17:53:01 +02:00
Dmitry Borisenko
eba3b80076 Merge branch 'platformio' of https://github.com/DmitryBorisenko33/IoTManager into platformio 2020-06-21 17:51:32 +02:00
Dmitry Borisenko
c9c8fc0a31 Исправил кнопку правильно!!!! 2020-06-21 17:50:10 +02:00
Dmitry Borisenko
cba45d7893 Merge pull request #7 from IoTManagerProject/platformio
Merge pull request #20 from DmitryBorisenko33/platformio
2020-06-21 16:58:23 +02:00
Dmitry Borisenko
2769a8883f Merge pull request #20 from DmitryBorisenko33/platformio
Merge pull request #6 from IoTManagerProject/platformio
2020-06-21 16:56:19 +02:00
Dmitry Borisenko
e2e6256aa0 Merge pull request #6 from IoTManagerProject/platformio
Изменения
2020-06-21 16:55:34 +02:00
Dmitry Borisenko
b9f0564f28 Merge pull request #19 from DmitryBorisenko33/platformio
Исправил баг физической кнопки (проверил  работает)
2020-06-21 16:52:57 +02:00
Dmitry Borisenko
b53660d4bf Исправил баг физической кнопки (проверил работает) 2020-06-21 16:47:50 +02:00
Dmitry Borisenko
2333006b76 Merge pull request #18 from DmitryBorisenko33/platformio
Некоторые подправления
2020-06-21 16:31:44 +02:00
Dmitry Borisenko
f2aabd0349 change 2020-06-21 16:29:30 +02:00
Dmitry Borisenko
63e34bf2e2 change dallas 2020-06-21 16:27:02 +02:00
Dmitry Borisenko
9a5172e4a6 Поменял команду на правильную 2020-06-21 16:22:13 +02:00
Dmitry Borisenko
c670d0cb58 Изменил линию на даллас 2020-06-21 15:58:54 +02:00
Dmitry Borisenko
4e478c9d2a Merge pull request #5 from IoTManagerProject/platformio
bug fix
2020-06-21 14:23:16 +02:00
Yuri Trikoz
40688130fd bug fix 2020-06-21 15:20:40 +03:00
Dmitry Borisenko
62e11ff7fc Merge pull request #4 from IoTManagerProject/platformio
Юрины изменения 3
2020-06-21 14:14:18 +02:00
Yuri Trikoz
179ab2c3bf ESP32 LittleFS System Image 2020-06-21 12:23:00 +03:00
Yuri Trikoz
91359fa9c4 Merge pull request #4 from IoTManagerProject/platformio
Merge pull request #17 from ytrikoz/platformio
2020-06-21 03:51:40 +03:00
Yuri Trikoz
de0696b81a Merge pull request #17 from ytrikoz/platformio
ESP32 ESP8266 LittleFs
2020-06-21 03:50:04 +03:00
Yuri Trikoz
aeedbdef92 Merge branch 'platformio' into platformio 2020-06-21 03:49:09 +03:00
Yuri Trikoz
bba7487374 platformio esp8266, esp32 2020-06-21 03:43:15 +03:00
Dmitry Borisenko
f7d4b9abc9 Merge pull request #16 from DmitryBorisenko33/platformio
Добавлена ссылка на гитхаб для скачивания платформы
2020-06-20 23:00:03 +02:00
Dmitry Borisenko
45e96da169 Link to git added 2020-06-20 22:56:12 +02:00
Yuri Trikoz
ac6f51af7b Merge pull request #3 from IoTManagerProject/platformio
Merge pull request #15 from ytrikoz/platformio
2020-06-20 23:10:22 +03:00
Dmitry Borisenko
72989f3dfb Merge pull request #3 from IoTManagerProject/platformio
Trasfering to little FS
2020-06-20 22:09:09 +02:00
Yuri Trikoz
c7b87508a1 Merge pull request #15 from ytrikoz/platformio
LittleFS
2020-06-20 23:03:19 +03:00
Yuri Trikoz
704afcdcd2 Merge branch 'platformio' into platformio 2020-06-20 23:03:05 +03:00
Yuri Trikoz
6fbd555474 LittleFS, and some mprovements 2020-06-20 22:51:14 +03:00
Dmitry Borisenko
91fffe83d1 Merge pull request #14 from DmitryBorisenko33/platformio
Fix error
2020-06-20 21:31:19 +02:00
Dmitry Borisenko
cffd80d125 Fix error 2020-06-20 21:28:56 +02:00
Dmitry Borisenko
93fd7f6e16 Merge pull request #2 from IoTManagerProject/platformio
Юрины изменения 2
2020-06-20 21:16:54 +02:00
Dmitry Borisenko
fb62ae7a4b Merge pull request #13 from DmitryBorisenko33/platformio
Long files deleted
2020-06-20 21:14:18 +02:00
Dmitry Borisenko
c4feb99e8d Long files deleted 2020-06-20 21:12:57 +02:00
Yuri Trikoz
db5b8d7258 Merge pull request #2 from IoTManagerProject/platformio
sync to base
2020-06-20 17:17:56 +03:00
Yuri Trikoz
52599fe02c Merge pull request #12 from ytrikoz/platformio
FileUtils, some typos fixes
2020-06-20 17:16:16 +03:00
Yuri Trikoz
de5a9c01d0 FileUtils, some typos fixes 2020-06-20 17:12:59 +03:00
Dmitry Borisenko
df9d70ce77 Merge pull request #11 from DmitryBorisenko33/platformio
Changed order of lines
2020-06-20 16:09:22 +02:00
Dmitry Borisenko
652eaa99d0 Change order of lines for more good vision. Only order Youra! 2020-06-20 16:06:51 +02:00
Dmitry Borisenko
93d128b9b4 Merge pull request #1 from IoTManagerProject/platformio
Изменения от Юры
2020-06-20 13:45:01 +02:00
IoTManagerProject
98db017502 Merge pull request #10 from ytrikoz/platformio
Чистка и выделение
2020-06-20 13:35:16 +02:00
Yuri Trikoz
6f310e5e07 global cleaning, restructure 2020-06-20 14:27:58 +03:00
Yuri Trikoz
ece010976e Merge pull request #1 from IoTManagerProject/platformio
sync with base
2020-06-20 09:48:33 +03:00
Dmitry Borisenko
cbb821167b Merge pull request #9 from DmitryBorisenko33/platformio
Problems with unused vars fixed
2020-06-20 02:03:37 +02:00
Dmitry Borisenko
465c393db4 Problems with unused vars fixed 2020-06-20 02:00:56 +02:00
Dmitry Borisenko
7f2981d4e9 Merge pull request #8 from DmitryBorisenko33/platformio
Test of pull request
2020-06-20 01:09:12 +02:00
Dmitry Borisenko
66d3754cc4 Some Changes test 2020-06-20 01:06:39 +02:00
Dmitry Borisenko
734edf522d version changed 2020-06-20 00:56:50 +02:00
Dmitry Borisenko
8ec105d0b2 Change Version 2020-06-20 00:46:25 +02:00
Yuri Trikoz
b044497c8e fix 2020-06-19 23:34:30 +03:00
Dmitry Borisenko
817a3e5898 Global change 2020-06-19 22:14:50 +02:00
Dmitry Borisenko
446809355b changed 2020-06-19 15:22:22 +02:00
Dmitry Borisenko
48ba3c99dd changed json var names to more visible 2020-06-19 14:50:34 +02:00
Dmitry Borisenko
e6637dcd69 deleted some files, will be changed to new ones soon 2020-06-19 13:48:25 +02:00
Dmitry Borisenko
2a45769caf Com port speed settings added 2020-06-19 13:30:44 +02:00
Dmitry Borisenko
2edba7baba Partitions for ESP32 2020-06-19 12:59:35 +02:00
Yuri Trikoz
02855b5ab9 remove dupe strings 2020-06-19 07:48:31 +03:00
Yuri Trikoz
15aa8c8539 Utils 2020-06-19 07:27:06 +03:00
Yuri Trikoz
aa1ad777c9 105.5% 2020-06-19 03:49:56 +03:00
Dmitry Borisenko
5494f61267 full size test 2020-06-19 02:31:56 +02:00
Yuri Trikoz
5bec53e6c2 global vars 2020-06-19 01:50:19 +03:00
Dmitry Borisenko
86e18f1e99 First working platformio version 2020-06-18 23:43:06 +02:00
Dmitry Borisenko
c16b61c82b Merge pull request #7 from ytrikoz/platformio
Platformio
2020-06-17 23:46:38 +02:00
Yuri Trikoz
509ee7da0b example 2020-06-17 23:36:58 +03:00
Yuri Trikoz
3e5eed24c6 broken - need repair 2020-06-17 23:30:48 +03:00
Dmitry Borisenko
03f0d563ee Update README.md 2020-05-28 15:54:48 +02:00
Dmitry Borisenko
2bc3c44b64 Update eng 2020-05-28 10:32:40 +02:00
Dmitry Borisenko
44dec6aece Readme update 2020-05-28 10:30:36 +02:00
Dmitry Borisenko
61b0c4b6b8 Merge pull request #3 from DmitryBorisenko33/development
Development
2020-05-26 22:07:46 +02:00
Dmitry Borisenko
a154f3cd15 Update mqtt.ino 2020-05-26 22:01:57 +02:00
Dmitry Borisenko
cf182b2fe7 some changes 2020-05-26 18:19:04 +02:00
Dmitry Borisenko
996af08d6e bme pressure bug fixed 2020-05-26 18:18:51 +02:00
Dmitry Borisenko
130a7fef0b manage parts of firmware 2020-05-26 18:12:05 +02:00
Dmitry Borisenko
99a17e4a0c some 2020-05-26 18:08:55 +02:00
Dmitry Borisenko
0e074e68ca Update set.h 2020-05-26 18:06:19 +02:00
Dmitry Borisenko
df5525bc7a Merge pull request #2 from DmitryBorisenko33/development
some changes
2020-05-26 18:05:20 +02:00
Dmitry Borisenko
70cb7164ce Merge branch 'master' into development 2020-05-26 18:04:56 +02:00
Dmitry Borisenko
fc567c2f4a Update set.h 2020-05-26 17:54:18 +02:00
Dmitry Borisenko
ec76321206 some changes 2020-05-26 17:42:50 +02:00
Dmitry Borisenko
bf75e9f4b7 some changes 2020-05-20 02:16:23 +02:00
Dmitry Borisenko
3ea2509b6d some change 2020-05-19 21:13:54 +02:00
Dmitry Borisenko
07f439b900 Merge branch 'master' of https://github.com/DmitryBorisenko33/esp32_iot-manager_modules_firmware 2020-05-13 23:18:26 +02:00
Dmitry Borisenko
ae64d8f8ff esp spiffs uploader update 2020-05-13 23:18:18 +02:00
Dmitry Borisenko
58bbfec87f Create README.md 2020-05-12 22:33:49 +02:00
Dmitry Borisenko
4442b46603 Stable version 2020-05-04 15:57:54 +02:00
Dmitry Borisenko
a31c303c23 Global change 2020-05-02 12:20:30 +02:00
Dmitry Borisenko
ac5b7e5775 servo support added 2020-04-25 16:39:36 +02:00
Dmitry Borisenko
696c51b113 fuking bugs fixed! 2020-04-22 20:35:50 +02:00
Dmitry Borisenko
990bd6fb47 add udp support for esp32
Device can see each other esp32 and esp8266 and send date
2020-04-21 01:20:56 +02:00
Dmitry Borisenko
285a898ba9 some changes 2020-04-07 18:06:12 +02:00
Dmitry Borisenko
ba30af5182 add udp support and some new functions 2020-04-05 01:52:02 +02:00
Dmitry Borisenko
5250049e08 some changes 2020-04-02 22:56:01 +02:00
Dmitry Borisenko
c7ba7fecbc reduse ram consuption!!! 2020-03-30 01:45:42 +02:00
Dmitry Borisenko
abfc847793 New method of sending date - direct from SPIFFS to MQTT!!!! 2020-03-28 00:29:50 +01:00
Dmitry Borisenko
7d1c0268f5 Support logging of any sensor and charts 2020-03-27 15:48:17 +01:00
Dmitry Borisenko
b6145695cc logging date 2020-03-24 19:03:38 +01:00
Dmitry Borisenko
0cf60ab214 add logging date support 2020-03-24 19:01:11 +01:00
Dmitry Borisenko
a038960a4c going up to last core version 2020-03-23 23:50:20 +01:00
Dmitry Borisenko
cb2361c248 pic 2020-03-22 23:24:53 +01:00
Dmitry Borisenko
b799a48c8a fix many bugs 2020-03-22 22:41:52 +01:00
Dmitry Borisenko
9a775cd9d4 fix mqtt bug 2020-03-22 01:50:31 +01:00
Dmitry Borisenko
96e207676f add prefix 2020-03-21 18:14:38 +01:00
Dmitry Borisenko
ef92865886 some fix 2020-03-20 21:00:11 +01:00
Dmitry Borisenko
857177b5b7 some fix 2020-03-18 09:57:46 +01:00
Dmitry Borisenko
5fcb68ac65 some change 2020-03-17 17:54:57 +01:00
Dmitry Borisenko
8138893210 stepper motor support 2020-03-17 00:54:27 +01:00
Dmitry Borisenko
e1ef489706 add web socket and stepper control 2020-03-16 00:00:59 +01:00
Dmitry Borisenko
e2f8aaf505 bug with small file size 2020-03-04 22:10:59 +03:00
Dmitry Borisenko
60e2ada31a some fix 2020-03-04 15:22:15 +03:00
Dmitry Borisenko
0064e557f1 air firmware upgrade 2020-03-04 01:56:24 +03:00
Dmitry Borisenko
f8a50e09b7 add air firmware upgrade support 2020-03-04 00:27:35 +03:00
Dmitry Borisenko
a6117db46e some fix 2020-03-01 20:41:16 +03:00
Dmitry Borisenko
ec187af09d some fix 2020-02-22 03:34:44 +03:00
Dmitry Borisenko
7bc5be8db5 dht fixed, presets support 2020-02-19 03:14:21 +03:00
Dmitry Borisenko
a29a8b246c presets support 2020-02-18 16:22:17 +03:00
Dmitry Borisenko
8d16ae9188 some fix 2020-02-16 19:36:58 +03:00
Dmitry Borisenko
70d0378034 dht comfort add 2020-02-15 20:21:00 +03:00
Dmitry Borisenko
a2c146a0e9 DHT new library and uptime support 2020-02-15 20:17:25 +03:00
Dmitry Borisenko
92c8b79e2a time zone input add 2020-02-13 21:26:36 +03:00
Dmitry Borisenko
96db5965f6 time zone input add 2020-02-13 21:22:54 +03:00
Dmitry Borisenko
05ff2225c9 some fix 2020-02-13 21:18:51 +03:00
Dmitry Borisenko
f91960e325 add time timer 2020-02-13 20:20:34 +03:00
314 changed files with 20886 additions and 4598 deletions

2
.gitattributes vendored
View File

@@ -1,2 +0,0 @@
# Auto detect text files and perform LF normalization
* text=auto

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
lib/libraies-master

7
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

538
Cmd.ino
View File

@@ -1,538 +0,0 @@
void CMD_init() {
sCmd.addCommand("button", button);
sCmd.addCommand("buttonSet", buttonSet);
sCmd.addCommand("pinSet", pinSet);
sCmd.addCommand("pwm", pwm);
sCmd.addCommand("pwmSet", pwmSet);
sCmd.addCommand("switch", switch_);
sCmd.addCommand("analog", analog);
sCmd.addCommand("level", level);
sCmd.addCommand("dallas", dallas);
sCmd.addCommand("dhtT", dhtT);
sCmd.addCommand("dhtH", dhtH);
sCmd.addCommand("logging", logging);
sCmd.addCommand("inputDigit", inputDigit);
sCmd.addCommand("digitSet", digitSet);
sCmd.addCommand("text", text);
sCmd.addCommand("textSet", textSet);
sCmd.addCommand("timerStart", timerStart);
sCmd.addCommand("timerStop", timerStop);
sCmd.addCommand("mqtt", mqttOrderSend);
sCmd.addCommand("http", httpOrderSend);
sCmd.addCommand("push", pushControl);
// sCmd.addCommand("time", time);
// sCmd.addCommand("timeSet", timeSet);
//======новые виджеты ver2.0=======//
sCmd.addCommand("inputText", inputText);
sCmd.addCommand("inputTextSet", inputTextSet);
sCmd.addCommand("inputTime", inputTime);
sCmd.addCommand("inputTimeSet", inputTimeSet);
sCmd.addCommand("inputDate", inputDate);
sCmd.addCommand("inputDateSet", inputDateSet);
sCmd.addCommand("inputDate", inputDate);
//sCmd.addCommand("inputDropdown", inputDropdown);
//=================================//
}
//==========================================================================================================
//==========================================Модуль кнопок===================================================
void button() {
String button_number = sCmd.next();
String button_param = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWrite(optionJson, "button_param" + button_number, button_param);
jsonWrite(configJson, "buttonSet" + button_number, start_state);
if (isDigitStr (button_param)) {
pinMode(button_param.toInt(), OUTPUT);
digitalWrite(button_param.toInt(), start_state.toInt());
}
if (button_param == "scenario") {
jsonWrite(configSetup, "scenario", start_state);
Scenario_init();
saveConfig();
}
if (button_param.indexOf("line") != -1) {
String str = button_param;
while (str.length() != 0) {
if (str == "") return;
String tmp = selectToMarker (str, ","); //line1,
String number = deleteBeforeDelimiter(tmp, "e"); //1,
number.replace(",", "");
Serial.println(number);
int number_int = number.toInt();
scenario_line_status[number_int] = start_state.toInt();
str = deleteBeforeDelimiter(str, ",");
}
}
createViget (viget_name, page_name, page_number, "vigets/viget.toggle.json", "buttonSet" + button_number);
}
void buttonSet() {
String button_number = sCmd.next();
String button_state = sCmd.next();
String button_param = jsonRead(optionJson, "button_param" + button_number);
if (button_param != "na" || button_param != "scenario" || button_param.indexOf("line") != -1) {
digitalWrite(button_param.toInt(), button_state.toInt());
}
if (button_param == "scenario") {
jsonWrite(configSetup, "scenario", button_state);
Scenario_init();
saveConfig();
}
if (button_param.indexOf("line") != -1) {
String str = button_param;
while (str.length() != 0) {
if (str == "") return;
String tmp = selectToMarker (str, ","); //line1,
String number = deleteBeforeDelimiter(tmp, "e"); //1,
number.replace(",", "");
Serial.println(number);
int number_int = number.toInt();
scenario_line_status[number_int] = button_state.toInt();
str = deleteBeforeDelimiter(str, ",");
}
}
eventGen ("buttonSet", button_number);
jsonWrite(configJson, "buttonSet" + button_number, button_state);
sendSTATUS("buttonSet" + button_number, button_state);
}
void pinSet() {
String pin_number = sCmd.next();
String pin_state = sCmd.next();
pinMode(pin_number.toInt(), OUTPUT);
digitalWrite(pin_number.toInt(), pin_state.toInt());
}
//==================================================================================================================
//==========================================Модуль управления ШИМ===================================================
void pwm() {
static boolean flag = true;
String pwm_number = sCmd.next();
String pwm_pin = sCmd.next();
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
String start_state = sCmd.next();
String page_number = sCmd.next();
uint8_t pwm_pin_int = pwm_pin.toInt();
jsonWrite(optionJson, "pwm_pin" + pwm_number, pwm_pin);
pinMode(pwm_pin_int, INPUT);
analogWrite(pwm_pin_int, start_state.toInt());
jsonWrite(configJson, "pwmSet" + pwm_number, start_state);
createViget (viget_name, page_name, page_number, "vigets/viget.range.json", "pwmSet" + pwm_number);
}
void pwmSet() {
String pwm_number = sCmd.next();
String pwm_state = sCmd.next();
int pwm_state_int = pwm_state.toInt();
int pin = jsonReadtoInt(optionJson, "pwm_pin" + pwm_number);
analogWrite(pin, pwm_state_int);
eventGen ("pwmSet", pwm_number);
jsonWrite(configJson, "pwmSet" + pwm_number, pwm_state);
sendSTATUS("pwmSet" + pwm_number, pwm_state);
}
//==================================================================================================================
//==========================================Модуль физической кнопки================================================
void switch_ () {
String switch_number = sCmd.next();
String switch_pin = sCmd.next();
String switch_delay = sCmd.next();
buttons[switch_number.toInt()].attach(switch_pin.toInt());
buttons[switch_number.toInt()].interval(switch_delay.toInt());
but[switch_number.toInt()] = true;
}
void handleButton() {
static uint8_t switch_number = 1;
if (but[switch_number]) {
buttons[switch_number].update();
if (buttons[switch_number].fell()) {
eventGen ("switchSet", String(switch_number));
jsonWrite(configJson, "switchSet" + String(switch_number), "1");
}
if (buttons[switch_number].rose()) {
eventGen ("switchSet", String(switch_number));
jsonWrite(configJson, "switchSet" + String(switch_number), "0");
}
}
switch_number++;
if (switch_number == NUM_BUTTONS) switch_number = 0;
}
//=====================================================================================================================================
//=========================================Добавление окна ввода переменной============================================================
void inputDigit() {
String value_name = sCmd.next();
String number = value_name.substring(5);
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWrite(configJson, "digitSet" + number, start_state);
createViget (viget_name, page_name, page_number, "vigets/viget.inputNum.json", "digitSet" + number);
}
void digitSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWrite(configJson, "digitSet" + number, value);
sendSTATUS("digitSet" + number, value);
}
//=====================================================================================================================================
//=========================================Добавление текстового виджета============================================================
void text() {
String number = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
createViget (viget_name, page_name, page_number, "vigets/viget.anydata.json", "textSet" + number);
}
void textSet() {
String number = sCmd.next();
String text = sCmd.next();
text.replace("_", " ");
if (text.indexOf("-time") >= 0) {
text.replace("-time", "");
String time = GetTime();
time.replace(":", ".");
text = GetDataDigital() + " " + time + " " + text;
}
jsonWrite(configJson, "textSet" + number, text);
sendSTATUS("textSet" + number, text);
}
//====================================================================================================================================================
void inputText() {
String number = sCmd.next();
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWrite(configJson, "inputTextSet" + number, start_state);
createViget (viget_name, page_name, page_number, "vigets/viget.inputText.json", "inputTextSet" + number);
}
void inputTextSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWrite(configJson, "inputTextSet" + number, value);
sendSTATUS("inputTextSet" + number, value);
}
void inputTime() {
String number = sCmd.next();
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWrite(configJson, "inputTimeSet" + number, start_state);
createViget (viget_name, page_name, page_number, "vigets/viget.inputTime.json", "inputTimeSet" + number);
}
void inputTimeSet() {
String number = sCmd.next();
String value = sCmd.next();
value.replace(":", ".");
jsonWrite(configJson, "inputTimeSet" + number, value);
value.replace(".", ":");
sendSTATUS("inputTimeSet" + number, value);
}
void inputDate() {
String number = sCmd.next();
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
jsonWrite(configJson, "inputDateSet" + number, start_state);
createViget (viget_name, page_name, page_number, "vigets/viget.inputDate.json", "inputDateSet" + number);
}
void inputDateSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWrite(configJson, "inputDateSet" + number, value);
sendSTATUS("inputDateSet" + number, value);
}
//=================================================Глобальные команды удаленного управления===========================================================
void mqttOrderSend() {
String id = sCmd.next();
String order = sCmd.next();
String all_line = prefix + "/" + id + "/order";
//Serial.print(all_line);
//Serial.print("->");
//Serial.println(order);
int send_status = client.publish (all_line.c_str(), order.c_str(), false);
}
void httpOrderSend() {
String ip = sCmd.next();
String order = sCmd.next();
order.replace("_", "%20");
String url = "http://" + ip + "/cmd?command=" + order;
getURL(url);
}
//==============================================================================================================================
//============================выполнение команд (в лупе) по очереди из строки order=============================================
void handleCMD_loop() {
if (order_loop != "") {
String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1,
sCmd.readStr(tmp); //выполняем первую команду
Serial.println("[ORDER] => " + order_loop);
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду
}
}
//=============================выполнение команд (через период) по очереди из строки order=======================================
/*void handleCMD_ticker() {
ts.add(CMD, CMD_update_int, [&](void*) {
if (!busy) {
if (order_ticker != "") {
String tmp = selectToMarker(order_ticker, ","); //выделяем из страки order первую команду pus title body
if (tmp != "no_command") sCmd.readStr(tmp); //выполняем первую команду
Serial.println("order_ticker => " + order_ticker);
order_ticker = deleteBeforeDelimiter(order_ticker, ","); //осекаем выполненную команду
}
}
}, nullptr, true);
}*/
//=======================================================================================================================================
//=======================================================================================================================================
void txtExecution(String file) {
String command_all = readFile(file, 2048) + "\r\n"; //2048
command_all.replace("\r\n", "\n");
command_all.replace("\r", "\n");
while (command_all.length() != 0) {
String tmp = selectToMarker (command_all, "\n");
//if (tmp.indexOf("//") < 0)
sCmd.readStr(tmp);
command_all = deleteBeforeDelimiter(command_all, "\n");
}
}
void stringExecution(String str) {
String command_all = str + "\r\n"; //"\r\n"
command_all.replace("\r\n", "\n");
command_all.replace("\r", "\n");
while (command_all.length() != 0) {
String tmp = selectToMarker (command_all, "\n");
//if (tmp.indexOf("//") < 0)
sCmd.readStr(tmp);
command_all = deleteBeforeDelimiter(command_all, "\n");
}
}
//======================================================================================================================
//===============================================Создание виджетов=======================================================
void createViget (String viget_name, String page_name, String page_number, String file, String topic) {
String viget;
viget = readFile(file, 1024);
if (viget == "Failed") return;
if (viget == "Large") return;
viget_name.replace("#", " ");
page_name.replace("#", " ");
jsonWrite(viget, "page", page_name);
jsonWrite(viget, "order", page_number);
jsonWrite(viget, "descr", viget_name);
jsonWrite(viget, "topic", prex + "/" + topic);
all_vigets += viget + "\r\n";
viget = "";
}
/*
void createViget (String viget_name, String page_name, String page_number, String file, String topic, String key, String value) {
String viget;
viget = readFile(file, 1024);
if (viget == "Failed") return;
if (viget == "Large") return;
viget_name.replace("#", " ");
page_name.replace("#", " ");
value.replace("#", " ");
viget = vidgetConfigWrite(viget, key, value);
jsonWrite(viget, "page", page_name);
jsonWrite(viget, "pageId", page_number);
jsonWrite(viget, "descr", viget_name);
jsonWrite(viget, "topic", prex + "/" + topic);
all_vigets += viget + "\r\n";
viget = "";
}
void createViget (String viget_name, String page_name, String page_number, String file, String topic, String key, String value, String key2, String value2) {
String viget;
viget = readFile(file, 1024);
if (viget == "Failed") return;
if (viget == "Large") return;
viget_name.replace("#", " ");
page_name.replace("#", " ");
value.replace("#", " ");
viget = vidgetConfigWrite(viget, key, value);
viget = vidgetConfigWrite(viget, key2, value2);
jsonWrite(viget, "page", page_name);
jsonWrite(viget, "pageId", page_number);
jsonWrite(viget, "descr", viget_name);
jsonWrite(viget, "topic", prex + "/" + topic);
all_vigets += viget + "\r\n";
viget = "";
}
*/
String vidgetConfigWrite(String viget, String key, String value) {
if (viget == "") return "";
if (viget == "{}") return "";
int psn1 = viget.indexOf("{");
if (psn1 != -1) {
psn1 = viget.indexOf("{", psn1 + 1);
if (psn1 != -1) {
int psn2 = viget.indexOf("}", psn1);
String WigetConfig = viget.substring(psn1, psn2) + "}";
jsonWrite(WigetConfig, key, value);
String part1 = viget.substring(0, psn1);
viget = part1 + WigetConfig + "}";
return viget;
}
}
}
//============разное
/*
void delAlert() {
String alert_id = sCmd.next();
delViget(alert_id);
sendAllWigets();
}
void delViget(String text_in_viget) {
String viget = all_vigets;
while (viget.length() != 0) {
String tmp = selectToMarkerPlus (viget, "\r\n", 2);
if (tmp.indexOf(text_in_viget) > 0) {
all_vigets.replace(tmp, "");
//Serial.println(all_vigets);
viget = deleteBeforeDelimiter(viget, "\r\n");
} else {
viget = deleteBeforeDelimiter(viget, "\r\n");
}
}
}
*/

Binary file not shown.

Binary file not shown.

View File

@@ -1,52 +0,0 @@
void All_init() {
server.on("/all_modules_init", HTTP_GET, [](AsyncWebServerRequest * request) {
Device_init();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("status")) {
jsonWrite(configSetup, "scenario", request->getParam("status")->value());
}
saveConfig();
Scenario_init();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/cleanlog", HTTP_GET, [](AsyncWebServerRequest * request) {
SPIFFS.remove("/log.analog.txt");
SPIFFS.remove("/log.dallas.txt");
SPIFFS.remove("/log.level.txt");
SPIFFS.remove("/log.ph.txt");
SPIFFS.remove("/log.txt");
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
Device_init();
Scenario_init();
Timer_countdown_init();
}
void Device_init() {
//SENSORS-SECTION
ts.remove(ANALOG_);
ts.remove(LEVEL);
ts.remove(DALLAS);
ts.remove(DHTT);
ts.remove(DHTH);
//================
all_vigets = "";
txtExecution("firmware.config.txt");
//outcoming_date();
}
//-------------------------------сценарии-----------------------------------------------------
void Scenario_init() {
if (jsonRead(configSetup, "scenario") == "1") {
scenario = readFile("firmware.scenario.txt", 2048);
}
}

6
README.md Normal file
View File

@@ -0,0 +1,6 @@
# IoTManager
Это модульная система беспроводной автоматизации на базе ESP32/ESP8266 микроконтроллеров и приложения IoT Manager.
Телеграм канал обсуждения приложения и системы автоматизации https://t.me/IoTmanager
# [Инструкция](https://github.com/IoTManagerProject/IoTManager/wiki)
![](https://github.com/IoTManagerProject/IoTManager/blob/beta/doc/pictures/007%20iot%20manager.jpg)

View File

@@ -1,92 +0,0 @@
void handleScenario() {
if (jsonRead(configSetup, "scenario") == "1") {
if ((jsonRead(optionJson, "scenario_status") != "")) {
int i = 0;
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
str += "\n";
str.replace("\r\n", "\n");
str.replace("\r", "\n");
while (str.length() != 0) {
//-----------------------------------------------------------------------------------------------------------------------
String tmp = selectToMarker (str, "end"); //выделяем первый сценарий из файла вместе с командами
if (tmp == "") return;
i++;
if (scenario_line_status[i] == 1) {
//Serial.println(i);
String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
String param_name = selectFromMarkerToMarker(condition, " " , 0);
param_name = add_set(param_name); //из первой страки берем имя параметра button1 и вставляем в него Set и получаем buttonSet1
String order = jsonRead(optionJson, "scenario_status"); //читаем весь файл событий
String param = selectToMarker (order, ","); //читаем первое событие из файла событий
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=)
String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1)
if (value.indexOf("digit") != -1) {
value = add_set(value);
value = jsonRead(configJson, value);
}
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
if (sign == "=") {
if (jsonRead(configJson, param_name) == value) flag = true;
}
if (sign == "!=") {
if (jsonRead(configJson, param_name) != value) flag = true;
}
if (sign == "<") {
if (jsonRead(configJson, param_name).toInt() < value.toInt()) flag = true;
}
if (sign == ">") {
if (jsonRead(configJson, param_name).toInt() > value.toInt()) flag = true;
}
if (sign == ">=") {
if (jsonRead(configJson, param_name).toInt() >= value.toInt()) flag = true;
}
if (sign == "<=") {
if (jsonRead(configJson, param_name).toInt() <= value.toInt()) flag = true;
}
if (flag) {
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
stringExecution(tmp); //выполняем все команды
Serial.println("[SCENARIO] '" + condition + "'");
//Serial.println(" " + tmp);
}
}
}
str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий
//-----------------------------------------------------------------------------------------------------------------------
}
String tmp2 = jsonRead(optionJson, "scenario_status"); //читаем файл событий
tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие
jsonWrite(optionJson, "scenario_status", tmp2); //записываем обновленный файл событий
i = 0;
}
}
}
void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
if (jsonRead(configSetup, "scenario") == "1") {
String tmp = jsonRead(optionJson, "scenario_status") ; //генерирование события
//Serial.println(event_name);
jsonWrite(optionJson, "scenario_status", tmp + event_name + number + ",");
}
}
String add_set(String param_name) {
String num1 = param_name.substring(param_name.length() - 1);
String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1);
if (isDigitStr(num1) && isDigitStr(num2)) {
param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1;
} else {
if (isDigitStr(num1)) {
param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1;
}
}
return param_name;
}

View File

@@ -1,286 +0,0 @@
//===============================================================================================================================
//=========================================Модуль аналогового сенсора============================================================
void analog() {
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String analog_start = sCmd.next();
String analog_end = sCmd.next();
String analog_start_out = sCmd.next();
String analog_end_out = sCmd.next();
String page_number = sCmd.next();
jsonWrite(optionJson, "analog_start", analog_start);
jsonWrite(optionJson, "analog_end", analog_end);
jsonWrite(optionJson, "analog_start_out", analog_start_out);
jsonWrite(optionJson, "analog_end_out", analog_end_out);
choose_viget_and_create(viget_name, page_name, page_number, type, "analog");
ts.add(ANALOG_, analog_update_int, [&](void*) {
static int analog_old;
#ifdef ESP32
int analog_in = analogRead(pin.toInt());
#endif
#ifdef ESP8266
int analog_in = analogRead(A0);
#endif
jsonWrite(configJson, "analog_in", analog_in);
int analog = map(analog_in,
jsonReadtoInt(optionJson, "analog_start") ,
jsonReadtoInt(optionJson, "analog_end"),
jsonReadtoInt(optionJson, "analog_start_out"),
jsonReadtoInt(optionJson, "analog_end_out"));
jsonWrite(configJson, "analog", analog);
// if (analog_old != analog) {
eventGen ("analog", "");
sendSTATUS("analog", String(analog));
if (client.connected()) {
Serial.println("[i] sensor analog send date " + String(analog));
}
// }
analog_old = analog;
}, nullptr, true);
}
//===================================================================================================================================
//=========================================Модуль измерения уровня в баке============================================================
void level() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String empty_level = sCmd.next();
String full_level = sCmd.next();
String page_number = sCmd.next();
jsonWrite(optionJson, "empty_level", empty_level);
jsonWrite(optionJson, "full_level", full_level);
pinMode(14, OUTPUT);
pinMode(12, INPUT);
choose_viget_and_create(viget_name, page_name, page_number, type, "level");
ts.add(LEVEL, tank_level_shooting_interval, [&](void*) {
long duration_;
int distance_cm;
int level;
static int level_old; //переменная static сохраняет свое значение между вызовами функции
static int counter;
digitalWrite(14, LOW);
delayMicroseconds(2);
digitalWrite(14, HIGH);
delayMicroseconds(10);
digitalWrite(14, LOW);
duration_ = pulseIn(12, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m
distance_cm = duration_ / 29 / 2;
distance_cm = medianFilter.filtered(distance_cm);//отсечение промахов медианным фильтром
counter++;
if (counter > tank_level_times_to_send) {
counter = 0;
jsonWrite(configJson, "level_in", distance_cm);
level = map(distance_cm,
jsonReadtoInt(optionJson, "empty_level"),
jsonReadtoInt(optionJson, "full_level"), 0, 100);
//jsonWrite(configJson, "level", level);
//if (level_old != level) {
eventGen ("level", "");
sendSTATUS("level", String(level));
if (client.connected()) {
Serial.println("[i] sensor tank level send date " + String(level));
}
//}
level_old = level;
}
}, nullptr, true);
}
//==========================================================================================================================================
//=========================================Модуль температурного сенсора ds18b20============================================================
void dallas() {
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
oneWire = new OneWire((uint8_t) pin.toInt());
sensors.setOneWire(oneWire);
sensors.begin();
sensors.setResolution(12);
choose_viget_and_create(viget_name, page_name, page_number, type, "dallas");
ts.add(DALLAS, temp_update_int, [&](void*) {
float temp = 0;
static float temp_old;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
jsonWrite(configJson, "dallas", String(temp));
//if (temp_old != temp) {
eventGen ("dallas", "");
sendSTATUS("dallas", String(temp));
if (client.connected()) {
Serial.println("[i] sensor dallas send date " + String(temp));
}
//}
temp_old = temp;
}, nullptr, true);
}
//======================================================================================================================
//=========================================Модуль сенсоров DHT==========================================================
void dhtT() {
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
dht.setup(pin.toInt());
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtT");
ts.add(DHTT, dhtT_update_int, [&](void*) {
int value = 0;
static int value_old;
value = dht.getTemperature();
jsonWrite(configJson, "dhtT", String(value));
//if (value_old != value) {
eventGen ("dhtT", "");
sendSTATUS("dhtT", String(value));
if (client.connected()) {
Serial.println("[i] sensor dhtT send date " + String(value));
}
//}
value_old = value;
}, nullptr, true);
}
void dhtH() {
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
dht.setup(pin.toInt());
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtH");
ts.add(DHTH, dhtH_update_int, [&](void*) {
int value = 0;
static int value_old;
value = dht.getHumidity();
jsonWrite(configJson, "dhtH", String(value));
//if (value_old != value) {
eventGen ("dhtH", "");
sendSTATUS("dhtH", String(value));
if (client.connected()) {
Serial.println("[i] sensor dhtH send date " + String(value));
}
//}
value_old = value;
}, nullptr, true);
}
void choose_viget_and_create(String viget_name, String page_name, String page_number, String type, String topik) {
if (type == "any-data") createViget (viget_name, page_name, page_number, "vigets/viget.anydata.json", topik);
if (type == "progress-line") createViget (viget_name, page_name, page_number, "vigets/viget.progressL.json", topik);
if (type == "progress-round") createViget (viget_name, page_name, page_number, "vigets/viget.progressR.json", topik);
}
//======================================================================================================================
//===============================================Логирование============================================================
void logging() {
static boolean flag = true;
String sensor_name = sCmd.next();
String period_min = sCmd.next();
String maxCount = sCmd.next();
String viget_name = sCmd.next();
viget_name.replace("#", " ");
String page_name = sCmd.next();
String page_number = sCmd.next();
if (sensor_name == "analog") jsonWrite(optionJson, "analog_logging_count", maxCount);
if (sensor_name == "level") jsonWrite(optionJson, "level_logging_count", maxCount);
if (sensor_name == "dallas") jsonWrite(optionJson, "dallas_logging_count", maxCount);
if (sensor_name == "ph") jsonWrite(optionJson, "ph_logging_count", maxCount);
/*
if (sensor_name == "analog") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "loganalog", "maxCount", maxCount);
if (sensor_name == "level") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "loglevel", "maxCount", maxCount);
if (sensor_name == "dallas") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "logdallas", "maxCount", maxCount);
if (sensor_name == "ph") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "logph", "maxCount", maxCount);
*/
if (sensor_name == "analog") {
flagLoggingAnalog = true;
ts.remove(ANALOG_LOG);
ts.add(ANALOG_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
deleteOldDate("log.analog.txt", jsonReadtoInt(optionJson, "analog_logging_count"), jsonRead(configJson, "analog"), false);
}, nullptr, true);
}
if (sensor_name == "level") {
flagLoggingLevel = true;
ts.remove(LEVEL_LOG);
ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level"), false);
}, nullptr, true);
}
if (sensor_name == "dallas") {
flagLoggingDallas = true;
ts.remove(DALLAS_LOG);
ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas"), false);
}, nullptr, true);
}
if (sensor_name == "ph") {
flagLoggingPh = true;
ts.remove(PH_LOG);
ts.add(PH_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
deleteOldDate("log.ph.txt", jsonReadtoInt(optionJson, "ph_logging_count"), jsonRead(configJson, "ph"), false);
}, nullptr, true);
}
}
void deleteOldDate(String file, int seted_number_of_lines, String date_to_add, boolean date_time) {
String current_time;
if (date_time) {
current_time = GetDataDigital() + " " + GetTimeWOsec();
current_time.replace(".", "");
current_time.replace(":", "");
} else {
current_time = "";
}
String log_date = readFile(file, 5000);
getMemoryLoad("[i] after logging procedure");
//предел количества строк 255
log_date.replace("\r\n", "\n");
log_date.replace("\r", "\n");
int current_number_of_lines = count(log_date, "\n");
Serial.println("[i] in log file " + file + " " + current_number_of_lines + " lines");
if (current_number_of_lines > seted_number_of_lines + 1) {
SPIFFS.remove("/" + file);
current_number_of_lines = 0;
}
if (current_number_of_lines == 0) {
SPIFFS.remove("/" + file);
current_number_of_lines = 0;
}
if (current_number_of_lines > seted_number_of_lines) {
log_date = deleteBeforeDelimiter(log_date, "\n");
log_date += current_time + " " + date_to_add + "\n";
writeFile(file, log_date);
} else {
if (date_time) {
addFile(file, current_time + " " + date_to_add);
} else {
addFile(file, date_to_add);
}
}
}

View File

@@ -1,20 +0,0 @@
#ifdef ESP32
void Time_Init() {
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("[E] Failed to obtain time");
return;
}
Serial.println(&timeinfo, "[V] %A, %B %d %Y %H:%M:%S");
}
#endif

View File

@@ -1,112 +0,0 @@
#ifdef ESP8266
#include <time.h>
void Time_Init() {
server.on("/Time", HTTP_GET, [](AsyncWebServerRequest * request) {
//handle_Time();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) {
//handle_time_zone();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
timeSynch(jsonReadtoInt(configSetup, "timezone"));
}
void timeSynch(int zone) {
if (WiFi.status() == WL_CONNECTED) {
// Настройка соединения с NTP сервером
configTime(zone * 3600, 0, "pool.ntp.org", "ru.pool.ntp.org");
// int i = 0;
// Serial.println("\nWaiting for time");
// while (!time(nullptr) && i < 10) {
// Serial.print(".");
// i++;
// delay(1000);
// }
Serial.println("");
Serial.println("ITime Ready!");
delay(1000);
Serial.println(GetTime());
Serial.println(GetDate());
}
}
/*// Установка параметров времянной зоны по запросу вида http://192.168.0.101/timeZone?timeZone=3
void handle_time_zone() {
if (request->hasArg("timeZone")) {
jsonWrite(configSetup, "timeZone", request->getParam("timeZone")->value());
}
saveConfig();
//request->send(200, "text/text", "OK");
}
void handle_Time() {
timeSynch(jsonReadtoInt(configSetup, "timezone"));
//request->send(200, "text/text", "OK");
}
*/
#endif
// Получение текущего времени
String GetTime() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
String Time = ""; // Строка для результатов времени
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
int i = Time.indexOf(":"); //Ишем позицию первого символа :
Time = Time.substring(i - 2, i + 6); // Выделяем из строки 2 символа перед символом : и 6 символов после
return Time; // Возврашаем полученное время
}
String GetTimeWOsec() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
String Time = ""; // Строка для результатов времени
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
int i = Time.indexOf(":"); //Ишем позицию первого символа :
Time = Time.substring(i - 2, i + 3); // Выделяем из строки 2 символа перед символом : и 6 символов после
return Time; // Возврашаем полученное время
}
// Получение даты
String GetDate() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
String Data = ""; // Строка для результатов времени
Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
Data.replace("\n", "");
uint8_t i = Data.lastIndexOf(" "); //Ишем позицию последнего символа пробел
String Time = Data.substring(i - 8, i + 1); // Выделяем время и пробел
Data.replace(Time, ""); // Удаляем из строки 8 символов времени и пробел
return Data; // Возврашаем полученную дату
}
String GetDataDigital() {
String date = GetDate();
date = deleteBeforeDelimiter(date, " ");
date.replace("Jan", "01");
date.replace("Feb", "02");
date.replace("Mar", "03");
date.replace("Apr", "04");
date.replace("May", "05");
date.replace("Jun", "06");
date.replace("Jul", "07");
date.replace("Aug", "08");
date.replace("Sep", "09");
date.replace("Oct", "10");
date.replace("Nov", "11");
date.replace("Dec", "12");
String month = date.substring(0, 2);
String day = date.substring(3, 5);
String year = date.substring(8, 10);
String out = day;
out += ".";
out += month;
out += ".";
out += year;
return out;
}

View File

@@ -1,185 +0,0 @@
//================================================================================================================
//=========================================Таймера=================================================================
void Timer_countdown_init() {
ts.add(TIMER_COUNTDOWN, 1000, [&](void*) {
String old_line = jsonRead(optionJson, "timers");
if (old_line != "") {
Serial.println(old_line);
int i = 0;
do {
String timer = selectFromMarkerToMarker(old_line, "," , i);
// Serial.print("timer no " + String (i) + ": ");
// Serial.println(timer);
if (timer == "not found" || timer == "") return;
int number = selectToMarker (timer, ":").toInt();
int time = readTimer(number);
if (time == 0) {
delTimer (String (number));
jsonWrite(configJson, "timerSet" + String(number), "0");
eventGen ("timerSet", String(number));
} else {
time--;
addTimer(String (number), String (time));
}
i++;
} while (i <= 9);
}
}, nullptr, true);
}
void timerStart() {
String number = sCmd.next();
String period_of_time = sCmd.next();
String type = sCmd.next();
if (period_of_time.indexOf("digit") != -1) {
period_of_time = add_set(period_of_time);
period_of_time = jsonRead(configJson, period_of_time);
}
if (type == "sec") period_of_time = period_of_time;
if (type == "min") period_of_time = String(period_of_time.toInt() * 60);
if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
addTimer(number, period_of_time);
jsonWrite(configJson, "timerSet" + number, "1");
}
void addTimer(String number, String time) {
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
String new_timer = number + ":" + time;
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
tmp.replace(timer + ",", "");
tmp += new_timer + ",";
} else { //если его нет
tmp += new_timer + ",";
}
jsonWrite(optionJson, "timers", tmp);
//Serial.println("ura");
}
void timerStop() {
String number = sCmd.next();
delTimer(number);
}
void delTimer (String number) {
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
tmp.replace(timer, ""); //удаляем таймер
jsonWrite(optionJson, "timers", tmp);
}
}
int readTimer(int number) {
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
String timer;
if (psn1 != -1) { //если он есть
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
timer = deleteBeforeDelimiter(timer, ":");
}
return timer.toInt();
}
/*void timer() {
String seted_time = sCmd.next();
String order = sCmd.next();
order.replace("_", " ");
if (seted_time == current_time) {
order_loop += order + ",";
}
}*/
//------------------------------таймеры------------------------------------------------------
void time() {
String time_number = sCmd.next();
String time = sCmd.next();
String time_to_add = time_number + "-" + time;
String replace_line = jsonRead(optionJson, "times") ;
int psn1 = replace_line.indexOf(time_number + "-") ; //ищем позицию времени которое надо заменить
if (psn1 != -1) { //если оно есть
int psn2 = replace_line.indexOf(",", psn1); //от этой позиции находим позицию запятой
String timer = replace_line.substring(psn1, psn2); //выделяем таймер который надо заменить
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
replace_line.replace(timer + ",", "");
replace_line += time_to_add + ",";
} else { //если его нет
replace_line += time_to_add + ",";
}
jsonWrite(optionJson, "times", replace_line);
jsonWrite(configJson, "timeSet" + time_number, "1");
ts.add(TIMERS, 1000, [&](void*) {
current_time = GetTime();
Serial.println(current_time);
String seted_times = jsonRead(optionJson, "times");
while (seted_times.length() != 0) {
String tmp = selectToMarker (seted_times, ",");
String time_number = selectToMarker(tmp, "-");
String seted_time = deleteBeforeDelimiter(tmp, "-");
Serial.println(seted_time);
if (current_time == seted_time) {
jsonWrite(configJson, "timeSet" + time_number, "0");
eventGen ("timeSet", time_number);
}
seted_times = deleteBeforeDelimiter(seted_times, ",");
}
}, nullptr, true);
}

View File

@@ -1,221 +0,0 @@
void Web_server_init() {
//========================================OTA============================================
#ifdef OTA_enable
//Send OTA events to the browser
ArduinoOTA.onStart([]() {
events.send("Update Start", "ota");
});
ArduinoOTA.onEnd([]() {
events.send("Update End", "ota");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
char p[32];
sprintf(p, "Progress: %u%%\n", (progress / (total / 100)));
events.send(p, "ota");
});
ArduinoOTA.onError([](ota_error_t error) {
if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
else if (error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota");
else if (error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota");
else if (error == OTA_END_ERROR) events.send("End Failed", "ota");
});
ArduinoOTA.setHostname(hostName);
ArduinoOTA.begin();
#endif
//========================================MDNS============================================
#ifdef MDNS_enable
MDNS.addService("http", "tcp", 80);
#endif
//SPIFFS.begin();
//========================================WS============================================
#ifdef WS_enable
ws.onEvent(onWsEvent);
server.addHandler(&ws);
events.onConnect([](AsyncEventSourceClient * client) {
client->send("hello!", NULL, millis(), 1000);
});
server.addHandler(&events);
#endif
//======================================================================================
#ifdef ESP32
server.addHandler(new SPIFFSEditor(SPIFFS, jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str()));
#elif defined(ESP8266)
server.addHandler(new SPIFFSEditor(jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str()));
#endif
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "text/plain", String(ESP.getFreeHeap()));
});
server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000");
server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000");
server.serveStatic("/", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000");
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm")
.setAuthentication(jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str());
server.onNotFound([](AsyncWebServerRequest * request) {
Serial.printf("NOT_FOUND: ");
if (request->method() == HTTP_GET)
Serial.printf("GET");
else if (request->method() == HTTP_POST)
Serial.printf("POST");
else if (request->method() == HTTP_DELETE)
Serial.printf("DELETE");
else if (request->method() == HTTP_PUT)
Serial.printf("PUT");
else if (request->method() == HTTP_PATCH)
Serial.printf("PATCH");
else if (request->method() == HTTP_HEAD)
Serial.printf("HEAD");
else if (request->method() == HTTP_OPTIONS)
Serial.printf("OPTIONS");
else
Serial.printf("UNKNOWN");
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
if (request->contentLength()) {
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
}
int headers = request->headers();
int i;
for (i = 0; i < headers; i++) {
AsyncWebHeader* h = request->getHeader(i);
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
}
int params = request->params();
for (i = 0; i < params; i++) {
AsyncWebParameter* p = request->getParam(i);
if (p->isFile()) {
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if (p->isPost()) {
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
} else {
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
request->send(404);
});
server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) {
if (!index)
Serial.printf("UploadStart: %s\n", filename.c_str());
Serial.printf("%s", (const char*)data);
if (final)
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
});
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
if (!index)
Serial.printf("BodyStart: %u\n", total);
Serial.printf("%s", (const char*)data);
if (index + len == total)
Serial.printf("BodyEnd: %u\n", total);
});
server.begin();
//=============================Устанавливаем реакции на запросы к серверу============================
// --------------------Выдаем данные configJson //config.live.json - динамические данные
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configJson);
});
// --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", optionJson);
});
// -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configSetup);
});
}
//========================================WS=========================================================================================
#ifdef WS_enable
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
if (type == WS_EVT_CONNECT) {
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
client->printf(configJson.c_str(), client->id());
client->ping();
} else if (type == WS_EVT_DISCONNECT) {
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
} else if (type == WS_EVT_ERROR) {
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
} else if (type == WS_EVT_PONG) {
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char*)data : "");
} else if (type == WS_EVT_DATA) {
AwsFrameInfo * info = (AwsFrameInfo*)arg;
String msg = "";
if (info->final && info->index == 0 && info->len == len) {
//the whole message is in a single frame and we got all of it's data
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT) ? "text" : "binary", info->len);
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < info->len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < info->len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n", msg.c_str());
if (info->opcode == WS_TEXT)
client->text("{}");
else
client->binary("{}");
} else {
//message is comprised of multiple frames or the frame is split into multiple packets
if (info->index == 0) {
if (info->num == 0)
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
}
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len);
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n", msg.c_str());
if ((info->index + len) == info->len) {
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
if (info->final) {
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
if (info->message_opcode == WS_TEXT)
client->text("I got your text message");
else
client->binary("I got your binary message");
}
}
}
}
}
#endif

161
WiFi.ino
View File

@@ -1,161 +0,0 @@
void WIFI_init() {
// --------------------Получаем ssid password со страницы
server.on("/ssid", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("ssid")) {
jsonWrite(configSetup, "ssid", request->getParam("ssid")->value());
}
if (request->hasArg("password")) {
jsonWrite(configSetup, "password", request->getParam("password")->value());
}
saveConfig(); // Функция сохранения данных во Flash
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// --------------------Получаем ssidAP passwordAP со страницы
server.on("/ssidap", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("ssidAP")) {
jsonWrite(configSetup, "ssidAP", request->getParam("ssidAP")->value());
}
if (request->hasArg("passwordAP")) {
jsonWrite(configSetup, "passwordAP", request->getParam("passwordAP")->value());
}
saveConfig(); // Функция сохранения данных во Flash
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// --------------------Получаем логин и пароль для web со страницы
server.on("/web", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("web_login")) {
jsonWrite(configSetup, "web_login", request->getParam("web_login")->value());
}
if (request->hasArg("web_pass")) {
jsonWrite(configSetup, "web_pass", request->getParam("web_pass")->value());
}
saveConfig(); // Функция сохранения данных во Flash
//Web_server_init();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/restart", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") ESP.restart();
}
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// Попытка подключения к точке доступа
WiFi.mode(WIFI_STA);
byte tries = 20;
String _ssid = jsonRead(configSetup, "ssid");
String _password = jsonRead(configSetup, "password");
//WiFi.persistent(false);
if (_ssid == "" && _password == "") {
WiFi.begin();
}
else {
WiFi.begin(_ssid.c_str(), _password.c_str());
}
// Делаем проверку подключения до тех пор пока счетчик tries
// не станет равен нулю или не получим подключение
while (--tries && WiFi.status() != WL_CONNECTED)
{
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("[E] password is not correct");
tries = 1;
jsonWrite(optionJson, "pass_status", 1);
}
Serial.print(".");
delay(1000);
}
if (WiFi.status() != WL_CONNECTED)
{
// Если не удалось подключиться запускаем в режиме AP
Serial.println("");
// WiFi.disconnect(true);
StartAPMode();
}
else {
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("[V] WiFi connected");
Serial.println("[V] IP address: ");
Serial.println(WiFi.localIP());
jsonWrite(configJson, "ip", WiFi.localIP().toString());
}
}
bool StartAPMode() {
Serial.println("WiFi up AP");
WiFi.disconnect();
WiFi.mode(WIFI_AP);
String _ssidAP = jsonRead(configSetup, "ssidAP");
String _passwordAP = jsonRead(configSetup, "passwordAP");
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
if (jsonReadtoInt(optionJson, "pass_status") != 1) {
ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) {
Serial.println("->try find router");
if (RouterFind(jsonRead(configSetup, "ssid"))) {
ts.remove(ROUTER_SEARCHING);
WIFI_init();
MQTT_init();
}
}, nullptr, true);
}
return true;
}
boolean RouterFind(String ssid) {
int n = WiFi.scanComplete ();
Serial.println("n = " + String(n));
if (n == -2) { //Сканирование не было запущено, запускаем
Serial.println("[WIFI][i] scanning has not been triggered, starting scanning");
WiFi.scanNetworks (true, false); //async, show_hidden
return false;
}
if (n == -1) { //Сканирование все еще выполняется
Serial.println("[WIFI][i] scanning still in progress");
return false;
}
if (n == 0) { //Сканирование все еще выполняется
Serial.println("[WIFI][i] no any wifi sations, starting scanning");
WiFi.scanNetworks (true, false);
return false;
}
if (n > 0) {
for (int i = 0; i <= n; i++) {
if (WiFi.SSID (i) == ssid) {
WiFi.scanDelete();
return true;
} else {
Serial.print(i);
Serial.print(")");
Serial.print(ssid);
Serial.print("<=>");
if (i == n) {
Serial.print(WiFi.SSID(i));
Serial.println("; ");
} else {
Serial.print(WiFi.SSID(i));
Serial.print("; ");
}
}
}
WiFi.scanDelete();
return false;
}
}

View File

@@ -1,72 +0,0 @@
/*
const char* local_root_ca1 = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv\n" \
"MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk\n" \
"ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF\n" \
"eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow\n" \
"gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" \
"BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD\n" \
"VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq\n" \
"hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw\n" \
"AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6\n" \
"2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr\n" \
"ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt\n" \
"4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq\n" \
"m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/\n" \
"vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT\n" \
"8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE\n" \
"IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO\n" \
"KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO\n" \
"GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/\n" \
"s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g\n" \
"JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD\n" \
"AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9\n" \
"MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy\n" \
"bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6\n" \
"Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ\n" \
"zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj\n" \
"Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY\n" \
"Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5\n" \
"B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx\n" \
"PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR\n" \
"pu/xO28QOG8=\n" \
"-----END CERTIFICATE-----\n";
const char* local_root_ca2 = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB\n" \
"hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n" \
"A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n" \
"BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy\n" \
"MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n" \
"EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n" \
"Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh\n" \
"bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n" \
"ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh\n" \
"bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0\n" \
"Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6\n" \
"ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51\n" \
"UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n\n" \
"c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY\n" \
"MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz\n" \
"30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV\n" \
"HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG\n" \
"BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv\n" \
"bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB\n" \
"AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E\n" \
"T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v\n" \
"ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p\n" \
"mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/\n" \
"e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps\n" \
"P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY\n" \
"dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc\n" \
"2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG\n" \
"V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4\n" \
"HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX\n" \
"j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII\n" \
"0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap\n" \
"lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf\n" \
"+AZxAeKCINT+b72x\n" \
"-----END CERTIFICATE-----\n";
*/

View File

@@ -1 +0,0 @@
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"rise","password":"hostel3333","timezone":3,"mqttServer":"m12.cloudmqtt.com","mqttPort":14053,"mqttUser":"lbscvzuj","mqttPass":"bLxlveOgaF8F","scenario":"1","timers":"0","pushingbox_id":"v7C133E426B0C69E","web_login":"admin","web_pass":"admin"}

View File

@@ -1 +1,37 @@
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"your_ssid","password":"your_pass","timezone":3,"mqttServer":"","mqttPort":0,"mqttUser":"","mqttPass":"","scenario":"1","timers":"0","pushingbox_id":"","web_login":"admin","web_pass":"admin"}
{
"name": "IoTmanager",
"chipID": "",
"apssid": "IoTmanager",
"appass": "",
"routerssid": "rise",
"routerpass": "hostel3333",
"timezone": 1,
"ntp": "pool.ntp.org",
"mqttServer": "91.204.228.124",
"mqttPort": 1883,
"mqttPrefix": "/iotTest",
"mqttUser": "rise",
"mqttPass": "23ri22se32",
"mqttServer2": "",
"mqttPort2": 1883,
"mqttPrefix2": "/iotTest",
"mqttUser2": "",
"mqttPass2": "",
"scen": "1",
"telegramApi": "1416711569:AAEI0j83GmXqwzb_gnK1B0Am0gDwZoJt5xo",
"telegonof": "0",
"teleginput": "0",
"autos": "1",
"weblogin": "admin",
"webpass": "admin",
"MqttIn": "0",
"MqttOut": "0",
"blink": "0",
"oneWirePin": "2",
"serverip": "http://206.189.49.244",
"uart": "0",
"uartS": "9600",
"uartTX": "12",
"uartRX": "13",
"grafmax": "0"
}

View File

@@ -1,144 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json",
"/config.option.json"
],
"class":"col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Конфигурация устройства"
},
{
"type":"file",
"state":"firmware.config.txt",
"style":"width:100%;height:400px",
"title": "Сохранить",
"action": "/all_modules_init",
"class":"btn btn-block btn-success"
},
{
"type": "link",
"title": "Инструкция",
"action": "https://github.com/DmitryBorisenko33/esp8266_iot-manager_modules_firmware/wiki/Instruction",
"class": "btn btn-block btn-primary"
},
{
"type": "h2",
"title": "Сценарии"
},
{
"type": "checkbox",
"name":"scenario",
"title": "Включить сценарии",
"action": "/scenario?status=[[scenario]]",
"state": "{{scenario}}"
},
{
"type": "h6",
"title": ""
},
{
"type":"file",
"state":"firmware.scenario.txt",
"style":"width:100%;height:400px",
"title": "Сохранить и включить",
"action": "/scenario?status=1",
"class":"btn btn-block btn-success"
},
{
"type": "h2",
"title": "Данные модулей"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль уровня воды (level)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Расстояние от датчика до воды: {{level_in}} см"
},
{
"type": "h6",
"title": " Заполнение бака: {{level}} %"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль аналогового входа (analog)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Прочитанное значение: {{analog_in}}"
},
{
"type": "h6",
"title": "Преобразованное значение: {{analog}}"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль температурного датчика (dallas)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Текущее значение: {{dallas}} °C"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль pH сенсора от df robot (ph)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Текущее значение: {{ph}}"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Очистить все логи",
"action": "/cleanlog",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

Binary file not shown.

0
data/dev_conf.txt Normal file
View File

View File

@@ -1,572 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>ESP Editor</title>
<style type="text/css" media="screen">
.contextMenu{z-index:300;position:absolute;left:5px;border:1px solid #444;background-color:#f5f5f5;display:none;box-shadow:0 0 10px rgba(0,0,0,.4);font-size:12px;font-family:sans-serif;font-weight:bold}
.contextMenu ul{list-style:none;top:0;left:0;margin:0;padding:0}
.contextMenu li{position:relative;min-width:60px;cursor:pointer}
.contextMenu span{color:#444;display:inline-block;padding:6px}
.contextMenu li:hover{background:#444}
.contextMenu li:hover span{color:#EEE}
.css-treeview ul,.css-treeview li{padding:0;margin:0;list-style:none}
.css-treeview input{position:absolute;opacity:0}
.css-treeview{font:normal 11px Verdana,Arial,Sans-serif;-moz-user-select:none;-webkit-user-select:none;user-select:none}
.css-treeview span{color:#00f;cursor:pointer}
.css-treeview span:hover{text-decoration:underline}
.css-treeview input+label+ul{margin:0 0 0 22px}
.css-treeview input ~ ul{display:none}
.css-treeview label,.css-treeview label::before{cursor:pointer}
.css-treeview input:disabled+label{cursor:default;opacity:.6}
.css-treeview input:checked:not(:disabled) ~ ul{display:block}
.css-treeview label,.css-treeview label::before{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAACgCAYAAAAFOewUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAApxJREFUeNrslM1u00AQgGdthyalFFOK+ClIIKQKyqUVQvTEE3DmAhLwAhU8QZoH4A2Q2gMSFace4MCtJ8SPBFwAkRuiHKpA6sRN/Lu7zG5i14kctaUqRGhGXnu9O/Pt7MzsMiklvF+9t2kWTDvyIrAsA0aKRRi1T0C/hJ4LUbt5/8rNpWVlp8RSr9J40b48fxFaTQ9+ft8EZ6MJYb0Ok+dnYGpmPgXwKIAvLx8vYXc5GdMAQJgQEkpjRTh36TS2U+DWW/D17WuYgm8pwJyY1npZsZKOxImOV1I/h4+O6vEg5GCZBpgmA6hX8wHKUHDRBXQYicQ4rlc3Tf0VMs8DHBS864F2YFspjgUYjKX/Az3gsdQd2eeBHwmdGWXHcgBGSkZXOXohcEXebRoQcAgjqediNY+AVyu3Z3sAKqfKoGMsewBeEIOPgQxxPJIjcGH6qtL/0AdADzKGnuuD+2tLK7Q8DhHHbOBW+KEzcHLuYc82MkEUekLiwuvVH+guQBQzOG4XdAb8EOcRcqQvDkY2iCLuxECJ43JobMXoutqGgDa2T7UqLKwt9KRyuxKVByqVXXqIoCCUCAqhUOioTWC7G4TQEOD0APy2/7G2Xpu1J4+lxeQ4TXBbITDpoVelRN/BVFbwu5oMMJUBhoXy5tmdRcMwymP2OLQaLjx9/vnBo6V3K6izATmSnMa0Dq7ferIohJhr1p01zrlz49rZF4OMs8JkX23vVQzYp+wbYGV/KpXKjvspl8tsIKCrMNAYFxj2GKS5ZWxg4ewKsJfaGMIY5KXqPz8LBBj6+yDvVP79+yDp/9F9oIx3OisHWwe7Oal0HxCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgwD8E/BZgAP0qhKj3rXO7AAAAAElFTkSuQmCC") no-repeat}
.css-treeview label,.css-treeview span,.css-treeview label::before{display:inline-block;height:16px;line-height:16px;vertical-align:middle}
.css-treeview label{background-position:18px 0}
.css-treeview label::before{content:"";width:16px;margin:0 22px 0 0;vertical-align:middle;background-position:0 -32px}
.css-treeview input:checked+label::before{background-position:0 -16px}
@media screen and (-webkit-min-device-pixel-ratio:0){.css-treeview{-webkit-animation:webkit-adjacent-element-selector-bugfix infinite 1s}@-webkit-keyframes webkit-adjacent-element-selector-bugfix{from{padding:0}to{padding:0}}}
#uploader{position:absolute;top:0;right:0;left:0;height:28px;line-height:24px;padding-left:10px;background-color:#444;color:#EEE}#tree{position:absolute;top:28px;bottom:0;left:0;width:200px;padding:8px}
#editor,#preview{position:absolute;top:28px;right:0;bottom:0;left:200px}
#preview{background-color:#EEE;padding:5px}
</style>
<script>
var urlXXX = 'http://192.168.211.181';//bolt
if (window.location.search.substring(1).split("=")[1]) {
urlXXX = 'http://'+window.location.search.substring(1).split("=")[1];
} else {
urlXXX = 'http://'+window.location.hostname;
}
function createFileUploader(element, tree, editor){
var xmlHttp;
var input = document.createElement("input");
input.type = "file";
input.multiple = false;
input.name = "data";
document.getElementById(element).appendChild(input);
var path = document.createElement("input");
path.id = "upload-path";
path.type = "text";
path.name = "path";
path.defaultValue = "/";
document.getElementById(element).appendChild(path);
var button = document.createElement("button");
button.innerHTML = 'Upload';
document.getElementById(element).appendChild(button);
var mkdir = document.createElement("button");
mkdir.innerHTML = 'MkDir';
document.getElementById(element).appendChild(mkdir);
var mkfile = document.createElement("button");
mkfile.innerHTML = 'MkFile';
document.getElementById(element).appendChild(mkfile);
function httpPostProcessRequest(){
if (xmlHttp.readyState == 4){
if(xmlHttp.status != 200) alert("ERROR["+xmlHttp.status+"]: "+xmlHttp.responseText);
else {
tree.refreshPath(path.value);
}
}
}
function createPath(p){
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = httpPostProcessRequest;
var formData = new FormData();
formData.append("path", p);
xmlHttp.open("PUT", urlXXX+"/edit");
xmlHttp.send(formData);
}
mkfile.onclick = function(e){
if(path.value.indexOf(".") === -1) return;
createPath(path.value);
editor.loadUrl(path.value);
};
mkdir.onclick = function(e){
if(path.value.length < 2) return;
var dir = path.value
if(dir.indexOf(".") !== -1){
if(dir.lastIndexOf("/") === 0) return;
dir = dir.substring(0, dir.lastIndexOf("/"));
}
createPath(dir);
};
button.onclick = function(e){
if(input.files.length === 0){
return;
}
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = httpPostProcessRequest;
var formData = new FormData();
formData.append("data", input.files[0], path.value);
xmlHttp.open("POST", urlXXX+"/edit");
xmlHttp.send(formData);
}
input.onchange = function(e){
if(input.files.length === 0) return;
var filename = input.files[0].name;
var ext = /(?:\.([^.]+))?$/.exec(filename)[1];
var name = /(.*)\.[^.]+$/.exec(filename)[1];
if(typeof name !== undefined){
//1197 bolt if(name.length > 8) name = name.substring(0, 8);
filename = name;
}
if(typeof ext !== undefined){
if(ext === "html") ext = "htm";
else if(ext === "jpeg") ext = "jpg";
filename = filename + "." + ext;
}
if(path.value === "/" || path.value.lastIndexOf("/") === 0){
path.value = "/"+filename;
} else {
path.value = path.value.substring(0, path.value.lastIndexOf("/")+1)+filename;
}
}
}
function createTree(element, editor){
var preview = document.getElementById("preview");
var treeRoot = document.createElement("div");
treeRoot.className = "css-treeview";
document.getElementById(element).appendChild(treeRoot);
function loadDownload(path){
document.getElementById('download-frame').src = path+"?download=true";
}
function loadPreview(path){
document.getElementById("editor").style.display = "none";
preview.style.display = "block";
preview.innerHTML = '<img src="'+ urlXXX +path+'" style="max-width:100%; max-height:100%; margin:auto; display:block;" />';
}
function fillFolderMenu(el, path){
var list = document.createElement("ul");
el.appendChild(list);
var action = document.createElement("li");
list.appendChild(action);
var isChecked = document.getElementById(path).checked;
var expnd = document.createElement("li");
list.appendChild(expnd);
if(isChecked){
expnd.innerHTML = "<span>Collapse</span>";
expnd.onclick = function(e){
document.getElementById(path).checked = false;
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
var refrsh = document.createElement("li");
list.appendChild(refrsh);
refrsh.innerHTML = "<span>Refresh</span>";
refrsh.onclick = function(e){
var leaf = document.getElementById(path).parentNode;
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
} else {
expnd.innerHTML = "<span>Expand</span>";
expnd.onclick = function(e){
document.getElementById(path).checked = true;
var leaf = document.getElementById(path).parentNode;
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
}
var upload = document.createElement("li");
list.appendChild(upload);
upload.innerHTML = "<span>Upload</span>";
upload.onclick = function(e){
var pathEl = document.getElementById("upload-path");
if(pathEl){
var subPath = pathEl.value;
if(subPath.lastIndexOf("/") < 1) pathEl.value = path+subPath;
else pathEl.value = path.substring(subPath.lastIndexOf("/"))+subPath;
}
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
var delFile = document.createElement("li");
list.appendChild(delFile);
delFile.innerHTML = "<span>Delete</span>";
delFile.onclick = function(e){
httpDelete(path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
}
function fillFileMenu(el, path){
var list = document.createElement("ul");
el.appendChild(list);
var action = document.createElement("li");
list.appendChild(action);
if(isTextFile(path)){
action.innerHTML = "<span>Edit</span>";
action.onclick = function(e){
editor.loadUrl(path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
} else if(isImageFile(path)){
action.innerHTML = "<span>Preview</span>";
action.onclick = function(e){
loadPreview(path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
}
var download = document.createElement("li");
list.appendChild(download);
download.innerHTML = "<span>Download</span>";
download.onclick = function(e){
loadDownload(path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
var delFile = document.createElement("li");
list.appendChild(delFile);
delFile.innerHTML = "<span>Delete</span>";
delFile.onclick = function(e){
httpDelete(path);
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(el);
};
}
function showContextMenu(e, path, isfile){
var divContext = document.createElement("div");
var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;
var left = e.clientX + scrollLeft;
var top = e.clientY + scrollTop;
divContext.className = 'contextMenu';
divContext.style.display = 'block';
divContext.style.left = left + 'px';
divContext.style.top = top + 'px';
if(isfile) fillFileMenu(divContext, path);
else fillFolderMenu(divContext, path);
document.body.appendChild(divContext);
var width = divContext.offsetWidth;
var height = divContext.offsetHeight;
divContext.onmouseout = function(e){
if(e.clientX < left || e.clientX > (left + width) || e.clientY < top || e.clientY > (top + height)){
if(document.body.getElementsByClassName('contextMenu').length > 0) document.body.removeChild(divContext);
}
};
}
function createTreeLeaf(path, name, size){
var leaf = document.createElement("li");
leaf.id = (((path == "/")?"":path)+"/"+name).toLowerCase();
var label = document.createElement("span");
label.textContent = name.toLowerCase();
leaf.appendChild(label);
leaf.onclick = function(e){
if(isTextFile(leaf.id)){
editor.loadUrl(leaf.id);
} else if(isImageFile(leaf.id)){
loadPreview(leaf.id);
}
};
leaf.oncontextmenu = function(e){
e.preventDefault();
e.stopPropagation();
showContextMenu(e, leaf.id, true);
};
return leaf;
}
function createTreeBranch(path, name, disabled){
var leaf = document.createElement("li");
var check = document.createElement("input");
check.type = "checkbox";
check.id = (((path == "/")?"":path)+"/"+name).toLowerCase();
if(typeof disabled !== "undefined" && disabled) check.disabled = "disabled";
leaf.appendChild(check);
var label = document.createElement("label");
label.for = check.id;
label.textContent = name.toLowerCase();
leaf.appendChild(label);
check.onchange = function(e){
if(check.checked){
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, check.id);
}
};
label.onclick = function(e){
if(!check.checked){
check.checked = true;
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, check.id);
} else {
check.checked = false;
}
};
leaf.oncontextmenu = function(e){
e.preventDefault();
e.stopPropagation();
showContextMenu(e, check.id, false);
}
return leaf;
}
function addList(parent, path, items){
var list = document.createElement("ul");
parent.appendChild(list);
var ll = items.length;
//Сортировка файлов
items.sort(function(a,b){return (a.name < b.name) ? 1 : ((b.name < a.name) ? -1 : 0);});
for(var i = 0; i < ll; i++){
var item = items[i];
var itemEl;
if(item.type === "file"){
itemEl = createTreeLeaf(path, item.name, item.size);
} else {
itemEl = createTreeBranch(path, item.name);
}
list.appendChild(itemEl);
}
}
function isTextFile(path){
var ext = /(?:\.([^.]+))?$/.exec(path)[1];
if(typeof ext !== undefined){
switch(ext){
case "txt":
case "htm":
case "html":
case "js":
case "json":
case "c":
case "h":
case "cpp":
case "css":
case "xml":
return true;
}
}
return false;
}
function isImageFile(path){
var ext = /(?:\.([^.]+))?$/.exec(path)[1];
if(typeof ext !== undefined){
switch(ext){
case "png":
case "jpg":
case "gif":
case "ico":
return true;
}
}
return false;
}
this.refreshPath = function(path){
if(path.lastIndexOf('/') < 1){
path = '/';
treeRoot.removeChild(treeRoot.childNodes[0]);
httpGet(treeRoot, "/");
} else {
path = path.substring(0, path.lastIndexOf('/'));
var leaf = document.getElementById(path).parentNode;
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, path);
}
};
function delCb(path){
return function(){
if (xmlHttp.readyState == 4){
if(xmlHttp.status != 200){
alert("ERROR["+xmlHttp.status+"]: "+xmlHttp.responseText);
} else {
if(path.lastIndexOf('/') < 1){
path = '/';
treeRoot.removeChild(treeRoot.childNodes[0]);
httpGet(treeRoot, "/");
} else {
path = path.substring(0, path.lastIndexOf('/'));
var leaf = document.getElementById(path).parentNode;
if(leaf.childNodes.length == 3) leaf.removeChild(leaf.childNodes[2]);
httpGet(leaf, path);
}
}
}
}
}
function httpDelete(filename){
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = delCb(filename);
var formData = new FormData();
formData.append("path", filename);
xmlHttp.open("DELETE", urlXXX+"/edit");
xmlHttp.send(formData);
}
function getCb(parent, path){
return function(){
if (xmlHttp.readyState == 4){
//clear loading
if(xmlHttp.status == 200) addList(parent, path, JSON.parse(xmlHttp.responseText));
}
}
}
function httpGet(parent, path){
xmlHttp = new XMLHttpRequest(parent, path);
xmlHttp.onreadystatechange = getCb(parent, path);
//Для отключения кэша random() иначе будут старые данные
xmlHttp.open("GET", urlXXX+"/edit?list=" + path +"&rand="+Math.random(), true);
xmlHttp.send(null);
//start loading
}
httpGet(treeRoot, "/");
return this;
}
function createEditor(element, file, lang, theme, type){
function getLangFromFilename(filename){
var lang = "plain";
var ext = /(?:\.([^.]+))?$/.exec(filename)[1];
if(typeof ext !== undefined){
switch(ext){
case "txt": lang = "plain"; break;
case "htm": lang = "html"; break;
case "js": lang = "javascript"; break;
case "c": lang = "c_cpp"; break;
case "cpp": lang = "c_cpp"; break;
case "css":
case "scss":
case "php":
case "html":
case "json":
case "xml":
lang = ext;
}
}
return lang;
}
if(typeof file === "undefined") file = "/index.htm";
if(typeof lang === "undefined"){
lang = getLangFromFilename(file);
}
if(typeof theme === "undefined") theme = "textmate";
if(typeof type === "undefined"){
type = "text/"+lang;
if(lang === "c_cpp") type = "text/plain";
}
var xmlHttp = null;
var editor = ace.edit(element);
//post
function httpPostProcessRequest(){
if (xmlHttp.readyState == 4){
if(xmlHttp.status != 200) alert("ERROR["+xmlHttp.status+"]: "+xmlHttp.responseText);
}
}
function httpPost(filename, data, type){
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = httpPostProcessRequest;
var formData = new FormData();
formData.append("data", new Blob([data], { type: type }), filename);
xmlHttp.open("POST", urlXXX + "/edit");
xmlHttp.send(formData);
}
//get
function httpGetProcessRequest(){
if (xmlHttp.readyState == 4){
document.getElementById("preview").style.display = "none";
document.getElementById("editor").style.display = "block";
if(xmlHttp.status == 200) editor.setValue(xmlHttp.responseText);
else editor.setValue("");
editor.clearSelection();
}
}
function httpGet(theUrl){
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = httpGetProcessRequest;
if (theUrl.indexOf("/") == 0)
theUrl = urlXXX + theUrl;//bolt
xmlHttp.open("GET", theUrl+"?rand="+Math.random(), true);
xmlHttp.send(null);
}
if(lang !== "plain") editor.getSession().setMode("ace/mode/"+lang);
editor.setTheme("ace/theme/"+theme);
editor.$blockScrolling = Infinity;
editor.getSession().setUseSoftTabs(true);
editor.getSession().setTabSize(2);
editor.setHighlightActiveLine(true);
editor.setShowPrintMargin(false);
editor.commands.addCommand({
name: 'saveCommand',
bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
exec: function(editor) {
httpPost(file, editor.getValue()+"", type);
},
readOnly: false
});
editor.commands.addCommand({
name: 'undoCommand',
bindKey: {win: 'Ctrl-Z', mac: 'Command-Z'},
exec: function(editor) {
editor.getSession().getUndoManager().undo(false);
},
readOnly: false
});
editor.commands.addCommand({
name: 'redoCommand',
bindKey: {win: 'Ctrl-Shift-Z', mac: 'Command-Shift-Z'},
exec: function(editor) {
editor.getSession().getUndoManager().redo(false);
},
readOnly: false
});
httpGet(file);
editor.loadUrl = function(filename){
file = filename;
lang = getLangFromFilename(file);
type = "text/"+lang;
if(lang !== "plain") editor.getSession().setMode("ace/mode/"+lang);
httpGet(file);
}
return editor;
}
function onBodyLoad(){
var vars = {};
// var s = "http://192.168.211.180/edit/index.htm";
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; });
// var parts = s.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; });
if (typeof vars.url !== "undefined" && vars.url != "")
urlXXX = "http://" + vars.url;/**/
var editor = createEditor("editor", vars.file, vars.lang, vars.theme);
var tree = createTree("tree", editor);
createFileUploader("uploader", tree, editor);
};
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
(function() {
window.require(["ace/ace"], function(a) {
a && a.config.init(true);
if (!window.ace)
window.ace = a;
for (var key in a) if (a.hasOwnProperty(key))
window.ace[key] = a[key];
});
})();
</script>
</head>
<body onload="onBodyLoad();">
<div id="uploader"></div>
<div id="tree"></div>
<div id="editor"></div>
<div id="preview" style="display:none;"></div>
<iframe id=download-frame style='display:none;'></iframe>
</body>
</html>

BIN
data/edit.htm.gz Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,20 +0,0 @@
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 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
//dallas 2 Водонагреватель,#t°C Датчики any-data 7
//dhtT 2 Температура#DHT,#t°C Датчики any-data 8
//dhtH 2 Влажность#DHT,#% Датчики any-data 9
//level Вода#в#баке,#% Датчики any-data 125 20 10
inputDigit digit1 При#скольки#включить? Датчики 10 11
button 4 na Кнопка Датчики 0 12
button 5 na Вкл#обратный#таймер Таймеры 0 13
inputDigit digit2 Через#сколько#секунд#включить? Таймеры 5 14
button 6 5 Включится#по#таймеру Таймеры 0 15
switch 1 0 20
textSet 1 неопределено
text 1 Квартира Двери 22
button 7 scenario Вкл#выкл#все#сценарии Сценарии 1 23
button 8 line1,line2, Вкл#выкл#выбранные#сценарии Сценарии 1 24

View File

@@ -1,29 +0,0 @@
button1 = 1
buttonSet 2 1
buttonSet 3 1
pwmSet 2 1024
end
button1 = 0
buttonSet 2 0
buttonSet 3 0
pwmSet 2 0
end
analog > digit1
buttonSet 4 1
end
analog < digit1
buttonSet 4 0
end
button5 = 1
timerStart 1 digit2 sec
end
timer1 = 0
buttonSet 6 1
end
switch1 = 1
textSet 1 закрыто-time
push закрыто вход
end
switch1 = 0
textSet 1 открыто-time
end

View File

@@ -1,75 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<!--
Web Developer: Renats Kevrels (ex. Zozula)
Site: http://www.onclick.lv
Contact: info [at] onclick.lv
Skype: renat2985
Twitter: @Ramzies
Facebook: http://www.facebook.com/renat2985
GitHub: https://github.com/renat2985
From: Latvia, Valmiera
-->
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<script defer src="js/build.chart.js?v07.04.2018" charset="utf-8"></script>
<!-- <link rel="stylesheet" type="text/css" href="css/chartist.min.css">
<script src="js/chartist.min.js" charset="utf-8"></script>
<script type="text/javascript" src="js/chart.js"></script> -->
<link rel="stylesheet" type="text/css" href="css/build.css?v07.04.2018">
<!-- <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/style.css"> -->
<script defer type="text/javascript" src="js/function.js?v07.04.2018"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<script type="text/javascript">
var jsonResponse;
//function selectTextareaLine(tarea,lineNum) {
// lineNum--;
// var lines = tarea.value.split("\n");
// var startPos = 0, endPos = tarea.value.length;
// for(var x = 0; x < lines.length; x++) {
// if(x == lineNum) {break;}
// startPos += (lines[x].length+1);
// }
// var endPos = lines[lineNum].length+startPos;
// if(typeof(tarea.selectionStart) != "undefined") {
// tarea.focus();
// tarea.selectionStart = startPos;
// tarea.selectionEnd = endPos;
// return true;
// }
// return false;
//}
window.onload = function() {
setContent('first');
}
</script>
</head>
<body>
<div class="container loader-bg">
<ul id="url-content" class="hidden" onclick="document.getElementById('content').style.zIndex=0;"></ul>
<div id="headers"></div>
<div class="row hidden" id="container_column">
<h1 id="title"></h1>
<div id="content" onclick="this.style.zIndex=10"></div>
</div>
<div id="footer"></div>
<div id="edit-content" class="hidden" onclick="document.getElementById('content').style.zIndex=0;">
<a target="_blank" style="position:fixed;right:0;color:#000;" href="https://github.com/tretyakovsa/Sonoff_WiFi_switch/wiki/%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8-page.htm%3F*" title="Github wiki"><i class="help-img"></i>wiki</a>
<textarea class="form-control" onkeyup="isValidJson(this.value,'edit-json')" spellcheck="false" id="edit-json"></textarea>
<div id="error-json"></div>
<div class="btn-group btn-block">
<input class="btn btn-success" style="width:40%" id="edit-view" onclick="setContent('edit');this.value='Loading...';html('url-content', ' ');" value="View" type="button">
<input class="btn btn-danger" style="width:40%" id="edit-save" onclick="var urlPages=window.location.search.substring(1).split('&')[0];httpDelete('/'+urlPages+'.json.gz');send_request_edit(this, val('edit-json'),(urlPages?urlPages:'index')+'.json');toggle('edit-content');toggle('url-content');" value="Save" type="button">
<a class="btn btn-info" style="width:20%" href="#" id="download-json" download="" title="Save to PC"><i class="download-img"></i></a>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -1,62 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class": "alert-warning"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "link",
"title": "Конфигурация устройства",
"action": "/page.htm?configuration",
"class": "btn btn-block btn-primary"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Конфигурация WIFI",
"action": "/page.htm?setup",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Конфигурация MQTT",
"action": "/page.htm?mqtt",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Конфигурация push",
"action": "/page.htm?pushingbox",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Скачать приложение IoT Manager для android",
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
"class": "btn btn-block btn-warning"
},
{
"type": "link",
"title": "Скачать приложение IoT Manager для iphone",
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
"class": "btn btn-block btn-warning"
}
]
}

BIN
data/index.json.gz Normal file

Binary file not shown.

27
data/items/items.txt Normal file
View File

@@ -0,0 +1,27 @@
0;button-out;btnid;toggle;Кнопки;Освещение;order;gpio*
0;button-out;btnid;toggle;Кнопки;Освещение;order;gpio;inv[1]*
0;button-out;btnid;toggle;Кнопки;Освещение;order*
0;button-in;btnid;toggle;Кнопки;Освещение;order;gpio;db[20]*
0;pwm-out;pwmid;range;Ползунки;Яркость;order;gpio*
0;inoutput;dgtid;inputDigit;Ввод;Введите#цифру;order*
0;inoutput;tmid;inputTime;Ввод;Введите#время;order*
0;inoutput;txtid;anydata;Вывод;Сигнализация;order*
0;analog-adc;adcid;fillgauge;Сенсоры;Аналоговый;order;pin[0];map[0,1024,0,100];c[1];int[10]*
0;dallas-temp;tmpid;anydataTemp;Сенсоры;Температура;order;pin[2];index[0];int[10]*
0;ultrasonic-cm;cmid;anydata;Сенсоры;Расстояние;order;pin[12,13];map[0,500,0,100];c[1];int[10]*
0;dht;tmpid;anydataTemp;Сенсоры;Температура;1;c[1]
0;dht;humid;anydataHum;Сенсоры;Влажность;2;c[1];pin[2];type[dht11];int[10]*
0;dht;tmpid;anydataTemp;Сенсоры;Температура;1;c[1]
0;dht;humid;anydataHum;Сенсоры;Влажность;2;c[1];pin[2];type[dht22];int[10]*
0;bme280;tmpid;anydataTemp;Сенсоры;Температура;1;c[1]
0;bme280;humid;anydataHum;Сенсоры;Влажность;2;c[1]
0;bme280;prsid;anydataPress;Сенсоры;Давление;3;c[1];addr[0x76];int[10]*
0;bmp280;tmpid;anydataTemp;Сенсоры;Температура;1;c[1]
0;bmp280;prsid;anydataPress;Сенсоры;Давление;3;c[1];addr[0x76];int[10]*
0;ccs811;ppmid;anydataPpm;Сенсоры;Содержание#CO2;1;c[1]
0;ccs811;ppbid;anydataPpb;Сенсоры;Содержание#орг#соед;2;c[1];addr[0x76];int[10]*
0;impuls-out;impid;na;na;na;order;gpio*
0;count-down;cntid;anydata;Таймер;Обратный#отчет;order*
0;inoutput;txtid;anydata;Вывод;Вывод#uart;order*
0;logging;crtid;chart;Графики;История;order;val[any];int[60];cnt[100]*
0;uptime;uptid;anydataTime;Системные;%name%#uptime;order;int[60]*

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

39
data/lang/lang.ru.json Normal file
View File

@@ -0,0 +1,39 @@
{
"SetDevConf": "Конфигурация устройства",
"SetDevPreset": "Выберите из списка подходящий пресет кофигурации",
"ButSave":"Сохранить",
"ButMainPage":"Главная",
"SetUDPList": "Список других устройств в сети:",
"SetUDPWarn1": "После нажатия на кнопку <b>переформировать список устройств</b> ждите примерно минуту, а затем обновите страницу и список появится вновь",
"SetUDPUpdateList":"Переформировать список устройств",
"SetUDPUpdatePage":"Обновить страницу",
"SetUDPNameOfDev":"Имя этого устройства:",
"SetUDPDateExchange":"Включить обмен данными между устройствами",
"SetUDPWarn2":"Если обмен данными включен, то устройства будут обмениваться широковещательными пакетами udp для формирования списка устройств и для осуществления посылки настроек mqtt. Данный обмен создает дополнительную нагрузку на wifi сеть.",
"SetWiFiNameOfDev":"Имя устройства:",
"SetWiFiRouterConnect":"Подключение к WiFi роутеру:",
"SetWiFiAccessPoint":"Точка доступа:",
"SetWiFiWeb":"Логин и пароль web interface:",
"SetWiFiTimeZone":"Временная зона:",
"SetWiFiNTP":"Сервер NTP:",
"SetWiFiWarn1":"Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов",
"SetWiFiWarn2":"После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку <b>перезагрузить устройство</b> внизу этой страницы",
"SetWiFiWarn3":"Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа",
"SetWiFiWarn4":"После изменения поля <b>NTP сервер</b> необходимо перезагрузить устройство",
"SetWiFiWarn5":"Светодиод статуса подключения показывает четыре состояния подключения: <br><b>1. мигает редко</b> - идет подключение к wifi <br><b>2. мигает часто</b> - идет подключение к серверу mqtt <br><b>3. горит постоянно</b> - модуль в режиме точки доступа, <br><b>4. не горит</b> - модуль подключен к wifi и к mqtt. <br>Светодиод подключен к gpio2. Если галочка стоит - то использовать этот пин нельзя",
"SetMQTTServerName":"Имя сервера:",
"SetMQTTPort":"Номер порта:",
"SetMQTTPrefix":"Префикс:",
"SetMQTTUserName":"Имя пользователя:",
"SetMQTTPassword":"Пароль:",
"SetMQTTSendSettings":"Отправить настройки MQTT с этого устройства на все остальные",
"SetMQTTWarn1":"Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство",
"SetMQTTWarn2":"Прежде чем нажимать на кнопку <b>Отправить настройки MQTT</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
}

Binary file not shown.

Binary file not shown.

View File

@@ -1,79 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Server name:"
},
{
"type": "input",
"title": "",
"name":"1",
"state": "{{mqttServer}}"
},
{
"type": "h4",
"title": "Port:"
},
{
"type": "input",
"title": "",
"name":"2",
"state": "{{mqttPort}}"
},
{
"type": "h4",
"title": "User name:"
},
{
"type": "input",
"title": "",
"name":"3",
"state": "{{mqttUser}}"
},
{
"type": "h4",
"title": "Password:"
},
{
"type": "input",
"title": "",
"name":"4",
"state": "{{mqttPass}}"
},
{
"type":"h3",
"name":"my-block",
"style":"position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class":"hidden"
},
{
"type": "button",
"title":"Сохранить",
"action": "mqttSave?mqttServer=[[1]]&mqttPort=[[2]]&mqttUser=[[3]]&mqttPass=[[4]]",
"response":"[[my-block]]",
"class": "btn btn-block btn-success",
"style": "width:100%;display:inline"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

Binary file not shown.

View File

@@ -0,0 +1,47 @@
0;dallas-temp;t1;anydataTemp;Термостат1;Температура;1;pin[2];index[0];int[10]
0;logging;log1;chart;Термостат1;История;2;val[t1];int[60];cnt[100]
0;inoutput;tUp1;inputDigit;Термостат1;Верхний#порог;3
0;inoutput;tLow1;inputDigit;Термостат1;Нижний#порог;4
0;button-out;btn1;toggle;Термостат1;Нагрев;5;pin[12]*
0;dallas-temp;t2;anydataTemp;Термостат2;Температура;1;pin[2];index[0];int[10]
0;logging;log2;chart;Термостат2;История;2;val[t2];int[10];cnt[100]
0;inoutput;threshold;inputDigitTemp;Термостат2;Заданная#температура;3
0;button-out;heater2;toggle;Термостат2;Нагреватель;7;pin[5]
0;inoutput;time21;inputTimeClock;Расписание2;Утренний#период;8
0;inoutput;threshold1;inputDigitTemp;Расписание2;Температура;9
0;inoutput;time22;inputTimeClock;Расписание2;Дневной#период;10
0;inoutput;threshold2;inputDigitTemp;Расписание2;Температура;11
0;inoutput;time23;inputTimeClock;Расписание2;Вечерний#период;12
0;inoutput;threshold3;inputDigitTemp;Расписание2;Температура;13
0;inoutput;time24;inputTimeClock;Расписание2;Ночной#период;14
0;inoutput;threshold4;inputDigitTemp;Расписание2;Температура;15*
0;dht;t3;anydataTemp;Теплица3;Температура;1;c[1]
0;dht;h3;anydataHum;Теплица3;Влажность;2;c[1];pin[2];type[dht11];int[10]
0;logging;log3;chart;Теплица3;История;3;val[h3];int[60];cnt[100]
0;inoutput;hUp3;inputDigit;Теплица3;Верхний#порог;4
0;inoutput;hLow3;inputDigit;Теплица3;Нижний#порог;5
0;button-out;hUp3;toggle;Теплица3;Полив;6;pin[12]*
0;button-out;btn41;toggle;Реле4;Освещение;1;pin[12]
0;button-out;btn42;toggle;Реле4;Освещение;2;pin[13]
0;inoutput;time41;inputTime;Реле4;Введите#время#включения;3
0;inoutput;time42;inputTime;Реле4;Введите#время#выключения;4*
0;button-out;btn51;toggle;Свет5;Выключить#все;1
0;button-out;btn52;toggle;Свет5;Гостинная;2;pin[12]
0;button-out;btn53;toggle;Свет5;Спальня;3;pin[13]
0;button-out;btn54;toggle;Свет5;Прихожая;4;pin[14]
0;pwm-out;pwm51;range;Свет5;Яркость;5;pin[15]
0;pwm-out;pwm52;range;Свет5;Яркость;6;pin[16]
0;inoutput;txt5;anydata;Свет5;Статус;7*
0;button-out;button;toggle;Таймер;Освещение;1;pin[12]
0;count-down;count;anydata;Таймер;Обратный#отчет;2
0;inoutput;input;inputDigit;Таймер;Введите#цифру;3*
0;inoutput;text;anydataAlarm;Сигнализация;Движение:;1
0;inoutput;time;anydataTime;Сигнализация;Время:;2
0;button-in;sensor;na;na;na;3;pin[0];db[20]
0;button-out;reset;toggle;Сигнализация;Сбросить;4*
0;button-in;sensor;na;na;na;1;pin[0];db[20]
0;button-out;light;toggle;Освещение;Освещение;2;pin[13]
0;count-down;count;anydata;Освещение;Обратный#отчет;3
0;inoutput;period;inputDigit;Освещение;Период#включения;4*
0;button-out;light;toggle;Кнопки;Освещение;1;pin[13]
0;button-in;switch;na;na;na;2;pin[0];db[20]*

View File

@@ -0,0 +1,84 @@
t1 > tUp1
btn1 0
telegram Гостинная нагрев#выключен
end
t1 < tLow1
btn1 1
telegram Гостинная нагрев#включен
end*
t2 > threshold+-2
heater2 0
end
t2 < threshold+-2
heater2 1
end
timenow = time21
threshold threshold1
end
timenow = time22
threshold threshold2
end
timenow = time23
threshold threshold3
end
timenow = time24
threshold threshold4
end*
h3 > hUp3
hUp3 0
telegram Теплица полив#выключен
end
h3 < hLow3
hUp3 1
telegram Теплица полив#включен
end*
timenow = time41
btn41 1
btn42 0
end
timenow = time42
btn41 0
btn42 1
end*
btn51 = 1
btn52 1
btn53 1
btn54 1
pwm51 200
pwm52 800
txt5 включено
end
btn51 = 0
btn52 0
btn53 0
btn54 0
pwm51 800
pwm52 200
txt5 выключено
end*
button = 1
count input
end
count = 0
button 0
end*
sensor = 1
text обнаружено
time %date%
telegram often Обнаружено#движение
end
reset = 1
text не#обнаружено
time %date%
reset 0
end*
sensor = 1
light 1
count period
end
count = 0
light 0
end*
switch = 1
light change
end*

View File

@@ -1,92 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Host name:"
},
{
"type": "input",
"title": "",
"name":"1",
"state": "{{pushHost}}"
},
{
"type": "h4",
"title": "Port:"
},
{
"type": "input",
"title": "",
"name":"2",
"state": "{{pushPort}}"
},
{
"type": "h4",
"title": "Fingerprint:"
},
{
"type": "input",
"title": "",
"name":"3",
"state": "{{pushFingerprint}}"
},
{
"type": "h4",
"title": "Access Token:"
},
{
"type": "input",
"title": "",
"name":"4",
"state": "{{pushAccessToken}}"
},
{
"type":"h3",
"name":"my-block",
"style":"position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class":"hidden"
},
{
"type": "button",
"title":"Сохранить и проверить соединение",
"action": "pushDate?pushHost=[[1]]&pushPort=[[2]]&pushFingerprint=[[3]]&pushAccessToken=[[4]]",
"response":"[[my-block]]",
"class": "btn btn-block btn-success",
"style": "width:100%;display:inline"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name":"start-push",
"title": "Отправлять push при включении устройства",
"action": "startPush?status=[[start-push]]",
"state": "{{startPush}}"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

View File

@@ -1,46 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Device id:"
},
{
"type": "input",
"title": "",
"name":"1",
"state": "{{pushingbox_id}}"
},
{
"type": "button",
"title":"Сохранить",
"action": "pushingboxDate?pushingbox_id=[[1]]",
"class": "btn btn-block btn-success",
"style": "width:100%;display:inline"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

1
data/s.conf.csv Normal file
View File

@@ -0,0 +1 @@
Удалить;Тип элемента;Id;Виджет;Имя вкладки;Имя виджета;Позиция виджета
1 Удалить Тип элемента Id Виджет Имя вкладки Имя виджета Позиция виджета

1
data/s.scen.txt Normal file
View File

@@ -0,0 +1 @@
//

BIN
data/set.dev.json.gz Normal file

Binary file not shown.

BIN
data/set.device.json.gz Normal file

Binary file not shown.

BIN
data/set.manual.json.gz Normal file

Binary file not shown.

BIN
data/set.mqtt.json.gz Normal file

Binary file not shown.

BIN
data/set.telegram.json.gz Normal file

Binary file not shown.

BIN
data/set.udp.json.gz Normal file

Binary file not shown.

BIN
data/set.utilities.json.gz Normal file

Binary file not shown.

BIN
data/set.wifi.json.gz Normal file

Binary file not shown.

View File

@@ -1,129 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"title": "Конфигурация",
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Имя устройства"
},
{
"type": "input",
"title": "Имя устройства",
"name":"ssdp",
"state": "{{SSDP}}",
"pattern": "[0-9a-zA-Zа-яА-Я.\\- ]{1,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "ssdp?ssdp=[[ssdp]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Подключение к Wi-Fi роутеру"
},
{
"type": "input",
"title":"Сеть",
"name":"ssid",
"state": "{{ssid}}"
},
{
"type": "password",
"title": "Введите пароль",
"name":"ssidPass",
"state": "{{password}}",
"pattern": ".{8,20}"
},
{
"type": "button",
"title": "Сохранить",
"class": "btn btn-block btn-success",
"action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Точка доступа"
},
{
"type": "input",
"title": "Имя WI-FI сети",
"name":"ssidap",
"state": "{{ssidAP}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name":"ssidApPass",
"state": "{{passwordAP}}",
"pattern": ".{8,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Логин и пароль web interface"
},
{
"type": "input",
"title": "Логин",
"name":"web-login",
"state": "{{web_login}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name":"web-pass",
"state": "{{web_pass}}",
"pattern": ".{1,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
}
]
}

View File

@@ -1,57 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.option.json",
"/config.setup.json",
"/lang/lang.ru.json",
"socket {{ip}}:81/"
],
"title": "Главная",
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Module tank level:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_tank_level_s}}",
"style": "width:20%;float:right;"
},
{
"type": "h4",
"title": "Module analog:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_analog_s}}",
"style": "width:20%;float:right;"
},
{
"type": "h4",
"title": "Module ds18b20:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_ds18b20_s}}",
"style": "width:20%;float:right;"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm",
"style": "width:100%;float:right;"
}
]
}

View File

@@ -1,5 +0,0 @@
{
"widget" : "anydata",
"after" : "",
"icon" : ""
}

View File

@@ -1,6 +0,0 @@
{
"widget" : "input",
"size" : "small",
"color" : "orange",
"type" : "time"
}

View File

@@ -1,12 +0,0 @@
{
"widget" : "progress-line",
"icon" : "sunny",
"descrColor" : "",
"color" : "",
"max" : "100",
"background" : "",
"stroke" : "10",
"disabled" : "",
"before" : "",
"after" : ""
}

View File

@@ -1,12 +0,0 @@
{
"widget" : "progress-round",
"icon" : "globe",
"descrColor" : "orange",
"max" : "100",
"stroke" : "20",
"color" : "#45ccce",
"background": "#777",
"before" : "",
"semicircle" : "1",
"after" : ""
}

View File

@@ -1,7 +0,0 @@
{
"widget" : "select",
"size" : "small",
"fill" : "outline",
"options" : "["Zero item", "First item", "Second item"]",
"status" : 2
}

View File

@@ -1,5 +0,0 @@
{
"widget" : "toggle",
"icon" : "",
"iconOff" : ""
}

6
data/widgets/alarm.json Normal file
View File

@@ -0,0 +1,6 @@
{
"widget": "anydata",
"icon": "body",
"color": "red",
"descrColor": "red"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "",
"icon": ""
}

View File

@@ -0,0 +1,6 @@
{
"widget": "anydata",
"after": "",
"color":"red",
"icon": "walk"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "%",
"icon": "water"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "ppb",
"icon": "body"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "ppm",
"icon": "body"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "mm",
"icon": "speedometer"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "°С",
"icon": "thermometer"
}

View File

@@ -0,0 +1,5 @@
{
"widget": "anydata",
"after": "",
"icon": "speedometer"
}

6
data/widgets/btn.json Normal file
View File

@@ -0,0 +1,6 @@
{
"widget": "btn",
"size": "large",
"color": "green",
"send": "test"
}

5
data/widgets/chart.json Normal file
View File

@@ -0,0 +1,5 @@
{
"widget": "chart",
"dateFormat": "HH:mm",
"pointRadius": 0
}

4
data/widgets/chart2.json Normal file
View File

@@ -0,0 +1,4 @@
{
"widget": "chart",
"dateFormat": "HH:mm"
}

View File

@@ -0,0 +1,7 @@
{
"widget": "fillgauge",
"circleColor": "#00FFFF",
"textColor": "#FFFFFF",
"waveTextColor": "#000000",
"waveColor": "#00FFFF"
}

View File

@@ -0,0 +1,7 @@
{
"widget" : "input",
"color" : "green",
"type" : "number",
"size" : "small",
"icon": "thermometer"
}

View File

@@ -0,0 +1,5 @@
{
"widget" : "input",
"color" : "blue",
"type" : "time"
}

View File

@@ -0,0 +1,7 @@
{
"widget" : "input",
"color" : "orange",
"type" : "time",
"size" : "small",
"icon": "alarm-outline"
}

View File

@@ -0,0 +1,12 @@
{
"widget": "progress-line",
"icon": "sunny",
"descrColor": "",
"color": "",
"max": "100",
"background": "",
"stroke": "10",
"disabled": "",
"before": "",
"after": ""
}

View File

@@ -0,0 +1,11 @@
{
"widget": "progress-round",
"descrColor": "",
"max": "100",
"stroke": "20",
"color": "#45ccce",
"background": "#777",
"before": "",
"semicircle": "1",
"after": ""
}

8
data/widgets/select.json Normal file
View File

@@ -0,0 +1,8 @@
{
"widget": "select",
"options": [
"Выключен",
"Включен"
],
"status": 0
}

5
data/widgets/toggle.json Normal file
View File

@@ -0,0 +1,5 @@
{
"widget": "toggle",
"icon": "",
"iconOff": ""
}

View File

@@ -0,0 +1,5 @@
{
"widget": "toggle",
"icon": "sunny",
"iconOff": "moon"
}

64
data_ungzip/index.json Normal file
View File

@@ -0,0 +1,64 @@
{
"configs": [
"/config.live.json",
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "Конфигурация устройства",
"action": "/?set.device",
"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": "Конфигурация telegram",
"action": "/?set.telegram",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Утилиты",
"action": "/?set.utilities",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Настройки разработчика",
"action": "/?set.dev",
"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"
}
]
}

75
data_ungzip/set.dev.json Normal file
View File

@@ -0,0 +1,75 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Конфигурация",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Адрес сервера обновлений"
},
{
"type": "input",
"title": "ip address",
"name": "serverip-arg",
"state": "{{serverip}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?serverip=[[serverip-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Количество точек графика выгружаемое за раз"
},
{
"type": "input",
"title": "ip address",
"name": "graf-arg",
"state": "{{grafmax}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?grafmax=[[graf-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "reset-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Перезагрузить устройство",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]
}

262
data_ungzip/set.device.json Normal file
View File

@@ -0,0 +1,262 @@
{
"configs": [
"/config.setup.json",
"/config.option.json",
"/config.live.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "ID устройства: {{chipID}}"
},
{
"type": "h4",
"title": "IP адрес: {{ip}}"
},
{
"type": "h4",
"title": "Время: {{timenow}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Версия прошивки: {{firmware_version}}"
},
{
"type": "h4",
"title": "Версия файловой системы: 276"
},
{
"type": "h4",
"title": "{{signal}}"
},
{
"type": "h4",
"title": "Остаток памяти: {{freeBytes}}"
},
{
"type": "hr"
},
{
"type": "text",
"title": "{{warning1}}"
},
{
"type": "text",
"title": "{{warning2}}"
},
{
"type": "text",
"title": "{{warning3}}"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url1",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "Выберите элемент из списка<span class=\"caret\"></span>",
"/set?addItem=1": "1.Кнопка управляющая пином",
"/set?addItem=2": "2.Кнопка управляющая пином (с инверсией)",
"/set?addItem=3": "3.Кнопка виртуальная (не привязанная к пину, для использования в сценариях)",
"/set?addItem=4": "4.Кнопка физическая, чтение состояния пина (подключается провдами к устройству)",
"/set?addItem=5": "5.Широтно импульсная модуляция pwm",
"/set?addItem=6": "6.Окно ввода цифровых значений",
"/set?addItem=7": "7.Окно ввода времени",
"/set?addItem=8": "8.Окно вывода любого текста, предупреждения, цифры",
"/set?addItem=9": "9.Датчик аналоговый, чтение аналогового входа",
"/set?addItem=10": "10.Датчик температуры ds18b20",
"/set?addItem=11": "11.Датчик расстояния ультрозвуковой JSN-SR04T, HC-SR04, HY-SRF05",
"/set?addItem=12": "12.Датчик температуры и влажности DHT11",
"/set?addItem=13": "13.Датчик температуры и влажности DHT22, DHT33, DHT44, AM2302, RHT03",
"/set?addItem=14": "14.Датчик температуры, влажности и давления bme280",
"/set?addItem=15": "15.Датчик температуры и давления bmp280",
"/set?addItem=16": "16.Датчик качества воздуха ccs811",
"/set?addItem=17": "17.Создать импульсы через заданный промежуток времени (управление шд)",
"/set?addItem=18": "18.Таймер обратного отчета",
"/set?addItem=19": "19.Виджет для отображения информации полученной из uart, get-запроса, или по udp",
"/set?addItem=20": "20.Логгирование и вывод в график любой величины",
"/set?addItem=21": "21.Отобразить время работы устройства"
}
},
{
"type": "dropdown",
"name": "help-url2",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "Выберите пресет из списка<span class=\"caret\"></span>",
"/set?addPreset=1": "1.Термостат на основе ds18b20 с оповещением в телеграм",
"/set?addPreset=2": "2.Гистерезис термостат на основе ds18b20 с суточным расписанием",
"/set?addPreset=3": "3.Контроль влажности на основе DHT с оповещением в телеграм",
"/set?addPreset=4": "4.Включение выключение реле в заданное время",
"/set?addPreset=5": "5.Выключить все (пример работы сценариев)",
"/set?addPreset=6": "6.Включить кнопку на определенное время (пример работы таймера обратного отчета)",
"/set?addPreset=7": "7.Охранный датчик движения",
"/set?addPreset=8": "8.Датчик движения включающий свет с настраиваемой задержкой",
"/set?addPreset=9": "9.Управление светом с помощью выключателя и приложения"
}
},
{
"type": "hr"
},
{
"type": "csv",
"title": [
"checkbox",
"html",
"text",
"text",
"text",
"text",
"text"
],
"state": "s.conf.csv",
"style": "width:100%;",
"action": "/set?saveItems",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Удалить выбранные элементы",
"action": "javascript:{send_request(this,'/set?delChoosingItems');setTimeout(function(){location.href='/?set.device' ; }, 1000);}",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Удалить все",
"action": "/set?delAllItems",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку <b>СОХРАНИТЬ ТАБЛИЦУ</b>. Иногда, для корректной работы необходимо перезагрузить устройство после финального завершения его настройки</p></font></div>"
},
{
"type": "h2",
"title": "Сценарии"
},
{
"type": "checkbox",
"name": "scen",
"title": "Включить сценарии",
"action": "/set?scen=[[scen]]",
"state": "{{scen}}"
},
{
"type": "file",
"state": "s.scen.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?sceninit",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "MqttOut",
"title": "Передавать события другим устройствам",
"action": "/set?MqttOut=[[MqttOut]]",
"state": "{{MqttOut}}"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "MqttIn",
"title": "Принимать события с других устройств",
"action": "/set?MqttIn=[[MqttIn]]",
"state": "{{MqttIn}}"
},
{
"type": "hr"
},
{
"type": "button",
"title": "Синхронизировать сценарии на всех устройствах",
"action": "/set?scenMqtt",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "button",
"title": "Очистить графики и введенные данные",
"action": "/set?cleanlog",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Ручная настройка",
"action": "/?set.manual",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Инструкция к системе автоматизации",
"action": "https://github.com/IoTManagerProject/IoTManager/wiki",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Обновить прошивку устройства",
"action": "/check",
"response": "[[my-block]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "reset-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Перезагрузить устройство",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]
}

View File

@@ -0,0 +1,38 @@
{
"configs": [
"/config.setup.json",
"/config.option.json",
"/config.live.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "file",
"state": "s.conf.csv",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?saveItems",
"class": "btn btn-block btn-default"
},
{
"type": "file",
"state": "s.scen.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?sceninit",
"class": "btn btn-block btn-default"
}
]
}

217
data_ungzip/set.mqtt.json Normal file
View File

@@ -0,0 +1,217 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Основной брокер",
"style": "width:100%;float:left;"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "{{SetMQTTServerName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttServer-arg",
"state": "{{mqttServer}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPort}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPort-arg",
"state": "{{mqttPort}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPrefix}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPrefix-arg",
"state": "{{mqttPrefix}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTUserName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttUser-arg",
"state": "{{mqttUser}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPassword}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPass-arg",
"state": "{{mqttPass}}",
"style": "width:40%;float:right"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Резервный брокер",
"style": "width:100%;float:left;"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "{{SetMQTTServerName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttServer2-arg",
"state": "{{mqttServer2}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPort}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPort2-arg",
"state": "{{mqttPort2}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPrefix}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPrefix2-arg",
"state": "{{mqttPrefix2}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTUserName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttUser2-arg",
"state": "{{mqttUser2}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPassword}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPass2-arg",
"state": "{{mqttPass2}}",
"style": "width:40%;float:right"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "{{ButSave}}",
"style": "width:100%;float:left;",
"action": "set?mqttServer=[[mqttServer-arg]]&mqttPort=[[mqttPort-arg]]&mqttPrefix=[[mqttPrefix-arg]]&mqttUser=[[mqttUser-arg]]&mqttPass=[[mqttPass-arg]]&mqttServer2=[[mqttServer2-arg]]&mqttPort2=[[mqttPort2-arg]]&mqttPrefix2=[[mqttPrefix2-arg]]&mqttUser2=[[mqttUser2-arg]]&mqttPass2=[[mqttPass2-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "button",
"style": "width:100%;float:left;",
"title": "{{SetMQTTSendSettings}}",
"action": "set?mqttsend",
"class": "btn btn-block btn-default"
},
{
"type": "button",
"style": "width:100%;float:left;",
"title": "Проверить соединение с MQTT",
"action": "set?mqttcheck",
"response": "[[my-block]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"style": "width:100%;float:left;",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn1}}</p></font></div>"
},
{
"type": "text",
"style": "width:100%;float:left;",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn2}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "reset-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Перезагрузить устройство",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]
}

View File

@@ -0,0 +1,103 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "telegonof",
"title": "Включить телеграм",
"action": "/set?telegonof=[[telegonof]]",
"state": "{{telegonof}}"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "teleginput",
"title": "Включить прием входящих сообщений",
"action": "/set?teleginput=[[teleginput]]",
"state": "{{teleginput}}"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "autos",
"title": "Автоматически брать chat ID из входящих сообщений",
"action": "/set?autos=[[autos]]",
"state": "{{autos}}"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Telegram chat ID"
},
{
"type": "input",
"title": "",
"name": "chatId-arg",
"state": "{{chatId}}"
},
{
"type": "h4",
"title": "Telegram API token"
},
{
"type": "input",
"title": "",
"name": "telegramApi-arg",
"state": "{{telegramApi}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?telegramApi=[[telegramApi-arg]]&chatId=[[chatId-arg]]",
"class": "btn btn-block btn-default",
"style": "width:100%;display:inline"
},
{
"type": "hr"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>После настройки telegram перезагрузите устройство что бы изменения вступили в силу</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "reset-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Перезагрузить устройство",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]
}

96
data_ungzip/set.udp.json Normal file
View File

@@ -0,0 +1,96 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetUDPList}}"
},
{
"type": "hr"
},
{
"type": "csv",
"title": [
"html",
"html",
"html"
],
"state": "dev.csv",
"style": "width:100%;",
"class": "nan"
},
{
"type": "hr"
},
{
"type": "link",
"title": "{{SetUDPUpdateList}}",
"action": "/set?updatelist",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "{{SetUDPUpdatePage}}",
"action": "/set?updatepage",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn1}}</p></font></div>",
"style": "width:100%;float:left;"
},
{
"type": "h3",
"title": "{{SetUDPNameOfDev}}"
},
{
"type": "input",
"title": "{{SetUDPNameOfDev}}",
"name": "devname-arg",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "/set?devname=[[devname-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "udponoff",
"title": "{{SetUDPDateExchange}}",
"action": "/set?udponoff=[[udponoff]]",
"state": "{{udponoff}}"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn2}}</p></font></div>"
}
]
}

View File

@@ -0,0 +1,109 @@
{
"configs": [
"/config.live.json",
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Сканирование шины i2c"
},
{
"type": "h4",
"title": "{{i2c}}"
},
{
"type": "link",
"title": "Сканировать",
"action": "/set?i2c",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "UART"
},
{
"type": "checkbox",
"name": "uart",
"title": "Включить UART",
"action": "/set?uart=[[uart]]",
"state": "{{uart}}"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "uartEvents",
"title": "Включить отправку всех событий в UART",
"action": "/set?uartEvents=[[uartEvents]]",
"state": "{{uartEvents}}"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Скорость",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "uartS-arg",
"state": "{{uartS}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "Пин TX",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "uartTX-arg",
"state": "{{uartTX}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "Пин RX",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "uartRX-arg",
"state": "{{uartRX}}",
"style": "width:40%;float:right"
},
{
"type": "button",
"title": "{{ButSave}}",
"style": "width:100%;float:left;",
"action": "set?uartS=[[uartS-arg]]&uartTX=[[uartTX-arg]]&uartRX=[[uartRX-arg]]",
"class": "btn btn-block btn-default"
}
]
}

191
data_ungzip/set.wifi.json Normal file
View File

@@ -0,0 +1,191 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Конфигурация",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiNameOfDev}}"
},
{
"type": "input",
"title": "{{SetWiFiNameOfDev}}",
"name": "devname-arg",
"state": "{{name}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?devname=[[devname-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn1}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiRouterConnect}}"
},
{
"type": "input",
"title": "",
"name": "routerssid-arg",
"state": "{{routerssid}}"
},
{
"type": "password",
"title": "",
"name": "routerpass-arg",
"state": "{{routerpass}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"class": "btn btn-block btn-default",
"action": "set?routerssid=[[routerssid-arg]]&routerpass=[[routerpass-arg]]"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn2}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "blink",
"title": "Включить светодиод статуса подключения",
"action": "/set?blink=[[blink]]",
"state": "{{blink}}"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn5}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiAccessPoint}}"
},
{
"type": "input",
"title": "",
"name": "apssid-arg",
"state": "{{apssid}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "",
"name": "appass-arg",
"state": "{{appass}}",
"pattern": ".{8,20}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?apssid=[[apssid-arg]]&appass=[[appass-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn3}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiWeb}}"
},
{
"type": "input",
"title": "Логин",
"name": "weblogin-arg",
"state": "{{weblogin}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name": "webpass-arg",
"state": "{{webpass}}",
"pattern": ".{1,20}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?weblogin=[[weblogin-arg]]&webpass=[[webpass-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiTimeZone}}"
},
{
"type": "input",
"title": "",
"name": "timezone-arg",
"state": "{{timezone}}",
"pattern": ".{1,20}"
},
{
"type": "input",
"title": "",
"name": "ntp-arg",
"state": "{{ntp}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?timezone=[[timezone-arg]]&ntp=[[ntp-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn4}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "reset-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Перезагрузить устройство",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]
}

View File

@@ -1,197 +0,0 @@
/*
WiFiClientSecure.cpp - Client Secure class for ESP32
Copyright (c) 2016 Hristo Gochkov All right reserved.
Additions Copyright (C) 2017 Evandro Luis Copercini.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "WiFiClientSecure.h"
#include <lwip/sockets.h>
#include <lwip/netdb.h>
#include <errno.h>
#undef connect
#undef write
#undef read
WiFiClientSecure::WiFiClientSecure()
{
_connected = false;
sslclient = new sslclient_context;
ssl_init(sslclient);
sslclient->socket = -1;
_CA_cert = NULL;
_cert = NULL;
_private_key = NULL;
next = NULL;
}
WiFiClientSecure::WiFiClientSecure(int sock)
{
_connected = false;
sslclient = new sslclient_context;
ssl_init(sslclient);
sslclient->socket = sock;
if (sock >= 0) {
_connected = true;
}
_CA_cert = NULL;
_cert = NULL;
_private_key = NULL;
next = NULL;
}
WiFiClientSecure::~WiFiClientSecure()
{
stop();
}
WiFiClientSecure &WiFiClientSecure::operator=(const WiFiClientSecure &other)
{
stop();
sslclient->socket = other.sslclient->socket;
_connected = other._connected;
return *this;
}
void WiFiClientSecure::stop()
{
if (sslclient->socket >= 0) {
close(sslclient->socket);
sslclient->socket = -1;
_connected = false;
}
stop_ssl_socket(sslclient, _CA_cert, _cert, _private_key);
}
int WiFiClientSecure::connect(IPAddress ip, uint16_t port)
{
return connect(ip, port, _CA_cert, _cert, _private_key);
}
int WiFiClientSecure::connect(const char *host, uint16_t port)
{
return connect(host, port, _CA_cert, _cert, _private_key);
}
int WiFiClientSecure::connect(IPAddress ip, uint16_t port, const char *_CA_cert, const char *_cert, const char *_private_key)
{
int ret = start_ssl_client(sslclient, ip, port, _CA_cert, _cert, _private_key);
if (ret < 0) {
log_e("lwip_connect_r: %d", errno);
stop();
return 0;
}
_connected = true;
return 1;
}
int WiFiClientSecure::connect(const char *host, uint16_t port, const char *_CA_cert, const char *_cert, const char *_private_key)
{
struct hostent *server;
server = gethostbyname(host);
if (server == NULL) {
return 0;
}
IPAddress srv((const uint8_t *)(server->h_addr));
return connect(srv, port, _CA_cert, _cert, _private_key);
}
size_t WiFiClientSecure::write(uint8_t data)
{
return write(&data, 1);
}
int WiFiClientSecure::read()
{
uint8_t data = 0;
int res = read(&data, 1);
if (res < 0) {
return res;
}
return data;
}
size_t WiFiClientSecure::write(const uint8_t *buf, size_t size)
{
if (!_connected) {
return 0;
}
int res = send_ssl_data(sslclient, buf, size);
if (res < 0) {
stop();
res = 0;
}
return res;
}
int WiFiClientSecure::read(uint8_t *buf, size_t size)
{
if (!available()) {
return -1;
}
int res = get_ssl_receive(sslclient, buf, size);
if (res < 0) {
stop();
}
return res;
}
int WiFiClientSecure::available()
{
if (!_connected) {
return 0;
}
int res = data_to_read(sslclient);
if (res < 0 ) {
stop();
}
return res;
}
uint8_t WiFiClientSecure::connected()
{
uint8_t dummy = 0;
read(&dummy, 0);
return _connected;
}
void WiFiClientSecure::setCACert (const char *rootCA)
{
_CA_cert = rootCA;
}
void WiFiClientSecure::setCertificate (const char *client_ca)
{
_cert = client_ca;
}
void WiFiClientSecure::setPrivateKey (const char *private_key)
{
_private_key = private_key;
}

View File

@@ -1,92 +0,0 @@
/*
WiFiClientSecure.h - Base class that provides Client SSL to ESP32
Copyright (c) 2011 Adrian McEwen. All right reserved.
Additions Copyright (C) 2017 Evandro Luis Copercini.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef WiFiClientSecure_h
#define WiFiClientSecure_h
#include "Arduino.h"
#include "IPAddress.h"
#include <WiFi.h>
#include "ssl_client.h"
class WiFiClientSecure : public Client
{
protected:
bool _connected;
sslclient_context *sslclient;
const char *_CA_cert;
const char *_cert;
const char *_private_key;
public:
WiFiClientSecure *next;
WiFiClientSecure();
WiFiClientSecure(int socket);
~WiFiClientSecure();
int connect(IPAddress ip, uint16_t port);
int connect(const char *host, uint16_t port);
int connect(IPAddress ip, uint16_t port, const char *rootCABuff, const char *cli_cert, const char *cli_key);
int connect(const char *host, uint16_t port, const char *rootCABuff, const char *cli_cert, const char *cli_key);
size_t write(uint8_t data);
size_t write(const uint8_t *buf, size_t size);
int available();
int read();
int read(uint8_t *buf, size_t size);
int peek()
{
return 0;
}
void flush() {}
void stop();
uint8_t connected();
void setCACert(const char *rootCA);
void setCertificate(const char *client_ca);
void setPrivateKey (const char *private_key);
operator bool()
{
return connected();
}
WiFiClientSecure &operator=(const WiFiClientSecure &other);
bool operator==(const bool value)
{
return bool() == value;
}
bool operator!=(const bool value)
{
return bool() != value;
}
bool operator==(const WiFiClientSecure &);
bool operator!=(const WiFiClientSecure &rhs)
{
return !this->operator==(rhs);
};
int socket()
{
return sslclient->socket = -1;
}
//friend class WiFiServer;
using Print::write;
};
#endif /* _WIFICLIENT_H_ */

View File

@@ -1,261 +0,0 @@
/* Provide SSL/TLS functions to ESP32 with Arduino IDE
*
* Adapted from the ssl_client1 example of mbedtls.
*
* Original Copyright (C) 2006-2015, ARM Limited, All Rights Reserved, Apache 2.0 License.
* Additions Copyright (C) 2017 Evandro Luis Copercini, Apache 2.0 License.
*/
#include "Arduino.h"
#include <esp32-hal-log.h>
#include <lwip/sockets.h>
#include <lwip/err.h>
#include <lwip/sockets.h>
#include <lwip/sys.h>
#include <lwip/netdb.h>
#include "ssl_client.h"
const char *pers = "esp32-tls";
static int handle_error(int err)
{
#ifdef MBEDTLS_ERROR_C
char error_buf[100];
mbedtls_strerror(err, error_buf, 100);
log_e("%s", error_buf);
#endif
log_e("MbedTLS message code: %d", err);
return err;
}
void ssl_init(sslclient_context *ssl_client)
{
mbedtls_ssl_init(&ssl_client->ssl_ctx);
mbedtls_ssl_config_init(&ssl_client->ssl_conf);
mbedtls_ctr_drbg_init(&ssl_client->drbg_ctx);
}
int start_ssl_client(sslclient_context *ssl_client, uint32_t ipAddress, uint32_t port, const char *rootCABuff, const char *cli_cert, const char *cli_key)
{
char buf[512];
int ret, flags, timeout;
int enable = 1;
log_i("Free heap before TLS %u", xPortGetFreeHeapSize());
log_i("Starting socket");
ssl_client->socket = -1;
ssl_client->socket = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ssl_client->socket < 0) {
log_e("ERROR opening socket");
return ssl_client->socket;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = ipAddress;
serv_addr.sin_port = htons(port);
if (lwip_connect(ssl_client->socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
timeout = 30000;
lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
lwip_setsockopt(ssl_client->socket, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable));
lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable));
} else {
log_e("Connect to Server failed!");
return -1;
}
fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
log_i("Seeding the random number generator");
mbedtls_entropy_init(&ssl_client->entropy_ctx);
ret = mbedtls_ctr_drbg_seed(&ssl_client->drbg_ctx, mbedtls_entropy_func,
&ssl_client->entropy_ctx, (const unsigned char *) pers, strlen(pers));
if (ret < 0) {
return handle_error(ret);
}
log_i("Setting up the SSL/TLS structure...");
if ((ret = mbedtls_ssl_config_defaults(&ssl_client->ssl_conf,
MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
return handle_error(ret);
}
/* MBEDTLS_SSL_VERIFY_REQUIRED if a CA certificate is defined on Arduino IDE and
MBEDTLS_SSL_VERIFY_NONE if not.
*/
if (rootCABuff != NULL) {
log_i("Loading CA cert");
mbedtls_x509_crt_init(&ssl_client->ca_cert);
mbedtls_ssl_conf_authmode(&ssl_client->ssl_conf, MBEDTLS_SSL_VERIFY_REQUIRED);
ret = mbedtls_x509_crt_parse(&ssl_client->ca_cert, (const unsigned char *)rootCABuff, strlen(rootCABuff) + 1);
mbedtls_ssl_conf_ca_chain(&ssl_client->ssl_conf, &ssl_client->ca_cert, NULL);
//mbedtls_ssl_conf_verify(&ssl_client->ssl_ctx, my_verify, NULL );
if (ret < 0) {
return handle_error(ret);
}
} else {
mbedtls_ssl_conf_authmode(&ssl_client->ssl_conf, MBEDTLS_SSL_VERIFY_NONE);
log_i("WARNING: Use certificates for a more secure communication!");
}
if (cli_cert != NULL && cli_key != NULL) {
mbedtls_x509_crt_init(&ssl_client->client_cert);
mbedtls_pk_init(&ssl_client->client_key);
log_i("Loading CRT cert");
ret = mbedtls_x509_crt_parse(&ssl_client->client_cert, (const unsigned char *)cli_cert, strlen(cli_cert) + 1);
if (ret < 0) {
return handle_error(ret);
}
log_i("Loading private key");
ret = mbedtls_pk_parse_key(&ssl_client->client_key, (const unsigned char *)cli_key, strlen(cli_key) + 1, NULL, 0);
if (ret != 0) {
return handle_error(ret);
}
mbedtls_ssl_conf_own_cert(&ssl_client->ssl_conf, &ssl_client->client_cert, &ssl_client->client_key);
}
/*
// TODO: implement match CN verification
log_i("Setting hostname for TLS session...");
// Hostname set here should match CN in server certificate
if((ret = mbedtls_ssl_set_hostname(&ssl_client->ssl_ctx, host)) != 0)
{
return handle_error(ret);
}
*/
mbedtls_ssl_conf_rng(&ssl_client->ssl_conf, mbedtls_ctr_drbg_random, &ssl_client->drbg_ctx);
if ((ret = mbedtls_ssl_setup(&ssl_client->ssl_ctx, &ssl_client->ssl_conf)) != 0) {
return handle_error(ret);
}
mbedtls_ssl_set_bio(&ssl_client->ssl_ctx, &ssl_client->socket, mbedtls_net_send, mbedtls_net_recv, NULL );
log_i("Performing the SSL/TLS handshake...");
while ((ret = mbedtls_ssl_handshake(&ssl_client->ssl_ctx)) != 0) {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != -76) { //workaround for bug: https://github.com/espressif/esp-idf/issues/434
return handle_error(ret);
}
delay(10);
vPortYield();
}
if (cli_cert != NULL && cli_key != NULL) {
log_i("Protocol is %s Ciphersuite is %s", mbedtls_ssl_get_version(&ssl_client->ssl_ctx), mbedtls_ssl_get_ciphersuite(&ssl_client->ssl_ctx));
if ((ret = mbedtls_ssl_get_record_expansion(&ssl_client->ssl_ctx)) >= 0) {
log_i("Record expansion is %d", ret);
} else {
log_i("Record expansion is unknown (compression)");
}
}
log_i("Verifying peer X.509 certificate...");
if ((flags = mbedtls_ssl_get_verify_result(&ssl_client->ssl_ctx)) != 0) {
log_e("Failed to verify peer certificate!");
bzero(buf, sizeof(buf));
mbedtls_x509_crt_verify_info(buf, sizeof(buf), " ! ", flags);
log_e("verification info: %s", buf);
stop_ssl_socket(ssl_client, rootCABuff, cli_cert, cli_key); //It's not safe continue.
return handle_error(ret);
} else {
log_i("Certificate verified.");
}
log_i("Free heap after TLS %u", xPortGetFreeHeapSize());
return ssl_client->socket;
}
void stop_ssl_socket(sslclient_context *ssl_client, const char *rootCABuff, const char *cli_cert, const char *cli_key)
{
log_i("Cleaning SSL connection.");
if (ssl_client->socket >= 0) {
close(ssl_client->socket);
ssl_client->socket = -1;
}
mbedtls_ssl_free(&ssl_client->ssl_ctx);
mbedtls_ssl_config_free(&ssl_client->ssl_conf);
mbedtls_ctr_drbg_free(&ssl_client->drbg_ctx);
mbedtls_entropy_free(&ssl_client->entropy_ctx);
if (rootCABuff != NULL) {
mbedtls_x509_crt_free(&ssl_client->ca_cert);
}
if (cli_cert != NULL) {
mbedtls_x509_crt_free(&ssl_client->client_cert);
}
if (cli_key != NULL) {
mbedtls_pk_free(&ssl_client->client_key);
}
}
int data_to_read(sslclient_context *ssl_client)
{
int ret, res;
ret = mbedtls_ssl_read(&ssl_client->ssl_ctx, NULL, 0);
//log_e("RET: %i",ret); //for low level debug
res = mbedtls_ssl_get_bytes_avail(&ssl_client->ssl_ctx);
//log_e("RES: %i",res);
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret < 0 && ret != -76) {
return handle_error(ret);
}
return res;
}
int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, uint16_t len)
{
//log_i("Writing HTTP request..."); //for low level debug
int ret = -1;
while ((ret = mbedtls_ssl_write(&ssl_client->ssl_ctx, data, len)) <= 0) {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != -76) {
return handle_error(ret);
}
}
len = ret;
//log_i("%d bytes written", len); //for low level debug
return ret;
}
int get_ssl_receive(sslclient_context *ssl_client, uint8_t *data, int length)
{
//log_i( "Reading HTTP response..."); //for low level debug
int ret = -1;
ret = mbedtls_ssl_read(&ssl_client->ssl_ctx, data, length);
//log_i( "%d bytes readed", ret); //for low level debug
return ret;
}

View File

@@ -1,37 +0,0 @@
/* Provide SSL/TLS functions to ESP32 with Arduino IDE
* by Evandro Copercini - 2017 - Apache 2.0 License
*/
#ifndef ARD_SSL_H
#define ARD_SSL_H
#include "mbedtls/platform.h"
#include "mbedtls/net.h"
#include "mbedtls/debug.h"
#include "mbedtls/ssl.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/error.h"
typedef struct sslclient_context {
int socket;
mbedtls_net_context net_ctx;
mbedtls_ssl_context ssl_ctx;
mbedtls_ssl_config ssl_conf;
mbedtls_ctr_drbg_context drbg_ctx;
mbedtls_entropy_context entropy_ctx;
mbedtls_x509_crt ca_cert;
mbedtls_x509_crt client_cert;
mbedtls_pk_context client_key;
} sslclient_context;
void ssl_init(sslclient_context *ssl_client);
int start_ssl_client(sslclient_context *ssl_client, uint32_t ipAddress, uint32_t port, const char *rootCABuff, const char *cli_cert, const char *cli_key);
void stop_ssl_socket(sslclient_context *ssl_client, const char *rootCABuff, const char *cli_cert, const char *cli_key);
int data_to_read(sslclient_context *ssl_client);
int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, uint16_t len);
int get_ssl_receive(sslclient_context *ssl_client, uint8_t *data, int length);
#endif

Some files were not shown because too many files have changed in this diff Show More