139 Commits
267 ... 278

Author SHA1 Message Date
IoTManagerProject
0b5d7236aa Merge pull request #77 from IoTManagerProject/beta
Исправил баг с обновлением по воздуху
2021-01-05 17:07:21 +01:00
Dmitry Borisenko
bce8723ecf Исправил баг с обновлением по воздуху 2021-01-05 16:53:22 +01:00
Dmitry Borisenko
b7fcedb6c3 Merge pull request #76 from IoTManagerProject/beta
Beta
2021-01-05 15:11:51 +01:00
Dmitry Borisenko
54cb92d2bb esp32 adc bug 2021-01-05 14:57:01 +01:00
Dmitry Borisenko
6902d57be2 Исправил Uptime и ccs811 2021-01-05 12:17:48 +01:00
Dmitry Borisenko
57c12e43f1 Merge pull request #75 from IoTManagerProject/beta
ccs811 полная интеграция
2021-01-05 03:54:48 +01:00
Dmitry Borisenko
c72af8650b ccs811 полная интеграция 2021-01-05 03:48:52 +01:00
Dmitry Borisenko
a68dfb37fc Merge pull request #74 from IoTManagerProject/beta
Beta
2021-01-04 16:57:58 +01:00
Dmitry Borisenko
3cdd8fc2b9 Отремантировал uptime 2021-01-04 16:56:20 +01:00
Dmitry Borisenko
a4ae02736c Добавил сенсор ccs811 2021-01-04 01:49:57 +01:00
Dmitry Borisenko
e822414187 Uptime 2021-01-04 01:17:11 +01:00
Dmitry Borisenko
4e630fd0b0 275 2021-01-04 01:02:54 +01:00
Dmitry Borisenko
988fb94c52 Merge pull request #73 from IoTManagerProject/beta
Beta
2021-01-04 00:51:56 +01:00
Dmitry Borisenko
9906fade9a cleaning 2021-01-04 00:51:25 +01:00
Dmitry Borisenko
4cf68f417f readme 2021-01-04 00:49:35 +01:00
Dmitry Borisenko
05f726e378 doc 2021-01-04 00:48:44 +01:00
Dmitry Borisenko
75a7d4e16a Merge pull request #72 from IoTManagerProject/LastStableVersion
pr
2021-01-04 00:44:25 +01:00
Dmitry Borisenko
691126a2d0 Merge pull request #71 from IoTManagerProject/beta
Beta
2021-01-04 00:40:53 +01:00
Dmitry Borisenko
5eb3c6d3a3 first 2021-01-04 00:39:35 +01:00
Dmitry Borisenko
bf9855aa60 remoove all 2021-01-04 00:33:32 +01:00
Dmitry Borisenko
50c616c61b Merge branch 'LastStableVersion' of https://github.com/IoTManagerProject/IoTManager into LastStableVersion 2021-01-04 00:31:42 +01:00
Dmitry Borisenko
2d2148d2c4 Поддержка нескольких DHT 2021-01-03 19:44:09 +01:00
Dmitry Borisenko
6ae001232d telegram 2021-01-03 02:14:12 +01:00
Dmitry Borisenko
965b09cc78 Доп 2021-01-03 01:20:38 +01:00
Dmitry Borisenko
a8534c4a73 Партии выгрузки в логгировании 2021-01-03 00:33:04 +01:00
Dmitry Borisenko
401564a778 Проверка дробей и отрицательных чисел 2021-01-02 13:07:45 +01:00
Dmitry Borisenko
673bfe6b6b переписано логгирование 2021-01-02 04:27:19 +01:00
Dmitry Borisenko
f8d574d15a change 2021-01-02 03:28:43 +01:00
Dmitry Borisenko
e39806e0ac попытка использовать альтнрнативный метод поиска 2021-01-02 03:26:16 +01:00
Dmitry Borisenko
0fa7876b80 исправлена опечатка 2020-12-30 17:02:11 +01:00
Dmitry Borisenko
7eac8dde3b Возможность быстрого переключения прошивок 2020-12-30 16:56:26 +01:00
Dmitry Borisenko
746ecc9c7a некоторые изменения 2020-12-30 14:04:42 +01:00
Dmitry Borisenko
dad08c1686 Версия для esp32 2020-12-30 13:48:29 +01:00
Dmitry Borisenko
e0bb6d58e8 исправлена проблема с дробными числами 2020-12-27 01:26:19 +01:00
Dmitry Borisenko
a30dc04055 274 2020-12-26 23:24:37 +01:00
Dmitry Borisenko
454922b8b4 get mqtt remote 2020-12-26 23:10:07 +01:00
Dmitry Borisenko
02c363f1d6 dht preset 2020-12-26 16:31:10 +01:00
Dmitry Borisenko
d20f30d5e9 fix dht 2020-12-26 16:28:58 +01:00
Dmitry Borisenko
ddc3a92c15 переписан полностью датчик bme и bmp 2020-12-26 01:22:43 +01:00
Dmitry Borisenko
e33ec57a1e fixed dht22 bug 2020-12-25 22:07:27 +01:00
Dmitry Borisenko
7e4f852bf1 cleaning 2020-12-24 02:01:58 +01:00
Dmitry Borisenko
1a097ff2b7 change table 2020-12-24 01:58:14 +01:00
Dmitry Borisenko
99134cb6fd dht working 2020-12-24 01:41:15 +01:00
Dmitry Borisenko
5955743426 dht пока без коробки 2020-12-24 01:05:54 +01:00
Dmitry Borisenko
5c664594af in progress not working version!!! 2020-12-22 12:38:05 +01:00
Dmitry Borisenko
0df63ba642 последние изменения 2020-12-21 20:51:59 +01:00
Dmitry Borisenko
d9672d17b0 переписан dht 2020-12-21 01:46:11 +01:00
Dmitry Borisenko
c5772f8451 баг аналогового сенсора исправлен 2020-12-20 17:44:40 +01:00
Dmitry Borisenko
1df87f8986 устранен баг телеграма, баг сценариев.... 2020-12-20 17:08:16 +01:00
Dmitry Borisenko
3417d0c915 1мб 4мб переключение версий 2020-12-20 14:11:59 +01:00
Dmitry Borisenko
f4e917afba Merge pull request #69 from IoTManagerProject/alpha
mqtt reserve #2
2020-12-20 13:04:06 +01:00
Yuri Trikoz
2aa3b56e85 #SPIFFS 2020-12-20 01:24:08 +03:00
Yuri Trikoz
e60d5eb62f mqtt reserve #2 2020-12-19 20:12:31 +03:00
Dmitry Borisenko
6573b2c145 удалил little fs для esp32 из lib 2020-12-19 15:27:45 +01:00
Dmitry Borisenko
017c6f6234 размер страницы и размер блока 2020-12-19 14:18:22 +01:00
Dmitry Borisenko
305b3f32d6 1мб версия для теста с пресетами и с edit 2020-12-19 14:06:58 +01:00
Dmitry Borisenko
5280a8914f some 2020-12-19 13:51:53 +01:00
Dmitry Borisenko
cab8aff562 fixed var type 2020-12-19 13:39:04 +01:00
Dmitry Borisenko
4711af6589 fixed 2020-12-19 13:31:38 +01:00
Dmitry Borisenko
fe029a624c some 2020-12-19 00:10:45 +01:00
Dmitry Borisenko
17162a2d85 memory remain 2020-12-18 23:52:35 +01:00
Dmitry Borisenko
433d28a785 wrong pin error warning added 2020-12-18 23:20:42 +01:00
Dmitry Borisenko
19f728e209 prime and sec broker 2020-12-18 21:48:06 +01:00
Dmitry Borisenko
07b75afb94 Merge pull request #68 from ytrikoz/beta
FS info
2020-12-18 20:26:33 +01:00
Dmitry Borisenko
916116bbc4 Merge branch 'beta' into beta 2020-12-18 20:26:23 +01:00
Dmitry Borisenko
9ac72f14e0 telegram 2020-12-18 14:28:31 +01:00
Yuri Trikoz
eddb2eb289 Mqtt Reserve 2020-12-18 13:43:13 +03:00
Yuri Trikoz
5f9d9ec48e Use system defined led 2020-12-18 04:44:23 +03:00
Yuri Trikoz
0d6d1a7f6c FSInfo 2020-12-18 04:39:44 +03:00
Dmitry Borisenko
a467117df9 change to 4mb 2020-12-18 00:53:39 +01:00
Dmitry Borisenko
0bb028229a ziped data 2020-12-17 22:59:44 +01:00
Dmitry Borisenko
ce383fe7fe global change 1 mb working version 2020-12-17 22:48:20 +01:00
Dmitry Borisenko
2e240def88 working version 2020-12-17 02:01:12 +01:00
Dmitry Borisenko
245475ae99 full change of constuction 2020-12-17 01:29:30 +01:00
Yuri Trikoz
c4df80e904 Merge pull request #1 from IoTManagerProject/beta
Beta
2020-12-16 21:37:52 +03:00
Dmitry Borisenko
d5826b7038 1mb 2020-12-16 19:30:39 +01:00
Dmitry Borisenko
8f08459a5a 1mb 2020-12-16 19:28:44 +01:00
Dmitry Borisenko
2fc82c3311 Merge pull request #67 from ytrikoz/beta
pemz
2020-12-16 18:52:36 +01:00
Dmitry Borisenko
078c4389b5 1 mb compiling version 2020-12-16 13:59:01 +01:00
Dmitry Borisenko
9934690d0a some 2020-12-15 22:10:40 +01:00
Yuri Trikoz
b8a9f9b6b3 pemz 2020-12-13 02:23:04 +03:00
Dmitry Borisenko
9fd88ffae1 4mb build version 2020-12-13 01:06:08 +03:00
Dmitry Borisenko
9a7f6c5b05 4 mb version 2020-12-13 00:59:56 +03:00
Dmitry Borisenko
ef01d08053 Merge pull request #65 from ytrikoz/LastStableVersion
Remote build changes 1/x
2020-12-13 00:54:21 +03:00
Dmitry Borisenko
9a8061a84d Merge pull request #66 from saloid/patch-1
Fix typo in readme
2020-12-13 00:53:40 +03:00
Dmitry Borisenko
e9820efff9 1_mb_final 2020-12-12 01:14:31 +03:00
Dmitry Borisenko
b2385bbc4c 1 мб version 2020-12-12 00:43:36 +03:00
Dmitry Borisenko
3e5d9770a1 272 2020-12-11 17:37:29 +03:00
Dmitry Borisenko
71468599fe stability of san 2020-12-11 03:21:50 +03:00
Dmitry Borisenko
71c8fec27b bug fixed 2020-12-10 20:19:21 +03:00
Dmitry Borisenko
f487a691fb uart working version 2020-12-10 19:12:15 +03:00
Dmitry Borisenko
d17112b3ff uart 2020-12-10 05:13:09 +03:00
Dmitry Borisenko
81866043bc bug with virtual button fixed 2020-12-10 02:11:47 +03:00
Dmitry Borisenko
253a9a5ae5 Some more 2020-12-09 04:35:39 +03:00
Dmitry Borisenko
5c774c29bd some 2020-12-09 04:12:46 +03:00
Dmitry Borisenko
6205f6959c Gisteresis termostat 2020-12-09 04:08:36 +03:00
Dmitry Borisenko
6e44f76385 UART working condition 2020-12-06 02:08:37 +03:00
Dmitry Borisenko
8dd4d8491c UART in Progress 2020-12-06 00:59:47 +03:00
Dmitry Borisenko
4436991205 esp32 uart 2020-12-06 00:40:48 +03:00
Dmitry Borisenko
d15cf619f1 Fixed Ultrasonic, Start uart 2020-12-06 00:34:30 +03:00
Dmytro
9a2bdb54d1 Fix typo in readme 2020-12-02 22:30:21 +02:00
Dmitry Borisenko
7043855e3d randomSeed 2020-12-02 05:05:16 +03:00
Dmitry Borisenko
49f11841be Telegram 2020-12-02 04:50:29 +03:00
Dmitry Borisenko
e88718ada0 268 Single Scenario changed to MQTT source 2020-12-02 04:12:10 +03:00
Yuri Trikoz
0fc7cccda7 #remote build 2020-12-01 21:40:33 +03:00
Dmitry Borisenko
38924e4ed3 Single network space for scenario added 2020-11-21 06:03:02 +03:00
Dmitry Borisenko
70c34d3d8d Cleaning and optimization 2020-11-19 04:14:52 +03:00
Dmitry Borisenko
4f9763334b fix some more bugs 2020-11-18 13:29:53 +03:00
Dmitry Borisenko
b2e9d90686 timer bug fully fixed 2020-11-18 13:18:08 +03:00
Dmitry Borisenko
ceb516ddbe add count down timer 2020-11-18 03:25:05 +03:00
Dmitry Borisenko
06df1f17b6 Progress of renew of class 2020-11-17 01:01:42 +03:00
Dmitry Borisenko
a20c2b8564 Save date to flash added 2020-11-16 18:47:09 +03:00
Dmitry Borisenko
3c3a4a33ca RSSI to web interface added 2020-11-16 13:58:26 +03:00
Dmitry Borisenko
28c24562bc pic 2020-11-16 00:51:03 +03:00
Dmitry Borisenko
d0ef8ec82e new 2020-11-15 22:57:21 +03:00
Dmitry Borisenko
452110225d new 2020-11-15 22:55:21 +03:00
Dmitry Borisenko
bdc9cd9b31 123 2020-11-15 22:49:27 +03:00
Dmitry Borisenko
6cd60c9eef h 2020-11-15 22:48:17 +03:00
Dmitry Borisenko
3e9da81b8c p 2020-11-15 22:40:46 +03:00
Dmitry Borisenko
2e73eac2f1 13 2020-11-15 22:39:38 +03:00
Dmitry Borisenko
6f45148d75 cleaning 2020-11-15 03:09:21 +03:00
Dmitry Borisenko
3766a744f4 bug fixed with scenario init 2020-11-15 02:52:24 +03:00
Dmitry Borisenko
94d93d3be6 Working version 2020-11-15 02:46:27 +03:00
Dmitry Borisenko
d6aab0cf94 Big changes. Compiling version 2020-11-15 01:44:25 +03:00
Dmitry Borisenko
6135f3322e some 2020-11-14 23:00:09 +03:00
Dmitry Borisenko
b53e7d15a4 pic 2020-11-14 04:21:24 +03:00
Dmitry Borisenko
7daa49083b pic 2020-11-14 04:06:59 +03:00
Dmitry Borisenko
68dc9c7bb3 pic 2020-11-14 04:00:02 +03:00
Dmitry Borisenko
b5cf1fd347 pic 2020-11-14 03:57:39 +03:00
Dmitry Borisenko
22f44afa1e pic 2020-11-14 03:49:44 +03:00
Dmitry Borisenko
964abc9f0c pic 2020-11-14 03:45:38 +03:00
Dmitry Borisenko
dfae6ebf09 Add files via upload 2020-11-14 03:39:48 +03:00
Dmitry Borisenko
50ad50efb2 ButtonOut changed (not working version) 2020-11-13 17:13:50 +03:00
Dmitry Borisenko
96f160fc88 editor changed 2020-11-13 02:58:45 +03:00
Dmitry Borisenko
8bfba7ab4a some change 2020-11-08 18:36:36 +03:00
Dmitry Borisenko
6d52a181f0 udp changed for Vadim 2020-11-08 18:27:01 +03:00
Dmitry Borisenko
044dd6294e Update README.md 2020-11-08 03:09:48 +03:00
Dmitry Borisenko
c2baece068 Update README.md 2020-11-08 03:09:17 +03:00
Dmitry Borisenko
9d6ec18bb2 add one more preset 2020-11-07 02:51:44 +03:00
310 changed files with 4350 additions and 18260 deletions

