505 Commits
2.1.1 ... 275

Author SHA1 Message Date
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
312 changed files with 20875 additions and 4794 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"
]
}

582
Cmd.ino
View File

@@ -1,582 +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("dhtPerception", dhtPerception);
sCmd.addCommand("dhtComfort", dhtComfort);
sCmd.addCommand("logging", logging);
sCmd.addCommand("inputDigit", inputDigit);
sCmd.addCommand("digitSet", digitSet);
sCmd.addCommand("inputTime", inputTime);
sCmd.addCommand("timeSet", timeSet);
sCmd.addCommand("timerStart", timerStart);
sCmd.addCommand("timerStop", timerStop);
sCmd.addCommand("text", text);
sCmd.addCommand("textSet", textSet);
sCmd.addCommand("mqtt", mqttOrderSend);
sCmd.addCommand("http", httpOrderSend);
sCmd.addCommand("push", pushControl);
handle_time_init();
//======новые виджеты 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 inputTime() {
String value_name = sCmd.next();
String number = value_name.substring(4);
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();
start_state.replace(":", ".");
jsonWrite(configJson, "timeSet" + number, start_state);
start_state.replace(".", ":");
createViget (viget_name, page_name, page_number, "vigets/viget.inputTime.json", "timeSet" + number);
}
void timeSet() {
String number = sCmd.next();
String value = sCmd.next();
value.replace(":", ".");
jsonWrite(configJson, "timeSet" + number, value);
value.replace(".", ":");
sendSTATUS("timeSet" + 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 handle_time_init() {
ts.add(TIME, 1000, [&](void*) {
String tmp = GetTimeWOsec();
tmp.replace(":", ".");
jsonWrite(configJson, "timenowSet", tmp);
eventGen ("timenowSet", "");
}, nullptr, true);
}
//====================================================================================================================================================
/*
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,72 +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);
}
}
void up_time() {
uint32_t ss = millis() / 1000;
uint32_t mm = ss / 60;
uint32_t hh = mm / 60;
uint32_t dd = hh / 24;
if (mm != 0) {
Serial.println(String(mm) + " min");
jsonWrite(configJson, "uptime", String(mm) + " min");
}
if (hh != 0) {
Serial.println(String(hh) + " hours");
jsonWrite(configJson, "uptime", String(hh) + " hours");
}
if (dd != 0) {
Serial.println(String(dd) + " days");
jsonWrite(configJson, "uptime", String(dd) + " days");
}
}

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,98 +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
if (param_name.indexOf("timenow") != -1){
param_name = param_name + "Set";
}
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);
}
if (value.indexOf("time") != -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,400 +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 pin_int = pin.toInt();
int analog_in;// = analogRead(pin_int);
#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 sensor_type = sCmd.next();
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
if (sensor_type == "DHT11") {
dht.setup(pin.toInt(), DHTesp::DHT11);
}
if (sensor_type == "DHT22") {
dht.setup(pin.toInt(), DHTesp::DHT22);
}
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtT");
ts.add(DHTT, dhtT_update_int + dht.getMinimumSamplingPeriod(), [&](void*) {
float value = 0;
static float 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 sensor_type = sCmd.next();
String pin = sCmd.next();
String viget_name = sCmd.next();
String page_name = sCmd.next();
String type = sCmd.next();
String page_number = sCmd.next();
if (sensor_type == "DHT11") {
dht.setup(pin.toInt(), DHTesp::DHT11);
}
if (sensor_type == "DHT22") {
dht.setup(pin.toInt(), DHTesp::DHT22);
}
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtH");
ts.add(DHTH, dhtH_update_int + dht.getMinimumSamplingPeriod(), [&](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 dhtPerception() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtPerception");
ts.add(DHTP, dhtPerception_update_int, [&](void*) {
byte value;
ComfortState cf;
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), false);
String final_line = perception(value);
jsonWrite(configJson, "dhtPerception", final_line);
eventGen ("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtPerception send date " + final_line);
}
}, nullptr, true);
}
String perception(byte value) {
if (value == 0) return "Сухой воздух";
if (value == 1) return "Комфортно";
if (value == 2) return "Уютно";
if (value == 3) return "Хорошо";
if (value == 4) return "Неудобно";
if (value == 5) return "Довольно неудобно";
if (value == 6) return "Очень неудобно";
if (value == 7) return "Сильно неудобно, полный звиздец";
}
void dhtComfort() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtComfort");
ts.add(DHTC, dhtComfort_update_int, [&](void*) {
float value;
ComfortState cf;
value = dht.getComfortRatio(cf, jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), false);
String comfortStatus;
switch (cf) {
case Comfort_OK:
comfortStatus = "Отлично";
break;
case Comfort_TooHot:
comfortStatus = "Очень жарко";
break;
case Comfort_TooCold:
comfortStatus = "Очень холодно";
break;
case Comfort_TooDry:
comfortStatus = "Очень сухо";
break;
case Comfort_TooHumid:
comfortStatus = "Очень влажно";
break;
case Comfort_HotAndHumid:
comfortStatus = "Жарко и влажно";
break;
case Comfort_HotAndDry:
comfortStatus = "Жарко и сухо";
break;
case Comfort_ColdAndHumid:
comfortStatus = "Холодно и влажно";
break;
case Comfort_ColdAndDry:
comfortStatus = "Холодно и сухо";
break;
default:
comfortStatus = "Неизвестно";
break;
};
String final_line = comfortStatus;
jsonWrite(configJson, "dhtComfort", final_line);
eventGen ("dhtComfort", "");
sendSTATUS("dhtComfort", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtComfort send date " + final_line);
}
}, nullptr, true);
}
void dhtDewPoint() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtPerception");
ts.add(DHTP, dhtPerception_update_int, [&](void*) {
byte value;
ComfortState cf;
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), false);
String final_line = perception(value);
jsonWrite(configJson, "dhtPerception", final_line);
eventGen ("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtPerception send date " + final_line);
}
}, 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);
}
}
}

108
Time.ino
View File

@@ -1,108 +0,0 @@
void Time_Init() {
server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("timezone")) {
jsonWrite(configSetup, "timezone", request->getParam("timezone")->value());
}
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
reconfigTime();
}
void reconfigTime() {
if (WiFi.status() == WL_CONNECTED) {
configTime(jsonRead(configSetup, "timezone").toInt() * 3600, 0, ntpServer);
int i = 0;
Serial.println("[i]Awaiting for time ");
#ifdef ESP32
struct tm timeinfo;
while (!getLocalTime(&timeinfo) && i <= 4) {
Serial.print(".");
i++;
delay(1000);
}
#endif
#ifdef ESP8266
// while (!time(nullptr) && i < 4) {
// Serial.print(".");
// i++;
delay(2000);
// }
#endif
Serial.print("Time = ");
Serial.print(GetDataDigital());
Serial.print(" ");
Serial.println(GetTime());
} else {
Serial.println("[E] Get time impossible, no wifi connection");
}
}
// Получение текущего времени
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

162
WiFi.ino
View File

@@ -1,162 +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.print("[V] IP address: ");
Serial.print(WiFi.localIP());
Serial.println("");
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,148 +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": "h4",
"title": "Uptime: {{uptime}}"
},
{
"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,29 +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
inputDigit digit1 При#скольки#включить? Датчики 10 7
inputDigit digit2 При#скольки#выключить? Датчики 0 8
button 4 na Нагреватель Датчики 0 9
//dallas 2 Водонагреватель,#t°C Датчики any-data 10
dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 11
dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 12
dhtComfort Степень#комфорта: Датчики 12
dhtPerception Восприятие: Датчики 13
//level Вода#в#баке,#% Датчики any-data 125 20 14
//-------------------------------------------------------------------------------------------------
button 5 na Вкл#обратный#таймер Таймеры 0 15
inputDigit digit3 Через#сколько#секунд#включить? Таймеры 5 16
button 6 na Включится#по#таймеру Таймеры 0 17
inputTime time1 Во#сколько#включить? Таймеры 20.30 18
button 7 5 Включится#по#таймеру Таймеры 0 19
//-------------------------------------------------------------------------------------------------
switch 1 0 20
textSet 1 неопределено
text 1 Квартира Двери 22
//-------------------------------------------------------------------------------------------------
button 8 scenario Вкл#выкл#все#сценарии Сценарии 1 23
button 9 line1,line2, Вкл#выкл#выбранные#сценарии Сценарии 1 24

View File

@@ -1,32 +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 < digit2
buttonSet 4 0
end
button5 = 1
timerStart 1 digit3 sec
end
timer1 = 0
buttonSet 6 1
end
timenow = time1
buttonSet 7 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];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,149 +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": "h2",
"title": "Временная зона"
},
{
"type": "input",
"title": "Логин",
"name":"time-zone",
"state": "{{timezone}}",
"pattern": ".{1,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "timeZone?timezone=[[time-zone]]",
"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,12 +0,0 @@
{
"widget" : "progress-line",
"icon" : "sunny",
"descrColor" : "",
"color" : "",
"max" : "100",
"background" : "",
"stroke" : "10",
"disabled" : "",
"before" : "",
"after" : ""
}

View File

@@ -1,11 +0,0 @@
{
"widget" : "progress-round",
"descrColor" : "",
"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,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": "Версия файловой системы: 275"
},
{
"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

BIN
doc/calculator.xlsx Normal file

Binary file not shown.

24
doc/eagle.txt Normal file
View File

@@ -0,0 +1,24 @@
eagle.flash.512k0.ld 512K (no SPIFFS)
eagle.flash.512k64.ld 512K (64K SPIFFS)
eagle.flash.512k128.ld 512K (128K SPIFFS)
eagle.flash.1m0.ld 1M (no SPIFFS)
eagle.flash.1m64.ld 1M (64K SPIFFS)
eagle.flash.1m128.ld 1M (128K SPIFFS)
eagle.flash.1m144.ld 1M (144K SPIFFS)
eagle.flash.1m160.ld 1M (160K SPIFFS)
eagle.flash.1m192.ld 1M (192K SPIFFS)
eagle.flash.1m256.ld 1M (256K SPIFFS)
eagle.flash.1m512.ld 1M (512K SPIFFS)
eagle.flash.2m.ld 2M (1M SPIFFS)
eagle.flash.4m1m.ld 4M (1M SPIFFS)
eagle.flash.4m2m.ld 4M (2M SPIFFS)
eagle.flash.4m.ld 4M (3M SPIFFS)
eagle.flash.8m.ld 8M (7M SPIFFS)
eagle.flash.16m.ld 16M (15M SPIFFS)
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x1F0000,
app1, app, ota_1, 0x200000, 0x1F0000,
spiffs, data, spiffs, 0x3F0000,0x10000,

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