49
.vscode/settings.json vendored
View File

@@ -1,49 +0,0 @@
{
"files.associations": {
"*.tcc": "cpp",
"string": "cpp",
"functional": "cpp",
"array": "cpp",
"atomic": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"ostream": "cpp",
"numeric": "cpp",
"ratio": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"system_error": "cpp",
"cinttypes": "cpp",
"regex": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"typeinfo": "cpp"
},
"cmake.configureOnOpen": true
}

View File

@@ -1,5 +1,6 @@
# IoTManager
Это модульная система беспроводной автоматизации на базе ESP32/ESP8266 микроконтроллеров и приложения IoT Manager.
Это модульная система беспроводной автоматизации на базе 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,2 +0,0 @@
/*.js.gz
/.exclude.files

View File

@@ -3,22 +3,35 @@
"chipID": "",
"apssid": "IoTmanager",
"appass": "",
"routerssid": "VOLODYA",
"routerpass": "BELCHENKO",
"routerssid": "rise",
"routerpass": "hostel3333",
"timezone": 1,
"ntp": "pool.ntp.org",
"mqttServer": "m12.cloudmqtt.com",
"mqttPort": 14053,
"mqttServer": "91.204.228.124",
"mqttPort": 1883,
"mqttPrefix": "/iotTest",
"mqttUser": "lbscvzuj",
"mqttPass": "bLxlveOgaF8F",
"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",
"udponoff": "1",
"blink": "1",
"MqttIn": "0",
"MqttOut": "0",
"blink": "0",
"oneWirePin": "2",
"serverip": "http://206.189.49.244"
"serverip": "http://206.189.49.244",
"uart": "0",
"uartS": "9600",
"uartTX": "12",
"uartRX": "13",
"grafmax": "0"
}

View File

@@ -1,658 +0,0 @@
<!--This is the plain html source of the hex encoded Editor-Page embedded in SPIFFSEditor.cpp -->
<!DOCTYPE html>
<html lang="en">
<head>
<title>FS Editor</title>
<style type="text/css" media="screen">
.cm {
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;
}
.cm ul {
list-style: none;
top: 0;
left: 0;
margin: 0;
padding: 0;
}
.cm li {
position: relative;
min-width: 60px;
cursor: pointer;
}
.cm span {
color: #444;
display: inline-block;
padding: 6px;
}
.cm li:hover {
background: #444;
}
.cm li:hover span {
color: #EEE;
}
.tvu ul,
.tvu li {
padding: 0;
margin: 0;
list-style: none;
}
.tvu input {
position: absolute;
opacity: 0;
}
.tvu {
font: normal 12px Verdana, Arial, Sans-serif;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
color: #444;
line-height: 16px;
}
.tvu span {
margin-bottom: 5px;
padding: 0 0 0 18px;
cursor: pointer;
display: inline-block;
height: 16px;
vertical-align: middle;
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC') no-repeat;
background-position: 0px 0px;
}
.tvu span:hover {
text-decoration: underline;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
.tvu {
-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: 160px;
padding: 8px;
}
#editor,
#preview {
position: absolute;
top: 28px;
right: 0;
bottom: 0;
left: 160px;
border-left: 1px solid #EEE;
}
#preview {
background-color: #EEE;
padding: 5px;
}
#loader {
position: absolute;
top: 36%;
right: 40%;
}
.loader {
z-index: 10000;
border: 8px solid #b5b5b5;
/* Grey */
border-top: 8px solid #3498db;
/* Blue */
border-bottom: 8px solid #3498db;
/* Blue */
border-radius: 50%;
width: 240px;
height: 240px;
animation: spin 2s linear infinite;
display: none;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
<script>
if (typeof XMLHttpRequest === "undefined") {
XMLHttpRequest = function () {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) { }
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) { }
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { }
throw new Error("This browser does not support XMLHttpRequest.");
};
}
function ge(a) {
return document.getElementById(a);
}
function ce(a) {
return document.createElement(a);
}
function sortByKey(array, key) {
return array.sort(function (a, b) {
var x = a[key]; var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
}
var QueuedRequester = function () {
this.queue = [];
this.running = false;
this.xmlhttp = null;
}
QueuedRequester.prototype = {
_request: function (req) {
this.running = true;
if (!req instanceof Object) return;
var that = this;
function ajaxCb(x, d) {
return function () {
if (x.readyState == 4) {
ge("loader").style.display = "none";
d.callback(x.status, x.responseText);
if (that.queue.length === 0) that.running = false;
if (that.running) that._request(that.queue.shift());
}
}
}
ge("loader").style.display = "block";
var p = "";
if (req.params instanceof FormData) {
p = req.params;
} else if (req.params instanceof Object) {
for (var key in req.params) {
if (p === "")
p += (req.method === "GET") ? "?" : "";
else
p += "&";
p += encodeURIComponent(key) + "=" + encodeURIComponent(req.params[key]);
};
}
this.xmlhttp = new XMLHttpRequest();
this.xmlhttp.onreadystatechange = ajaxCb(this.xmlhttp, req);
if (req.method === "GET") {
this.xmlhttp.open(req.method, req.url + p, true);
this.xmlhttp.send();
} else {
this.xmlhttp.open(req.method, req.url, true);
if (p instanceof String)
this.xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
this.xmlhttp.send(p);
}
},
stop: function () {
if (this.running) this.running = false;
if (this.xmlhttp && this.xmlhttp.readyState < 4) {
this.xmlhttp.abort();
}
},
add: function (method, url, params, callback) {
this.queue.push({ url: url, method: method, params: params, callback: callback });
if (!this.running) {
this._request(this.queue.shift());
}
}
}
var requests = new QueuedRequester();
function createFileUploader(element, tree, editor) {
var xmlHttp;
var refresh = ce("button");
refresh.innerHTML = 'Refresh List';
ge(element).appendChild(refresh);
var input = ce("input");
input.type = "file";
input.multiple = false;
input.name = "data";
input.id = "upload-select";
ge(element).appendChild(input);
var path = ce("input");
path.id = "upload-path";
path.type = "text";
path.name = "path";
path.defaultValue = "/";
ge(element).appendChild(path);
var button = ce("button");
button.innerHTML = 'Upload';
ge(element).appendChild(button);
var mkfile = ce("button");
mkfile.innerHTML = 'Create';
ge(element).appendChild(mkfile);
var filename = ce("input");
filename.id = "editor-filename";
filename.type = "text";
filename.disabled = true;
filename.size = 20;
ge(element).appendChild(filename);
var savefile = ce("button");
savefile.innerHTML = ' Save ';
ge(element).appendChild(savefile);
function httpPostProcessRequest(status, responseText) {
if (status != 200)
alert("ERROR[" + status + "]: " + responseText);
else
tree.refreshPath(path.value);
}
function createPath(p) {
var formData = new FormData();
formData.append("path", p);
requests.add("PUT", "/edit", formData, httpPostProcessRequest);
}
mkfile.onclick = function (e) {
createPath(path.value);
editor.loadUrl(path.value);
path.value = "/";
};
savefile.onclick = function (e) {
editor.execCommand('saveCommand');
};
refresh.onclick = function (e) {
tree.refreshPath(path.value);
};
button.onclick = function (e) {
if (input.files.length === 0) {
return;
}
var formData = new FormData();
formData.append("data", input.files[0], path.value);
requests.add("POST", "/edit", formData, httpPostProcessRequest);
var uploadPath = ge("upload-path");
uploadPath.value = "/";
var uploadSelect = ge("upload-select");
uploadSelect.value = "";
};
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) {
filename = name;
}
path.value = "/" + filename + "." + ext;
};
}
function createTree(element, editor) {
var preview = ge("preview");
var treeRoot = ce("div");
treeRoot.className = "tvu";
ge(element).appendChild(treeRoot);
function loadDownload(path) {
ge('download-frame').src = "/edit?download=" + path;
}
function loadPreview(path) {
var edfname = ge("editor-filename");
edfname.value = path;
ge("editor").style.display = "none";
preview.style.display = "block";
preview.innerHTML = '<img src="/edit?edit=' + path + '&_cb=' + Date.now() + '" style="max-width:100%; max-height:100%; margin:auto; display:block;" />';
}
function fillFileMenu(el, path) {
var list = ce("ul");
el.appendChild(list);
var action = ce("li");
list.appendChild(action);
if (isImageFile(path)) {
action.innerHTML = "<span>Preview</span>";
action.onclick = function (e) {
loadPreview(path);
if (document.body.getElementsByClassName('cm').length > 0) document.body.removeChild(el);
};
} else if (isTextFile(path)) {
action.innerHTML = "<span>Edit</span>";
action.onclick = function (e) {
editor.loadUrl(path);
if (document.body.getElementsByClassName('cm').length > 0) document.body.removeChild(el);
};
}
var download = ce("li");
list.appendChild(download);
download.innerHTML = "<span>Download</span>";
download.onclick = function (e) {
loadDownload(path);
if (document.body.getElementsByClassName('cm').length > 0) document.body.removeChild(el);
};
var delFile = ce("li");
list.appendChild(delFile);
delFile.innerHTML = "<span>Delete</span>";
delFile.onclick = function (e) {
httpDelete(path);
if (document.body.getElementsByClassName('cm').length > 0) document.body.removeChild(el);
};
}
function showContextMenu(event, path, isfile) {
var divContext = ce("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 = event.clientX + scrollLeft;
var top = event.clientY + scrollTop;
divContext.className = 'cm';
divContext.style.display = 'block';
divContext.style.left = left + 'px';
divContext.style.top = top + 'px';
fillFileMenu(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('cm').length > 0) document.body.removeChild(divContext);
}
};
}
function createTreeLeaf(path, name, size) {
var leaf = ce("li");
leaf.id = name;
var label = ce("span");
label.innerHTML = name;
leaf.appendChild(label);
leaf.onclick = function (e) {
if (isTextFile(leaf.id.toLowerCase())) {
editor.loadUrl(leaf.id);
} else if (isImageFile(leaf.id.toLowerCase())) {
loadPreview(leaf.id);
}
};
leaf.oncontextmenu = function (e) {
e.preventDefault();
e.stopPropagation();
showContextMenu(e, leaf.id, true);
};
return leaf;
}
function addList(parent, path, items) {
sortByKey(items, 'name');
var list = ce("ul");
parent.appendChild(list);
var ll = items.length;
for (var i = 0; i < ll; i++) {
if (items[i].type === "file")
list.appendChild(createTreeLeaf(path, items[i].name, items[i].size));
}
}
function isTextFile(path) {
var ext = /(?:\.([^.]+))?$/.exec(path)[1];
if (typeof ext !== undefined) {
switch (ext) {
case "cnv":
case "txt":
case "htm":
case "html":
case "js":
case "css":
case "xml":
case "json":
case "conf":
case "ini":
return true;
}
}
return false;
}
function isImageFile(path) {
var ext = /(?:\.([^.]+))?$/.exec(path)[1];
if (typeof ext !== undefined) {
switch (ext) {
case "png":
case "jpg":
case "jpeg":
case "gif":
case "bmp":
return true;
}
}
return false;
}
this.refreshPath = function (path) {
treeRoot.removeChild(treeRoot.childNodes[0]);
httpGet(treeRoot, "/");
};
function delCb(path) {
return function (status, responseText) {
if (status != 200) {
alert("ERROR[" + status + "]: " + responseText);
} else {
treeRoot.removeChild(treeRoot.childNodes[0]);
httpGet(treeRoot, "/");
}
}
}
function httpDelete(filename) {
var formData = new FormData();
formData.append("path", filename);
requests.add("DELETE", "/edit", formData, delCb(filename));
}
function getCb(parent, path) {
return function (status, responseText) {
if (status == 200)
addList(parent, path, JSON.parse(responseText));
}
}
function httpGet(parent, path) {
requests.add("GET", "/edit", { list: path }, getCb(parent, path));
}
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 "cnv": lang = "plain"; break;
case "txt": lang = "plain"; break;
case "hex": lang = "plain"; break;
case "conf": lang = "plain"; break;
case "htm": lang = "html"; break;
case "js": lang = "javascript"; break;
case "css":
case "scss":
case "php":
case "html":
case "json":
case "xml":
case "ini": lang = ext;
}
}
return lang;
}
if (typeof file === "undefined") file = "/index.html";
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 editor = ace.edit(element);
function httpPostProcessRequest(status, responseText) {
if (status != 200) alert("ERROR[" + status + "]: " + responseText);
}
function httpPost(filename, data, type) {
var formData = new FormData();
formData.append("data", new Blob([data], { type: type }), filename);
requests.add("POST", "/edit", formData, httpPostProcessRequest);
}
function httpGetProcessRequest(status, responseText) {
ge("preview").style.display = "none";
ge("editor").style.display = "block";
if (status == 200)
editor.setValue(responseText);
else
editor.setValue("");
editor.clearSelection();
}
function httpGet(theUrl) {
requests.add("GET", "/edit", { edit: theUrl }, httpGetProcessRequest);
}
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
});
editor.loadUrl = function (filename) {
var edfname = ge("editor-filename");
edfname.value = 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 parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) { vars[key] = value; });
var editor = createEditor("editor", vars.file, vars.lang, vars.theme);
var tree = createTree("tree", editor);
createFileUploader("uploader", tree, editor);
if (typeof vars.file === "undefined") vars.file = "/dev_conf.txt";
editor.loadUrl(vars.file);
};
</script>
<script id='ace' src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js" type="text/javascript"
charset="utf-8"></script>
<script>
if (typeof ace.edit == "undefined") {
var script = document.createElement('script');
script.src = "/ace.js";
script.async = false;
document.head.appendChild(script);
}
</script>
</head>
<body onload="onBodyLoad();">
<div id="loader" class="loader"></div>
<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: 15 KiB

BIN
data/index.json.gz Normal file

Binary file not shown.

View File

@@ -1 +0,0 @@
0;analog-adc;id;fillgauge;Сенсоры;Аналоговый;order;gol;map[0,1024,0,100];c[1]

View File

@@ -1 +0,0 @@
0;bme280-hum;id;anydataHum;Сенсоры;Влажность;order;addr[0x76];c[1]

View File

@@ -1 +0,0 @@
0;bme280-press;id;anydataPress;Сенсоры;Давление;order;addr[0x76];c[1]

View File

@@ -1 +0,0 @@
0;bme280-temp;id;anydataTemp;Сенсоры;Температура;order;addr[0x76];c[1]

View File

@@ -1 +0,0 @@
0;bmp280-press;id;anydataPress;Сенсоры;Давление;order;addr[0x76];c[1]

View File

@@ -1 +0,0 @@
0;bmp280-temp;id;anydataTemp;Сенсоры;Температура;order;addr[0x76];c[1]

View File

@@ -1 +0,0 @@
0;button-in;id;toggle;Кнопки;Освещение;order;pin;db[20]

View File

@@ -1 +0,0 @@
0;button-out;id;toggle;Кнопки;Освещение;order;pin;inv[1];st[1]

View File

@@ -1 +0,0 @@
0;button-out;id;toggle;Кнопки;Освещение;order;st[0]

View File

@@ -1 +0,0 @@
0;button-out;id;toggle;Кнопки;Освещение;order;pin;st[0]

View File

@@ -1 +0,0 @@
0;dallas-temp;id;anydataTemp;Сенсоры;Температура;order;sal;index[0];int[10]

View File

@@ -1 +0,0 @@
0;dht-hum;id;anydataHum;Сенсоры;Влажность;order;thd;type[dht11];c[1]

View File

@@ -1 +0,0 @@
0;dht-temp;id;anydataTemp;Сенсоры;Температура;order;thd;type[dht11];c[1]

View File

@@ -1 +0,0 @@
0;dht-hum;id;anydataHum;Сенсоры;Влажность;order;thd;type[dht22];c[1]

View File

@@ -1 +0,0 @@
0;dht-temp;id;anydataTemp;Сенсоры;Температура;order;thd;type[dht22];c[1]

View File

@@ -1 +0,0 @@
0;impuls-out;id;na;na;na;order;pin

View File

@@ -1 +0,0 @@
0;input-digit;id;inputDigit;Ввод;Введите#цифру;order;st[60]

View File

@@ -1 +0,0 @@
0;input-time;id;inputTime;Ввод;Введите#время;order;st[10:00]

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

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

View File

@@ -1 +0,0 @@
0;logging;id;chart;Графики;История;order;val[any];int[60];cnt[100]

View File

@@ -1 +0,0 @@
0;modbus;id;anydata;Modbus;Регистр;order;addr[1];reg[0];c[1]

View File

@@ -1 +0,0 @@
0;output-text;id;anydata;Вывод;Сигнализация;order;st[Обнаружено#движение]

View File

@@ -1 +0,0 @@
0;pwm-out;id;range;Ползунки;Яркость;order;pin;st[500]

View File

@@ -1 +0,0 @@
0;ultrasonic-cm;id;anydata;Сенсоры;Расстояние;order;cin;map[0,500,0,100];c[1]

View File

@@ -1 +0,0 @@
0;uptime;id;anydataTime;Системные;%name%#uptime;order

Binary file not shown.

View File

@@ -1,5 +0,0 @@
0;dallas-temp;temp;anydataTemp;Термостат;Температура;1;pin[2];index[0];int[10]
0;logging;log;chart;Термостат;История;2;val[temp];int[60];cnt[100]
0;input-digit;inputU;inputDigit;Термостат;Верхний#порог;3;st[30]
0;input-digit;inputL;inputDigit;Термостат;Нижний#порог;4;st[20]
0;button-out;button;toggle;Термостат;Нагрев;5;pin[12];st[0]

View File

@@ -1,8 +0,0 @@
temp > inputU
button 0
telegram нагрев#выключен 1
end
temp < inputL
button 1
telegram нагрев#включен 1
end

View File

@@ -1,5 +0,0 @@
0;dht-hum;hum;anydataHum;Теплица;Влажность;1;pin[2];type[dht11];c[1]
0;logging;log;chart;Теплица;История;2;val[hum];int[60];cnt[100]
0;input-digit;inputU;inputDigit;Теплица;Верхний#порог;3;st[45]
0;input-digit;inputL;inputDigit;Теплица;Нижний#порог;4;st[35]
0;button-out;button;toggle;Теплица;Полив;5;pin[12];st[0]

View File

@@ -1,8 +0,0 @@
hum > inputU
button 0
telegram полив#выключен 1
end
hum < inputL
button 1
telegram полив#включен 1
end

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,4 +0,0 @@
0;button-out;button1;toggle;Реле;Освещение;1;pin[12];st[0]
0;button-out;button2;toggle;Реле;Освещение;2;pin[13];st[0]
0;input-time;T1;inputTime;Реле;Введите#время#включения;3;st[10:00]
0;input-time;T2;inputTime;Реле;Введите#время#выключения;4;st[11:00]

View File

@@ -1,8 +0,0 @@
timenow = T1
button1 1
button2 0
end
timenow = T2
button1 0
button2 1
end

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

Binary file not shown.

View File

@@ -1,199 +0,0 @@
{
"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": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Time: {{timenow}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Build version: {{firmware_version}}"
},
{
"type": "h4",
"title": "LittleFS version: 267"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url1",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "Выберите элемент из списка<span class=\"caret\"></span>",
"/set?addItem=button-out.pin": "1.Кнопка управляющая пином",
"/set?addItem=button-out.npin": "2.Кнопка виртуальная",
"/set?addItem=button-in": "4.Кнопка физическая",
"/set?addItem=pwm-out": "3.Широтно импульсная модуляция pwm",
"/set?addItem=input-digit": "5.Окно ввода цифровых значений",
"/set?addItem=input-time": "6.Окно ввода времени",
"/set?addItem=output-text": "7.Окно вывода любого текста, предупреждения, цифры",
"/set?addItem=analog-adc": "8.Датчик аналоговый, чтение аналогового входа",
"/set?addItem=dallas-temp": "9.Датчик температуры ds18b20",
"/set?addItem=ultrasonic-cm": "10.Датчик расстояния ультрозвуковой JSN-SR04T, HC-SR04, HY-SRF05",
"/set?addItem=dht11-temp": "11.Датчик температуры DHT11",
"/set?addItem=dht11-hum": "12.Датчик влажности DHT11",
"/set?addItem=dht22-temp": "13.Датчик температуры DHT22, DHT33, DHT44, AM2302, RHT03",
"/set?addItem=dht22-hum": "14.Датчик влажности DHT22, DHT33, DHT44, AM2302, RHT03",
"/set?addItem=bme280-temp": "15.Датчик температуры bme280",
"/set?addItem=bme280-hum": "16.Датчик влажности bme280",
"/set?addItem=bme280-press": "17.Датчик давления bme280",
"/set?addItem=bmp280-temp": "18.Датчик температуры bmp280",
"/set?addItem=bmp280-press": "19.Датчик давления bmp280",
"/set?addItem=impuls-out": "20.Создать импульсы через заданный промежуток времени (управление шд)",
"/set?addItem=modbus": "21.Прочитать регистр modbus устройства",
"/set?addItem=logging": "a.Логгирование и вывод в график любой величины",
"/set?addItem=uptime": "b.Отобразить время работы устройства"
}
},
{
"type": "dropdown",
"name": "help-url2",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "Выберите пресет из списка<span class=\"caret\"></span>",
"/set?addPreset=dal.c": "1.Термостат на основе ds18b20 с оповещением в телеграм",
"/set?addPreset=dht.c": "2.Контроль влажности на основе DHT с оповещением в телеграм",
"/set?addPreset=rel.c": "3.Включение выключение реле в заданное время"
}
},
{
"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": "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": "button",
"title": "Очистить логи сенсоров",
"action": "/set?cleanlog",
"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": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
"class": "btn btn-block btn-danger"
}
]
}

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.

View File

@@ -1,39 +0,0 @@
{
"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"
}
]
}

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

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

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

@@ -1,4 +1,5 @@
{
"widget": "chart",
"dateFormat": "HH:mm"
"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" : "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

@@ -12,11 +12,6 @@
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "text",
"class": "alert alert-light",
"title": "<center><img src='/icon.jpeg' alt='IoT Manager'></center>"
},
{
"type": "link",
"title": "Конфигурация устройства",
@@ -47,6 +42,12 @@
"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",

View File

@@ -37,9 +37,38 @@
"class": "btn btn-block btn-default"
},
{
"type": "link",
"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": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]

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

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

View File

@@ -9,7 +9,6 @@
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
@@ -20,7 +19,14 @@
{
"type": "hr"
},
{
"type": "h3",
"title": "Основной брокер",
"style": "width:100%;float:left;"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "{{SetMQTTServerName}}",
@@ -81,20 +87,91 @@
"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]]",
"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;",
@@ -102,7 +179,6 @@
"action": "set?mqttsend",
"class": "btn btn-block btn-default"
},
{
"type": "button",
"style": "width:100%;float:left;",
@@ -115,7 +191,6 @@
"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",
@@ -123,10 +198,19 @@
"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": "link",
"style": "width:100%;float:left;",
"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": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]

View File

@@ -21,30 +21,58 @@
},
{
"type": "checkbox",
"name": "tel",
"name": "telegonof",
"title": "Включить телеграм",
"action": "/set?telegonof=[[tel]]",
"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",
"style": "width:40%;float:left;",
"title": "Telegram API token:"
"title": "Telegram chat ID"
},
{
"type": "input",
"title": "",
"name": "chatId-arg",
"state": "{{chatId}}"
},
{
"type": "h4",
"title": "Telegram API token"
},
{
"type": "input",
"title": "",
"name": "telegramApi-arg",
"style": "width:60%;float:right",
"state": "{{telegramApi}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?telegramApi=[[telegramApi-arg]]",
"action": "set?telegramApi=[[telegramApi-arg]]&chatId=[[chatId-arg]]",
"class": "btn btn-block btn-default",
"style": "width:100%;display:inline"
},
@@ -59,9 +87,16 @@
"type": "hr"
},
{
"type": "link",
"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": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]

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"
}
]
}

View File

@@ -175,9 +175,16 @@
"type": "hr"
},
{
"type": "link",
"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": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
"action": "/set?reqReset",
"response": "[[reset-block]]",
"class": "btn btn-block btn-danger"
}
]

566
doc/1.txt
View File

@@ -1,566 +0,0 @@
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## Возможности
- Объединение различных по типу и назначению устройств: управление, получение данных, и настройка параметров - всё в одном приложении
- Взаимодействие с устройствами осуществляется через "облачный" сервис с использованием протокола mqtt, позволит контролировать их из любой точки Мира (при наличии доступа в Интернет)
- Поддержка нескольких профилей и их переключение "на лету", дает возможность объединить устройства в группы
Настройка (после "прошивки") производится через веб-интерфейс, чтобы получить к нему доступ необходимо соединиться с WiFi AP устройства и набрать в адресной строке браузера http://192.168.4.1.
Далее выбрать типовой шаблон автоматизации, произвести настройку под свои требования и задачи.
Основные разделы интерфейса: конфигурация и сценарии.
В окне конфигурации задаются "объекты", "элементы управления" устройства (dashboard) - им устройство будет представлено в приложении компаньоне проекта. В окне сценариев задаются реакции на события и изменения в параметрах работы системы.
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## Команды, назначение и применение
Команды служат для настройки и управления устройством и его взаимодействия
**`buttonSet 1 1`** Изменит состояние "кнопки" №1, установит его в значение 1
**`pinSet 13 0`** Установит GPIO 13 состояние 0
**`pinChange 13`** Состояние GPIO 13 будет изменено на противоположное
**`pwmSet 1 500`** Настройка pwm №1 будет использовано значение 500
**`timeSet 1 08-00-00`** Установит для элемента ввода времени - inputTime значение 08:00:00
**`digitSet 1 56`** Элемент №1 (для цифровых параметров) отобразит число 56
**`stepperSet 1 100 1`** Шаговый двигатель №1 - вращение 100 "шагов" по часовой стрелке (для движения в обратную сторону используются отрицательные значения параметра)
**`servoSet 1 180`** Сервопривод №1 принять положение 180°
**`timerStart 1 60 sec`** Установить для таймера №1 обратный отсчёт в 60 секунд
**`timerStop 1`** Остановить таймер №1
**`textSet 1 Привет`** Установить для элемента текстовое поле №1 - "привет"
**`push Внимание Протечка`** Отправить push-уведомление с темой "внимание" и содержанием "протечка"
**`firmwareUpdate`** Обновить прошивку устройства "по воздуху"
**`firmwareVersion Версия прошивки Системные 1`** Узнать версию прошивки устройстве
## Сценарии
Элементарный блок в сценарии состоит из набора команд и триггера - условия для их выполнения
**temp > 60**
digitSet 1 60
stepperSet 1 100 1
textSet 1 Перегрев
**end**
Условие: когда температура превысит 60°
Запустит: команда шаговому двигателю, в приложение отправить сообщение и цифровое значение температуры.
В сценарии может быть несколько блоков, при необходимости из приложения есть возможность "выключать" часть из них.
Неактивные блоки сценария будут проигнорированы.
Для взаимодействия устройств между собой предусмотрены команды mqtt и http
**temp > 60**
mqtt 154348-134 digitSet_1_56
mqtt 154348-136 stepperSet _1_100_1
http 192.168.1.10 textSet_1_Перегрев
**end**
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 1.1 Объект "кнопка"
(эти строки мы пишем в "конфигурации устройства")
### a) кнопка управляющая выходом (пином). Пины нумеруются по системе нумирации gpio для esp контроллеров.
`button 1 13 кухня освещение 0 1`
**"button"** это объект создающий кнопку в приложении
**"1"** это номер этой кнопки (необходимый для ее аутентификации)
**"13"** это номер пина которым будет управлять данная кнопка
**"кухня"** это название кнопки в приложении
**"освещение"** это название вкладки в приложении на которой появится данная кнопка
**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1)
**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта
### б) виртуальная кнопка - кнопка реакцию на которую можно задать в сценариях:
`button 1 na запустить таймеры 0 1`
**"button"** это объект создающий кнопку в приложении
**"1"** это номер этой кнопки (необходимый для ее аутентификации)
**"na"** абривиатура not available означающая что эта кнопка виртуальная и что пин не установлен
**"запустить"** это название кнопки в приложении
**"таймеры"** это название вкладки в приложении на которой появится данная кнопка
**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1)
**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта
### в) кнопка включающая и выключающая все сценарии:
`button 1 scenario запустить таймеры 0 1`
**"button"** это объект создающий кнопку в приложении
**"1"** это номер этой кнопки (необходимый для ее аутентификации)
**"scenario"** слово означающее что эта кнопка для управления сценариями
**"запустить"** это название кнопки в приложении
**"таймеры"** это название вкладки в приложении на которой появится данная кнопка
**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1)
**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта
### г) кнопка включающая выключающая определенные блоки сценариев:
`button 1 line1,line3, Включить#отправку#push Оповещение 0 1`
**"button"** это объект создающий кнопку в приложении
**"1"** это номер этой кнопки (необходимый для ее аутентификации)
**"line1,line3,"** это блоки сценариев нумирация сверху вниз. Блоком считается выражение от начала до слова end
**"Включить#отправку#push"** это название кнопки в приложении
**"Оповещение"** это название вкладки в приложении на которой появится данная кнопка
**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1)
**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта
## 1.2 Команды управления объектом "кнопка"
(эти строки мы пишем в "сценариях")
### а) Команда включения выключения кнопки по ее номеру
`buttonSet 1 1`
**"buttonSet"** команда управления объектом button
**"1"** номер кнопки которой будем управлять
**"1"** состояние включено, 0 - выключено
### б) Команда изменения состояния кнопки на противоположное
`buttonChange 1`
**"buttonChange"** команда управления объектом button
**"1"** номер кнопки которой будем управлять
## 1.3 Вызов событий объектом "кнопока"
(эти строки мы пишем в "сценариях")
объект button может быть равен либо 0 либо 1
`button1 = 1`
`button2 = 0`
Пример использования:
`button1 = 1`
`buttonSet 2 1`
`buttonSet 3 0`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 2.1 Объект "физическая кнопка"
`switch 1 0 10`
**switch** это объект создающий физическую кнопку
**1** номер кнопки
**0** пин кнопки (при подключении необходим подтягивающий резистор)
**10** задержка для избавления от дребезга с мили секундах
## 2.2 Вызов событий объектом "физическая кнопка"
`switch1` может быть равна нулю или единицы, ноль - событие отбрасывания кнопки, единица - событие нажатия
`switch1 = 1`
`buttonChange 1`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 3.1 Объект "широтноимпульсная модуляция"
`pwm 1 12 яркость освещение 1023 1`
**"pwm"** это объект создающий управление шим в приложении в виде ползунка
**"1"** это номер этого объекта
**"12"** это номер пина на котором будет генерироваться шим заданной в приложении величены
**"Яркость"** это название кнопки в приложении
**"Оповещение"** это название вкладки в приложении на которой появится данная кнопка
**"1023"** это начальное значение шим сигнала и ползунка (изменяется от 0 до 1023)
**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта
## 3.2 Команда управления объектом "широтноимпульсная модуляция"
`pwmSet 1 500`
**"pwmSet"** команда управления объектом
**"1"** номер объекта, которым будем управлять
**"500"** значение которое установится после выполнения команды (от 0 до 1023)
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 4.1 Объект "окно ввода времени"
`inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1`
**inputTime** это объект создающий окно ввода в приложении
**time1** переменная в которую будет записано время введенное в окно
**Во#сколько#включить?** это название окна в приложении
**Таймеры** это название вкладки в приложении
**20-30-00** начальное значение времени после загрузки устройства
**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
## 4.2 Управление объектом "окно ввода времени"
`timeSet 1 08-00-00`
**"timeSet"** команда управления объектом
**"1"** номер объекта, которым будем управлять в данном случае окном ввода с `time1`
**"08-00-00"** время которое хотим установить
В окно ввода можно вводить время в приложении но если необходимо изменить время автоматически
по какому нибудь событию то можно использовать команду выше - **timeSet**.
## 4.3 Вызов событий объектом "окно ввода времени"
`timenow = time1`
`buttonSet 1 1`
`end`
`timenow` всегда хранит в себе текущее время, и поэтому исходя из данного сценария кнопка номер 1 включится в то время которое будет введено в окно ввода `time1`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 5.1 Объект "окно ввода цифры"
`inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2`
**inputDigit** это объект создающий окно ввода в приложении
**digit1** переменная в которую будет записана цифра, введенная в окно
**Через#сколько#секунд#выключить?** это название окна в приложении
**Таймеры** это название вкладки в приложении
**5** цифра по умолчанию, после загрузки модуля
**2** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
## 5.2 Управление объектом "окно ввода цифры":
`digitSet 1 56`
**"digitSet"** команда управления объектом
**"1"** номер объекта, которым будем управлять в данном случае окном ввода с `digit1`
**"56"** цифра которую хотим установить
В окно ввода можно вводить цифры в приложении, но если необходимо изменить цифру автоматически
по какому нибудь событию, то можно использовать команду выше - **digitSet**.
## 5.3 Вызов событий объектом "окно ввода цифры"
`dallas > digit1`
`buttonSet 1 0`
`end`
`button1 = 1`
`timerStart 1 digit1 sec`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 6.1 Объект "dallas" (сенсор температуры ds18b20)
`dallas temp1 2 123456 Водонагреватель,#t°C Термостат any-data 1`
**dallas** это объект чтения датчика температуры
**2** пин датчика температуры
**Водонагреватель,#t°C** это название виджета в приложении
**Датчики** название вкладки в приложении
**any-data** или **progress-round** или **progress-line** три разных варианта виджета отображения
**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
## 6.2 Вызов событий объектом "dallas"
В сценариях dallas можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=):
`dallas > digit1`
`buttonSet 1 0`
`end`
Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=):
`dallas > 60`
`buttonSet 1 0`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 7.1 Объект "analog" (аналоговый вход контроллера)
`analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1`
**analog** это объект чтения аналогового входа
**adc** это переменная
**0** пин аналогового входа (для esp8266 всегда 0, для esp32 пока что не доделал читаться будет всегда пин 34)
**Аналоговый#вход,#%** это название виджета в приложении
**Датчики** название вкладки в приложении
**any-data** или **progress-round** или **progress-line** три разных варианта виджета отображения
**310** начальная величина читаемого диапазона
**620** конечная величина читаемого диапазона
**1** начальная величина выводимого диапазона
**100** конечная величина выводимого диапазона
**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
## 7.2 Вызов событий объектом "analog"
В сценариях analog можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=):
`analog > digit1`
`buttonSet 1 0`
`end`
Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=):
`analog > 50`
`buttonSet 1 0`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 8.1 Объект "level" (ультразвуковой дальномер JSN-SR04T, HC-SR04, HY-SRF05)
`level Вода#в#баке,#% Датчики any-data 125 20 1`
**level** это объект чтения датчика расстояния
**Вода#в#баке** это название виджета в приложении
**Датчики** название вкладки в приложении
**any-data** или **progress-round** или **progress-line** три разных варианта отображения виджета
**125** расстояние от датчика до дна бака в сантиметрах
**20** расстояние от датчика до поверхности воды, когда бак полный, в сантиметрах
**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
Подключать дальномер нужно:
| | trig | echo |
| :-: | :-: | :-: |
| wemos | D5 | D6 |
| esp | 14 | 12 |
## 8.2 Вызов событий объектом "level"
В сценариях level можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=):
`level > digit1`
`buttonSet 1 0`
`end`
Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=):
`level > 95`
`buttonSet 1 0`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 9.1 Объект "dht" (Сенсоры DHT11, DHT22, DHT33, DHT44, AM2302, RHT03)
dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 1
dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2
dhtComfort Степень#комфорта: Датчики 3
dhtPerception Восприятие: Датчики 4
dhtDewpoint Точка#росы: Датчики 5
**dhtT** или **dhtH** температура или влажность
**DHT11** или **DHT22** чтение DHT11 или DHT22, DHT33, DHT44, AM2302, RHT03 соответственно
**2** пин датчика
**Температура#DHT,#t°C** это название виджета в приложении
**Датчики** название вкладки в приложении
**any-data** или **progress-round** или **progress-line** три разных варианта отображения виджета
**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
## 9.2 Вызов событий объектом "dhtT" или "dhtH"
В сценариях "dhtT" или "dhtH" можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=):
`dhtT > digit1`
`buttonSet 1 0`
`end`
`dhtH > digit1`
`buttonSet 1 0`
`end`
Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=):
`dhtT > 50`
`buttonSet 1 0`
`end`
`dhtH < 40`
`buttonSet 1 0`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 10.1 Объект "stepper" (Драйвер шагового двигателя A4988)
stepper 1 12 4
stepper 2 13 5
**stepper** объект создающий шаговый двигатель
**1** номер шаговика
**12** номер пина количества шагов
**4** номер пина направления
## 10.2 управление объектом "stepper"
`stepperSet 1 200 1`
**stepperSet** команда управления шаговым двигателем
**1** номер шагового двигателя (их может быть не более двух)
**200** количество шагов (обратное направление отрицательное значение параметра)
**1** интервал между шагами (мс)
`button1 = 1`
`stepperSet 1 200 1`
`end`
`button1 = 0`
`stepperSet 1 -200 1`
`end`
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 11.1 Объект "обратный таймер"
Прежде чем читать этот раздел запустите пресет №3 на устройстве.
Нажав на кнопку "Выберите во что вы хотите превратить esp"
Можно использовать цифры из окон ввода:
`timerStart 1 digit1 sec`
Можно писать цифры прям в объект:
`timerStart 1 10 sec`
Можно установить часы минуты или секунды:
`timerStart 1 10 sec`
`timerStart 1 10 min`
`timerStart 1 10 hours`
Используем это объект в сценариях вот так:
`button1 = 1`
`timerStart 1 digit1 sec`
`end`
Смысл в том что при нажатии на кнопку один запуститься обратный отчет, на величину digit1 секунд. Если напишем например:
`dallas < 60`
`timerStart 1 digit1 sec`
`end`
то такой же отчет запустится когда значение температуры вырастит больше 60 градусов. Таким образом обратный отчет можно запустить реакцией на любое событие. Итак теперь обратный отчет запущен, обратный таймер уменьшается, и нам надо назначить действие на тот момент когда он обнулится. Для этого я придумал выражение: `timer1 = 0`
Используем его и в общем получаем вот такой сценарий:
`button1 = 1`
`timerStart 1 digit1 sec`
`end`
`timer1 = 0`
`buttonSet 1 0`
`end`
Когда таймер закончит отсчёт, кнопка станет "неактивной". Используйте преет №3, как пример подобного сценария
Например:
`dallas < 60`
`buttonSet 1 0`
`buttonSet 2 0`
`pwmSet 1 1023`
`mqtt 2653450020 buttonChange_1`
`mqtt 2653450020 pinSet_13_1`
`http 192.168.1.32 pinSet_14_1`
`end`
Вот что может произойти на разных устройствах по одному событию повышения температуры...
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 12 Журнал (лог) данных
`logging analog 1 100 slow Аналоговый#вход Датчики 7`
**logging** объект для логирования
**analog** или **dhtT** или **dhtH** какой сенсор будем логировать, можно указать любой
**1** период между точками в минутах
**100** количество точек (старые точки будут удаляться по мере добавления новых)
**slow** или **fast** метод выгрузки графика в приложение, slow - выгружает график по одной точке (меньше расходуется оперативка, лучше использовать для esp8266), fast - выгрузка графика сразу (больше расход оперативки, подходит для esp32)
**Аналоговый#вход** название графика в приложении
**Датчики** название вкладки в приложении
**7** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
## 13 Взаимодействие устройств между собой
Устройства могут между собой обмениваться командами. Команды можно отправлять по http или по mqtt.
По событию на одном устройстве можно вызвать действие на другом. Например на esp01 стоит датчик температуры, реле стоит на esp02.
Настройки esp01:
`dhtT temp 2 dht11 Температура#DHT,#t°C Датчики any-data 1`
`temp < 40`
`http 192.168.10.25 buttonSet_1_1`
`end`
Настройки esp02:
`button 1 13 Включить#реле Реле 0 1`
И теперь когда температура датчика на esp01 станет меньше 40 градусов то на esp02 будет отправлена команда на включение кнопки: buttonSet_1_1
Если вы хотите отправить команду через mqtt то сценарий будет выглядеть следующим образом:
`temp < 40`
`mqtt 12343442-12413131 buttonSet_1_1`
`end`
где `12343442-12413131` id esp02 той на которую отправляем команду. Id можно взять в веб интерфейсе на странице конфигурация устройства. Или в списке устройств в сети.
Теперь рассмотрим вариант внешнего управления esp с помощью get запросов.
`http://192.168.88.239/cmd?command=buttonSet%201%201`
Разберем эту строку. Сама команда в ней выглядит вот так: buttonSet%201%201. `%20` заменяют пробел.
То есть что бы составить get запрос на изменение например pwm нужно:
Взять команду `pwmSet 1 500`
Заменить в ней пробелы на `%20` получится так: `pwmSet%201%20500`
И добавить ее в конец строки `http://192.168.88.239/cmd?command=` где указывается ip адрес устройства
В итоге получится http://192.168.88.239/cmd?command=pwmSet%201%20500

View File

@@ -1,85 +0,0 @@
# В этой инструкции будет описано как с esp отправлять email и push
# Часть 1. Привязать email и pushbullet к сайту pushingbox
### 1. Необходимо перейти на сайт: [pushingbox](https://www.pushingbox.com/)
### 2. Войти с помощью google
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_1.png)
### 3. Перейти в мои сервисы и добавить новый сервис
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_2.png)
### 4. Нас интересуют два сервиса email и pushbullet
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_4%2B.png)
### 5. Выбираем сначало сервис для отправки email. В окно `Name of your email configuration` - вводим слово "email". В окно `Email address` - вводим ваш email адрес. жмем submit
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_5.png)
manager_modules_firmware/blob/master/push_instruction/Screenshot_6.png)
### 6.1 Привязываем pushbullet. Переходим на сайт [pushbullet.com](https://www.pushbullet.com/)
### 6.2 Входим с гуглом или фейсбуком
### 6.3 Идем в настройки
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_7.png)
### 6.4 Создаем токен
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_8.png)
### 6.5 Идем опять в сервисы и теперь выбираем сервис pushbullet [pushingbox.com/services](https://www.pushingbox.com/services.php) нажимаем add service
### Берем токен, и вставляем его в окно Access token.
### Окно Device token (optional) оставляем пустым.
### В окно Name of your Pushbullet configuration пишем слово "push".
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_6.png)
### 7. Теперь наш email и pushbullet привязаны к pushingbox. Далее можно скачать приложение pushbullet на телефон и войти с гуглом или фейсбуком сответственно с пунктом 6.3 этой инструкции
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_9.png)
# Часть 2. Создание сценариев отправки email
### 8.1. Сценарий для отправки email. Заходим в My Scenarios:
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_10.png)
### 8.2 Пишем слово email (это имя сценария отправки email) жмем add:
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_12.png)
### 8.3 Нажимаем add an action
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_14.png)
### 8.4 Выбираем наш email который мы зарегестрировали ранее и нажимаем Add an action with this service
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_11.png)
### 8.5 Делаем все как на скриншоте и жмем submit
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_15.png)
### 8.6 Возвращаемся на мои сценарии
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_17.png)
### 8.7 Вставляем токен в веб интерфейс esp
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_18.png)
# Часть 3. Создание сценариев отправки push
### 9.1. Сценарий для отправки push. Заходим в My Scenarios:
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_10.png)
### 9.2 Пишем слово push (это имя сценария отправки email) жмем add:
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_19.png)
### 9.3 Нажимаем add an action
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_20.png)
### 9.4 Выбираем наш pushbullet который мы зарегестрировали ранее и нажимаем Add an action with this service
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_11.png)
### 9.5 Делаем все как на скриншоте и жмем submit
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_15.png)
### 9.6 Возвращаемся на мои сценарии
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_21.png)
### 9.7 Вставляем токен в веб интерфейс esp
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_18.png)
# Часть 4. Итог
При создании такой конфигурации как на картинке:
`button 1 na Отправить#push Push 0 1`
`button1 = 1`
`push внимание кнопка#нажата`
`end`
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_22.png)
Если мы введем токен для email то будут приходить email
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_17.png)
Если для push то будут приходить push в pushbullet
![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_21.png)
Способ описанный в данной инструкции более сложный в настройке но зато очень надежный.

View File

@@ -1,32 +0,0 @@
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
### 1. Скачать архив из [релизов](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/releases) или из закрепленного сообщения группы телеграм с последней версией прошивки
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
### 2. Для ESP8266 c 4 и больше мб памяти (все сделать как на скриншотах)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1.png)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_2.png)
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
### 2. Для ESP8266 c 1 мб памяти (все сделать как на скриншотах)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1mb_1.png)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1mb_2.png)
***
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true)
### 2. Для ESP32 (все сделать как на скриншотах)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp32_1.png)
![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp32_2.png)

BIN
doc/calculator.xlsx Normal file

Binary file not shown.

View File

@@ -1,3 +0,0 @@
button 1 5 Включить#реле Реле 0 1
//это простая кнопка номер 1 управляющая пином 5 имеющая начальное состояние 0

View File

@@ -1,6 +0,0 @@
inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1
inputTime time2 Во#сколько#выключить? Таймеры 20-35-00 2
button 1 5 Кнопка#(по#таймеру) Таймеры 0 3
//время в приложение необходимо вводить в строгом формате: ЧЧ-ММ-СС
//можно создавать любое количество таймеров, копируя строку inputTime...

View File

@@ -1,4 +0,0 @@
button 1 5 Вкл#на#время Таймеры 0 1
inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2
//в сценариях можно поменять на sec, min или hours если нужны другие размерности времени

View File

@@ -1,3 +0,0 @@
button 1 na Включить#все Освещение 0 1
//при нажатии на эту кнопку пины номер 5 и 13 поведут себя как установленно в сценариях

View File

@@ -1,4 +0,0 @@
button 1 13 Включить#реле Реле 0 1
switch 1 0 10
//можно управлять реле на пине 13 кнопкой на пине 0 или кнопкой в приложении

View File

@@ -1,6 +0,0 @@
button 1 5 Включить#все Реле 0 1
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
//того esp, кнопка на этом девайсе будет выключать другие устройства по воздуху

View File

@@ -1,6 +0,0 @@
switch 1 0 10
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
//того esp, к данному модулю нужно подключить кнопку к пину 0 и тогда
//один девайс будет управлять другим по воздуху

View File

@@ -1,6 +0,0 @@
pwm 1 3 Яркость#коредор: Реле 1023 1
pwm 2 4 Яркость#ванная: Реле 510 2
//в приложении появятся ползунки, соответствующее значение pwm
//будет установленно на пинах 3 и 4
//1023 и 510 это начальные значения после загрузки модуля

View File

@@ -1,7 +0,0 @@
dhtT t 2 dht11 Температура#DHT,#t°C Датчики anydata 1
dhtH h 2 dht11 Влажность#DHT,#t°C Датчики anydata 2
dhtComfort Степень#комфорта: Датчики 3
dhtPerception Восприятие: Датчики 4
dhtDewpoint Точка#росы: Датчики 5
logging t 1 50 Температура Датчики 6
logging h 1 50 Влажность Датчики 7

View File

@@ -1,7 +0,0 @@
dhtT t 2 dht22 Температура#DHT,#t°C Датчики anydata 1
dhtH h 2 dht22 Влажность#DHT,#t°C Датчики anydata 2
dhtComfort Степень#комфорта: Датчики 3
dhtPerception Восприятие: Датчики 4
dhtDewpoint Точка#росы: Датчики 5
logging t 1 50 Температура Датчики 6
logging h 1 50 Влажность Датчики 7

View File

@@ -1,8 +0,0 @@
analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
logging adc 5 100 Аналоговый#вход Датчики 2
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
//значение чтения аналогового входа будут примерно равным
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
//варианты отображения: anydata, progress-round, progress-line, fillgauge

View File

@@ -1,6 +0,0 @@
bmp280T temp1 0x76 Температура#bmp280 Датчики anydata 1
bmp280P press1 0x76 Давление#bmp280 Датчики anydata 2
logging temp1 1 100 Температура Датчики 3
logging press1 1 100 Давление Датчики 4
//Чтение и логгирование датчика bmp280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)

View File

@@ -1,9 +0,0 @@
bme280T temp1 0x76 Температура#bmp280 Датчики anydata 1
bme280P pres1 0x76 Давление#bmp280 Датчики anydata 2
bme280H hum1 0x76 Влажность#bmp280 Датчики anydata 3
bme280A altit1 0x76 Высота#bmp280 Датчики anydata 4
logging temp1 1 100 Температура Датчики 5
logging press1 1 100 Давление Датчики 6
logging hum1 1 100 Влажность Датчики 7
//Чтение и логгирование датчика bme280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)

View File

@@ -1,7 +0,0 @@
dallas temp1 2 1 Температура Датчики anydata 1
dallas temp2 2 2 Температура Датчики anydata 2
logging temp1 1 100 Температура Датчики 3
logging temp2 1 100 Температура Датчики 4
//2 - номер пина датчика
//варианты отображения: anydata, progress-round, progress-line, fillgauge

View File

@@ -1,12 +0,0 @@
dallas 2 Водонагреватель,#t°C Термостат anydata 1
logging dallas 5 100 Температура Термостат 2
inputDigit digit1 При#скольки#выключить? Термостат 40 3
inputDigit digit2 При#скольки#включить? Термостат 20 4
button 1 5 Нагреватель Термостат 0 5
button 2 line1,line2, Автоматический#режим Термостат 1 6
//2 - номер пина датчика
//5 - номер пина реле
//это термостат который будет держать температуру между двумя
//установленными в приложении значениями, так же можно выключить
//автоматический режим, и тогда нагреватель будет управляться в ручную

View File

@@ -1,12 +0,0 @@
levelPr p 14 12 Уровень#в#баке,#% Датчики fillgauge 125 25 1
ultrasonicCm cm 14 12 Дистанция,#см Датчики anydata 2
inputDigit digit1 При#скольки#выключить? Датчики 95 3
inputDigit digit2 При#скольки#включить? Датчики 10 4
button 1 5 Насос Датчики 0 5
logging p 1 100 Вода#в#баке Датчики 6
//125 - это расстояние от датчика до дна бака в сантиметрах
//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
//distancePr - эта строка выводит процент заполнения бака
//distanceCm - эта строка выводит расстояние в сантиметрах
//варианты отображения: anydata, progress-round, progress-line, fillgauge

View File

@@ -1,11 +0,0 @@
button 1 5 Прихожая Освещение 0 1
inputDigit digit1 Задержка#выключения Освещение 30 2
switch 1 0 10
//0 - номер пина датчика движения
//5 - номер пина реле
//при срабатывании датчика движения включится реле и обратный таймер на 30 сек
//если движение не будет обнаружено повтороно в течении 30 секунд - свет выключится
//если движение повторится в течении 30 секунд то таймер продлится опять на 30 сек
//свет выключится только в том случае если в комнате все замрет на 30 сек
//задержку выключения можно будет настраивать в приложении

View File

@@ -1,12 +0,0 @@
switch 1 0 20
text 1 Вход: Охрана 1
textSet 1 не#обнаружено-time
button 1 na Сбросить Охрана 0 2
button 2 line3, Включить#push Охрана 1 3
//0 - номер пина датчика
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
//написано в текстовом поле, что движение было обнаружено
//так же будет зафиксирован момент времени срабатывания датчика
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении

View File

@@ -1,17 +0,0 @@
stepper 1 12 4
stepper 2 13 5
button 1 na Открыть#штору#1 Шторы 0 1
button 2 na Открыть#штору#2 Шторы 0 2
//для подключения необходим драйвер шагового двигателя A4988
//stepper 1 12 4 шаговый двигатель с параметрами: 1 - номер шагового двигателя,
//12 - номер пина количества шагов, 4 - номер пина направления
//stepper 2 13 5 шаговый двигатель с параметрами: 2 - номер шагового двигателя,
//13 - номер пина количества шагов, 5 - номер пина направления
//stepperSet 1 200 5 - прокрутить шаговик номер 1 на 200 шагов по часовой стрелке
//с задержкой между шагами 5 милисекунд (чем меньше задержка тем больше скорость)
//если поставить -200 то будет вращаться против часовой стрелки
//можно подключить не более двух шаговиков

View File

@@ -1,17 +0,0 @@
servo 1 12 50 Мой#сервопривод Сервоприводы 0 100 0 180 1
servo 2 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
button 1 na Открыть1 Сервоприводы 0 3
button 2 na Открыть2 Сервоприводы 0 4
//Можно создавать не более двух сервоприводов на одном устройстве.
//1 - номер привода
//12 - номер пина
//50 - начальное значение в процентах
//0 - 100 диапазон ползунка
//0 - 180 диапазон угла
//Представим ситуацию когда есть некая заслонка и при угле в 30 градусов она закрыта,
//а при угле в 90 градусов открыта. В этом случае необходимо написать
//0 100 30 90 и тогда поставив ползунок в 0 % серва встанет в положение 30 градусов,
//а если поставить ползунок в 100 % серва встанет в положение 90 градусов.

View File

@@ -1,7 +0,0 @@
serialBegin 9600 12 13
button 1 na Управляется#из#arduino Serial 0 1
button 2 na Отправить#в#arduino Serial 0 2
text 1 Текст#из#arduino Serial 3
//12 13 это пины uart к которым вы можете подключить arduino. Скетч для arduino выложен в группу.
//команда serialWrite ard-on отправит в arduino текст ard-on

View File

@@ -1,12 +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 adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6
logging adc 1 100 Аналоговый#вход Датчики 7
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
//Так же продемонстрированна система логгирования данных строкой logging
//1 - это интервал между точками в минутах, 100 это количество точек

View File

@@ -1 +0,0 @@

View File

@@ -1,6 +0,0 @@
timenow = time1
buttonSet 1 1
end
timenow = time2
buttonSet 1 0
end

View File

@@ -1,6 +0,0 @@
button1 = 1
timerStart 1 digit1 sec
end
timer1 = 0
buttonSet 1 0
end

View File

@@ -1,8 +0,0 @@
button1 = 1
pinSet 5 1
pinSet 13 0
end
button1 = 0
pinSet 5 0
pinSet 13 1
end

View File

@@ -1,3 +0,0 @@
switch1 = 1
buttonChange 1
end

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