mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
start version
This commit is contained in:
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.pio
|
||||||
|
.vscode/.browse.c_cpp.db*
|
||||||
|
.vscode/c_cpp_properties.json
|
||||||
|
.vscode/launch.json
|
||||||
|
.vscode/ipch
|
||||||
|
lib/libraies-master
|
||||||
|
|
||||||
7
.vscode/extensions.json
vendored
Normal file
7
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||||
|
// for the documentation about the extensions.json format
|
||||||
|
"recommendations": [
|
||||||
|
"platformio.platformio-ide"
|
||||||
|
]
|
||||||
|
}
|
||||||
66
.vscode/settings.json
vendored
Normal file
66
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"terminal.integrated.env.windows": {
|
||||||
|
"PATH": "C:\\Users\\ytrikoz\\.platformio\\penv\\Scripts;C:\\Users\\ytrikoz\\.platformio\\penv;C:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\Git\\cmd\\;c:\\android-studio\\jre\\jre\\bin\\;C:\\Program Files (x86)\\Microsoft SQL Server\\150\\DTS\\Binn\\;C:\\Front\\Shared\\;C:\\Program Files (x86)\\Plantronics\\Spokes3G\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files\\nodejs\\;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\dotnet\\;C:\\Users\\ytrikoz\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\ytrikoz\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\ytrikoz\\AppData\\Roaming\\npm;C:\\MinGW\\bin;;C:\\Program Files (x86)\\West Wind Html Help Builder;C:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\Git\\cmd\\;c:\\android-studio\\jre\\jre\\bin\\;C:\\Program Files (x86)\\Microsoft SQL Server\\150\\DTS\\Binn\\;C:\\Front\\Shared\\;C:\\Program Files (x86)\\Plantronics\\Spokes3G\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files\\nodejs\\;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\dotnet\\;C:\\Users\\ytrikoz\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\ytrikoz\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\ytrikoz\\AppData\\Roaming\\npm;C:\\MinGW\\bin;;C:\\Program Files (x86)\\West Wind Html Help Builder",
|
||||||
|
"PLATFORMIO_CALLER": "vscode"
|
||||||
|
},
|
||||||
|
"files.associations": {
|
||||||
|
"*.cpp": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"regex": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"bitset": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"cerrno": "cpp",
|
||||||
|
"cfloat": "cpp",
|
||||||
|
"climits": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"set": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"ios": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"locale": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"queue": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stack": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"cstdbool": "cpp",
|
||||||
|
"typeinfo": "cpp"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
data/.exclude.files
Normal file
2
data/.exclude.files
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/*.js.gz
|
||||||
|
/.exclude.files
|
||||||
3
data/conf/c001.txt
Normal file
3
data/conf/c001.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
button 1 5 Включить#реле Реле 0 1
|
||||||
|
|
||||||
|
//это простая кнопка номер 1 управляющая пином 5 имеющая начальное состояние 0
|
||||||
6
data/conf/c002.txt
Normal file
6
data/conf/c002.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1
|
||||||
|
inputTime time2 Во#сколько#выключить? Таймеры 20-35-00 2
|
||||||
|
button 1 5 Кнопка#(по#таймеру) Таймеры 0 3
|
||||||
|
|
||||||
|
//время в приложение необходимо вводить в строгом формате: ЧЧ-ММ-СС
|
||||||
|
//можно создавать любое количество таймеров, копируя строку inputTime...
|
||||||
4
data/conf/c003.txt
Normal file
4
data/conf/c003.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
button 1 5 Вкл#на#время Таймеры 0 1
|
||||||
|
inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2
|
||||||
|
|
||||||
|
//в сценариях можно поменять на sec, min или hours если нужны другие размерности времени
|
||||||
3
data/conf/c004.txt
Normal file
3
data/conf/c004.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
button 1 na Включить#все Освещение 0 1
|
||||||
|
|
||||||
|
//при нажатии на эту кнопку пины номер 5 и 13 поведут себя как установленно в сценариях
|
||||||
4
data/conf/c005.txt
Normal file
4
data/conf/c005.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
button 1 13 Включить#реле Реле 0 1
|
||||||
|
switch 1 0 10
|
||||||
|
|
||||||
|
//можно управлять реле на пине 13 кнопкой на пине 0 или кнопкой в приложении
|
||||||
6
data/conf/c006.txt
Normal file
6
data/conf/c006.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
button 1 5 Включить#все Реле 0 1
|
||||||
|
|
||||||
|
|
||||||
|
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
|
||||||
|
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
|
||||||
|
//того esp, кнопка на этом девайсе будет выключать другие устройства по воздуху
|
||||||
6
data/conf/c007.txt
Normal file
6
data/conf/c007.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
switch 1 0 10
|
||||||
|
|
||||||
|
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
|
||||||
|
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
|
||||||
|
//того esp, к данному модулю нужно подключить кнопку к пину 0 и тогда
|
||||||
|
//один девайс будет управлять другим по воздуху
|
||||||
6
data/conf/c008.txt
Normal file
6
data/conf/c008.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
pwm 1 3 Яркость#коредор: Реле 1023 1
|
||||||
|
pwm 2 4 Яркость#ванная: Реле 510 2
|
||||||
|
|
||||||
|
//в приложении появятся ползунки, соответствующее значение pwm
|
||||||
|
//будет установленно на пинах 3 и 4
|
||||||
|
//1023 и 510 это начальные значения после загрузки модуля
|
||||||
7
data/conf/c009.txt
Normal file
7
data/conf/c009.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
dhtT t 2 dht11 Температура#DHT,#t°C Датчики anydata 1
|
||||||
|
dhtH h 2 dht11 Влажность#DHT,#t°C Датчики anydata 2
|
||||||
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
|
dhtPerception Восприятие: Датчики 4
|
||||||
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
logging t 1 50 Температура Датчики 6
|
||||||
|
logging h 1 50 Влажность Датчики 7
|
||||||
7
data/conf/c010.txt
Normal file
7
data/conf/c010.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
dhtT t 2 dht22 Температура#DHT,#t°C Датчики anydata 1
|
||||||
|
dhtH h 2 dht22 Влажность#DHT,#t°C Датчики anydata 2
|
||||||
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
|
dhtPerception Восприятие: Датчики 4
|
||||||
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
logging t 1 50 Температура Датчики 6
|
||||||
|
logging h 1 50 Влажность Датчики 7
|
||||||
8
data/conf/c011.txt
Normal file
8
data/conf/c011.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
|
||||||
|
logging adc 5 100 Аналоговый#вход Датчики 2
|
||||||
|
|
||||||
|
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
|
||||||
|
//значение чтения аналогового входа будут примерно равным
|
||||||
|
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
|
||||||
|
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
|
||||||
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
6
data/conf/c012.txt
Normal file
6
data/conf/c012.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
bmp280T temp1 0x76 Температура#bmp280 Датчики anydata 1
|
||||||
|
bmp280P press1 0x76 Давление#bmp280 Датчики anydata 2
|
||||||
|
logging temp1 1 100 Температура Датчики 3
|
||||||
|
logging press1 1 100 Давление Датчики 4
|
||||||
|
|
||||||
|
//Чтение и логгирование датчика bmp280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)
|
||||||
9
data/conf/c013.txt
Normal file
9
data/conf/c013.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
bme280T temp1 0x76 Температура#bmp280 Датчики anydata 1
|
||||||
|
bme280P pres1 0x76 Давление#bmp280 Датчики anydata 2
|
||||||
|
bme280H hum1 0x76 Влажность#bmp280 Датчики anydata 3
|
||||||
|
bme280A altit1 0x76 Высота#bmp280 Датчики anydata 4
|
||||||
|
logging temp1 1 100 Температура Датчики 5
|
||||||
|
logging press1 1 100 Давление Датчики 6
|
||||||
|
logging hum1 1 100 Влажность Датчики 7
|
||||||
|
|
||||||
|
//Чтение и логгирование датчика bme280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)
|
||||||
7
data/conf/c014.txt
Normal file
7
data/conf/c014.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
dallas temp1 2 1 Температура Датчики anydata 1
|
||||||
|
dallas temp2 2 2 Температура Датчики anydata 2
|
||||||
|
logging temp1 1 100 Температура Датчики 3
|
||||||
|
logging temp2 1 100 Температура Датчики 4
|
||||||
|
|
||||||
|
//2 - номер пина датчика
|
||||||
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
12
data/conf/c015.txt
Normal file
12
data/conf/c015.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
dallas 2 Водонагреватель,#t°C Термостат anydata 1
|
||||||
|
logging dallas 5 100 Температура Термостат 2
|
||||||
|
inputDigit digit1 При#скольки#выключить? Термостат 40 3
|
||||||
|
inputDigit digit2 При#скольки#включить? Термостат 20 4
|
||||||
|
button 1 5 Нагреватель Термостат 0 5
|
||||||
|
button 2 line1,line2, Автоматический#режим Термостат 1 6
|
||||||
|
|
||||||
|
//2 - номер пина датчика
|
||||||
|
//5 - номер пина реле
|
||||||
|
//это термостат который будет держать температуру между двумя
|
||||||
|
//установленными в приложении значениями, так же можно выключить
|
||||||
|
//автоматический режим, и тогда нагреватель будет управляться в ручную
|
||||||
12
data/conf/c016.txt
Normal file
12
data/conf/c016.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
levelPr p 14 12 Уровень#в#баке,#% Датчики fillgauge 125 25 1
|
||||||
|
ultrasonicCm cm 14 12 Дистанция,#см Датчики anydata 2
|
||||||
|
inputDigit digit1 При#скольки#выключить? Датчики 95 3
|
||||||
|
inputDigit digit2 При#скольки#включить? Датчики 10 4
|
||||||
|
button 1 5 Насос Датчики 0 5
|
||||||
|
logging p 1 100 Вода#в#баке Датчики 6
|
||||||
|
|
||||||
|
//125 - это расстояние от датчика до дна бака в сантиметрах
|
||||||
|
//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
||||||
|
//distancePr - эта строка выводит процент заполнения бака
|
||||||
|
//distanceCm - эта строка выводит расстояние в сантиметрах
|
||||||
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
11
data/conf/c017.txt
Normal file
11
data/conf/c017.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
button 1 5 Прихожая Освещение 0 1
|
||||||
|
inputDigit digit1 Задержка#выключения Освещение 30 2
|
||||||
|
switch 1 0 10
|
||||||
|
|
||||||
|
//0 - номер пина датчика движения
|
||||||
|
//5 - номер пина реле
|
||||||
|
//при срабатывании датчика движения включится реле и обратный таймер на 30 сек
|
||||||
|
//если движение не будет обнаружено повтороно в течении 30 секунд - свет выключится
|
||||||
|
//если движение повторится в течении 30 секунд то таймер продлится опять на 30 сек
|
||||||
|
//свет выключится только в том случае если в комнате все замрет на 30 сек
|
||||||
|
//задержку выключения можно будет настраивать в приложении
|
||||||
12
data/conf/c018.txt
Normal file
12
data/conf/c018.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
switch 1 0 20
|
||||||
|
text 1 Вход: Охрана 1
|
||||||
|
textSet 1 не#обнаружено-time
|
||||||
|
button 1 na Сбросить Охрана 0 2
|
||||||
|
button 2 line3, Включить#push Охрана 1 3
|
||||||
|
|
||||||
|
//0 - номер пина датчика
|
||||||
|
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
|
||||||
|
//написано в текстовом поле, что движение было обнаружено
|
||||||
|
//так же будет зафиксирован момент времени срабатывания датчика
|
||||||
|
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
|
||||||
|
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении
|
||||||
17
data/conf/c019.txt
Normal file
17
data/conf/c019.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
stepper 1 12 4
|
||||||
|
stepper 2 13 5
|
||||||
|
button 1 na Открыть#штору#1 Шторы 0 1
|
||||||
|
button 2 na Открыть#штору#2 Шторы 0 2
|
||||||
|
|
||||||
|
//для подключения необходим драйвер шагового двигателя A4988
|
||||||
|
|
||||||
|
//stepper 1 12 4 шаговый двигатель с параметрами: 1 - номер шагового двигателя,
|
||||||
|
//12 - номер пина количества шагов, 4 - номер пина направления
|
||||||
|
|
||||||
|
//stepper 2 13 5 шаговый двигатель с параметрами: 2 - номер шагового двигателя,
|
||||||
|
//13 - номер пина количества шагов, 5 - номер пина направления
|
||||||
|
|
||||||
|
//stepperSet 1 200 5 - прокрутить шаговик номер 1 на 200 шагов по часовой стрелке
|
||||||
|
//с задержкой между шагами 5 милисекунд (чем меньше задержка тем больше скорость)
|
||||||
|
//если поставить -200 то будет вращаться против часовой стрелки
|
||||||
|
//можно подключить не более двух шаговиков
|
||||||
17
data/conf/c020.txt
Normal file
17
data/conf/c020.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
servo 1 12 50 Мой#сервопривод Сервоприводы 0 100 0 180 1
|
||||||
|
servo 2 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
|
||||||
|
button 1 na Открыть1 Сервоприводы 0 3
|
||||||
|
button 2 na Открыть2 Сервоприводы 0 4
|
||||||
|
|
||||||
|
//Можно создавать не более двух сервоприводов на одном устройстве.
|
||||||
|
//1 - номер привода
|
||||||
|
//12 - номер пина
|
||||||
|
//50 - начальное значение в процентах
|
||||||
|
|
||||||
|
//0 - 100 диапазон ползунка
|
||||||
|
//0 - 180 диапазон угла
|
||||||
|
|
||||||
|
//Представим ситуацию когда есть некая заслонка и при угле в 30 градусов она закрыта,
|
||||||
|
//а при угле в 90 градусов открыта. В этом случае необходимо написать
|
||||||
|
//0 100 30 90 и тогда поставив ползунок в 0 % серва встанет в положение 30 градусов,
|
||||||
|
//а если поставить ползунок в 100 % серва встанет в положение 90 градусов.
|
||||||
7
data/conf/c021.txt
Normal file
7
data/conf/c021.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
serialBegin 9600 12 13
|
||||||
|
button 1 na Управляется#из#arduino Serial 0 1
|
||||||
|
button 2 na Отправить#в#arduino Serial 0 2
|
||||||
|
text 1 Текст#из#arduino Serial 3
|
||||||
|
|
||||||
|
//12 13 это пины uart к которым вы можете подключить arduino. Скетч для arduino выложен в группу.
|
||||||
|
//команда serialWrite ard-on отправит в arduino текст ard-on
|
||||||
12
data/conf/c100.txt
Normal file
12
data/conf/c100.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button 1 na Включить#все Реле 0 1
|
||||||
|
button 2 13 Прихожая Реле 0 2
|
||||||
|
button 3 14 Кухня Реле 0 3
|
||||||
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
|
analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6
|
||||||
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
|
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||||
|
//Так же продемонстрированна система логгирования данных строкой logging
|
||||||
|
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||||
1
data/conf/s001.txt
Normal file
1
data/conf/s001.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
6
data/conf/s002.txt
Normal file
6
data/conf/s002.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
timenow = time1
|
||||||
|
buttonSet 1 1
|
||||||
|
end
|
||||||
|
timenow = time2
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
6
data/conf/s003.txt
Normal file
6
data/conf/s003.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
button1 = 1
|
||||||
|
timerStart 1 digit1 sec
|
||||||
|
end
|
||||||
|
timer1 = 0
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
8
data/conf/s004.txt
Normal file
8
data/conf/s004.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
button1 = 1
|
||||||
|
pinSet 5 1
|
||||||
|
pinSet 13 0
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
pinSet 5 0
|
||||||
|
pinSet 13 1
|
||||||
|
end
|
||||||
3
data/conf/s005.txt
Normal file
3
data/conf/s005.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
switch1 = 1
|
||||||
|
buttonChange 1
|
||||||
|
end
|
||||||
8
data/conf/s006.txt
Normal file
8
data/conf/s006.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
button1 = 1
|
||||||
|
mqtt 3233662-1589485 buttonSet_1_1
|
||||||
|
mqtt 2233662-1589486 buttonSet_1_1
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
mqtt 3233662-1589485 buttonSet_1_0
|
||||||
|
mqtt 2233662-1589486 buttonSet_1_0
|
||||||
|
end
|
||||||
4
data/conf/s007.txt
Normal file
4
data/conf/s007.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
switch1 = 1
|
||||||
|
mqtt 3233662-1589485 buttonChange_1
|
||||||
|
mqtt 2233662-1589486 buttonChange_1
|
||||||
|
end
|
||||||
1
data/conf/s008.txt
Normal file
1
data/conf/s008.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s009.txt
Normal file
1
data/conf/s009.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s010.txt
Normal file
1
data/conf/s010.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s011.txt
Normal file
1
data/conf/s011.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s012.txt
Normal file
1
data/conf/s012.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s013.txt
Normal file
1
data/conf/s013.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
1
data/conf/s014.txt
Normal file
1
data/conf/s014.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
6
data/conf/s015.txt
Normal file
6
data/conf/s015.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
dallas > digit1
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
|
dallas < digit2
|
||||||
|
buttonSet 1 1
|
||||||
|
end
|
||||||
6
data/conf/s016.txt
Normal file
6
data/conf/s016.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
p > digit1
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
|
p < digit2
|
||||||
|
buttonSet 1 1
|
||||||
|
end
|
||||||
7
data/conf/s017.txt
Normal file
7
data/conf/s017.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
switch1 = 1
|
||||||
|
timerStart 1 digit1 sec
|
||||||
|
buttonSet 1 1
|
||||||
|
end
|
||||||
|
timer1 = 0
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
10
data/conf/s018.txt
Normal file
10
data/conf/s018.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
switch1 = 1
|
||||||
|
textSet 1 обнаружено#движение-time
|
||||||
|
end
|
||||||
|
button1 = 1
|
||||||
|
textSet 1 не#обнаружено-time
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
|
switch1 = 1
|
||||||
|
push Внимание обнаружено#движение!
|
||||||
|
end
|
||||||
12
data/conf/s019.txt
Normal file
12
data/conf/s019.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button1 = 1
|
||||||
|
stepperSet 1 200 1
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
stepperSet 1 -200 1
|
||||||
|
end
|
||||||
|
button2 = 1
|
||||||
|
stepperSet 2 200 1
|
||||||
|
end
|
||||||
|
button2 = 0
|
||||||
|
stepperSet 2 -200 1
|
||||||
|
end
|
||||||
12
data/conf/s020.txt
Normal file
12
data/conf/s020.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button1 = 1
|
||||||
|
servoSet 1 100
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
servoSet 1 0
|
||||||
|
end
|
||||||
|
button2 = 1
|
||||||
|
servoSet 2 100
|
||||||
|
end
|
||||||
|
button2 = 0
|
||||||
|
servoSet 2 0
|
||||||
|
end
|
||||||
6
data/conf/s021.txt
Normal file
6
data/conf/s021.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
button2 = 1
|
||||||
|
serialWrite ard-11-1
|
||||||
|
end
|
||||||
|
button2 = 0
|
||||||
|
serialWrite ard-11-0
|
||||||
|
end
|
||||||
13
data/conf/s100.txt
Normal file
13
data/conf/s100.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
button1 = 1
|
||||||
|
buttonSet 2 1
|
||||||
|
buttonSet 3 1
|
||||||
|
pwmSet 2 1024
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
buttonSet 2 0
|
||||||
|
buttonSet 3 0
|
||||||
|
pwmSet 2 0
|
||||||
|
end
|
||||||
|
adc > 50
|
||||||
|
buttonSet 2 1
|
||||||
|
end
|
||||||
22
data/config.json
Normal file
22
data/config.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "IoTmanager",
|
||||||
|
"chipID": "",
|
||||||
|
"apssid": "IoTmanager",
|
||||||
|
"appass": "",
|
||||||
|
"routerssid": "VOLODYA",
|
||||||
|
"routerpass": "BELCHENKO",
|
||||||
|
"timezone": 2,
|
||||||
|
"ntp": "pool.ntp.org",
|
||||||
|
"mqttServer": "91.204.228.124",
|
||||||
|
"mqttPort": 1883,
|
||||||
|
"mqttPrefix": "/iotTeam",
|
||||||
|
"mqttUser": "test",
|
||||||
|
"mqttPass": "test",
|
||||||
|
"scen": "1",
|
||||||
|
"pushingboxid": "v7C133E426B0C69E",
|
||||||
|
"weblogin": "admin",
|
||||||
|
"webpass": "admin",
|
||||||
|
"udponoff": "1",
|
||||||
|
"blink": "1",
|
||||||
|
"oneWirePin": "2"
|
||||||
|
}
|
||||||
BIN
data/css/build.css.gz
Normal file
BIN
data/css/build.css.gz
Normal file
Binary file not shown.
12
data/dev_conf.txt
Normal file
12
data/dev_conf.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button 1 na Включить#все Реле 0 1
|
||||||
|
button 2 13 Прихожая Реле 0 2
|
||||||
|
button 3 14 Кухня Реле 0 3
|
||||||
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
|
analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6
|
||||||
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
|
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||||
|
//Так же продемонстрированна система логгирования данных строкой logging
|
||||||
|
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||||
13
data/dev_scen.txt
Normal file
13
data/dev_scen.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
button1 = 1
|
||||||
|
buttonSet 2 1
|
||||||
|
buttonSet 3 1
|
||||||
|
pwmSet 2 1024
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
buttonSet 2 0
|
||||||
|
buttonSet 3 0
|
||||||
|
pwmSet 2 0
|
||||||
|
end
|
||||||
|
adc > 50
|
||||||
|
buttonSet 2 1
|
||||||
|
end
|
||||||
BIN
data/favicon.ico
Normal file
BIN
data/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
data/icon.jpeg
Normal file
BIN
data/icon.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
BIN
data/index.htm.gz
Normal file
BIN
data/index.htm.gz
Normal file
Binary file not shown.
69
data/index.json
Normal file
69
data/index.json
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"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": "text",
|
||||||
|
"class": "alert alert-light",
|
||||||
|
"title": "<center><img src='/icon.jpeg' alt='IoT Manager'></center>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Конфигурация устройства",
|
||||||
|
"action": "/?set.device",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Список других устройств в сети",
|
||||||
|
"action": "/?set.udp",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Конфигурация WIFI",
|
||||||
|
"action": "/?set.wifi",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Конфигурация MQTT",
|
||||||
|
"action": "/?set.mqtt",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Конфигурация push",
|
||||||
|
"action": "/?set.push",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Утилиты",
|
||||||
|
"action": "/?set.utilities",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Скачать приложение IoT Manager для android",
|
||||||
|
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Скачать приложение IoT Manager для iphone",
|
||||||
|
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
data/js/build.chart.js.gz
Normal file
BIN
data/js/build.chart.js.gz
Normal file
Binary file not shown.
BIN
data/js/function.js.gz
Normal file
BIN
data/js/function.js.gz
Normal file
Binary file not shown.
39
data/lang/lang.ru.json
Normal file
39
data/lang/lang.ru.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"SetDevConf": "Конфигурация устройства",
|
||||||
|
"SetDevPreset": "Выберите из списка подходящий пресет кофигурации",
|
||||||
|
|
||||||
|
"ButSave":"Сохранить",
|
||||||
|
"ButMainPage":"Главная",
|
||||||
|
|
||||||
|
|
||||||
|
"SetUDPList": "Список других устройств в сети:",
|
||||||
|
"SetUDPWarn1": "После нажатия на кнопку <b>переформировать список устройств</b> ждите примерно минуту, а затем обновите страницу и список появится вновь",
|
||||||
|
|
||||||
|
"SetUDPUpdateList":"Переформировать список устройств",
|
||||||
|
"SetUDPUpdatePage":"Обновить страницу",
|
||||||
|
"SetUDPNameOfDev":"Имя этого устройства:",
|
||||||
|
"SetUDPDateExchange":"Включить обмен данными между устройствами",
|
||||||
|
"SetUDPWarn2":"Если обмен данными включен, то устройства будут обмениваться широковещательными пакетами udp для формирования списка устройств и для осуществления посылки настроек mqtt. Данный обмен создает дополнительную нагрузку на wifi сеть.",
|
||||||
|
|
||||||
|
"SetWiFiNameOfDev":"Имя устройства:",
|
||||||
|
"SetWiFiRouterConnect":"Подключение к WiFi роутеру:",
|
||||||
|
"SetWiFiAccessPoint":"Точка доступа:",
|
||||||
|
"SetWiFiWeb":"Логин и пароль web interface:",
|
||||||
|
"SetWiFiTimeZone":"Временная зона:",
|
||||||
|
"SetWiFiNTP":"Сервер NTP:",
|
||||||
|
"SetWiFiWarn1":"Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов",
|
||||||
|
"SetWiFiWarn2":"После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку <b>перезагрузить устройство</b> внизу этой страницы",
|
||||||
|
"SetWiFiWarn3":"Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа",
|
||||||
|
"SetWiFiWarn4":"После изменения поля <b>NTP сервер</b> необходимо перезагрузить устройство",
|
||||||
|
"SetWiFiWarn5":"Светодиод статуса подключения показывает четыре состояния подключения: <br><b>1. мигает редко</b> - идет подключение к wifi <br><b>2. мигает часто</b> - идет подключение к серверу mqtt <br><b>3. горит постоянно</b> - модуль в режиме точки доступа, <br><b>4. не горит</b> - модуль подключен к wifi и к mqtt. <br>Светодиод подключен к gpio2. Если галочка стоит - то использовать этот пин нельзя",
|
||||||
|
|
||||||
|
"SetMQTTServerName":"Имя сервера:",
|
||||||
|
"SetMQTTPort":"Номер порта:",
|
||||||
|
"SetMQTTPrefix":"Префикс:",
|
||||||
|
"SetMQTTUserName":"Имя пользователя:",
|
||||||
|
"SetMQTTPassword":"Пароль:",
|
||||||
|
|
||||||
|
"SetMQTTSendSettings":"Отправить настройки MQTT с этого устройства на все остальные",
|
||||||
|
"SetMQTTWarn1":"Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство",
|
||||||
|
"SetMQTTWarn2":"Прежде чем нажимать на кнопку <b>Отправить настройки MQTT</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
|
||||||
|
}
|
||||||
142
data/set.device.json
Normal file
142
data/set.device.json
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
{
|
||||||
|
"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: {{time}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Uptime: {{uptime}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Build version: {{firmware_version}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "LittleFS version: 2.3.5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "dropdown",
|
||||||
|
"name": "help-url",
|
||||||
|
"class": "btn btn-default",
|
||||||
|
"style": "display:inline",
|
||||||
|
"title": {
|
||||||
|
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
|
||||||
|
"/set?preset=001": "1.Вкл. выкл. локального реле",
|
||||||
|
"/set?preset=002": "2.Вкл. выкл. локального реле в определенное время",
|
||||||
|
"/set?preset=003": "3.Вкл. выкл. локального реле на определенный период времени",
|
||||||
|
"/set?preset=004": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
||||||
|
"/set?preset=005": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
|
||||||
|
"/set?preset=006": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
||||||
|
"/set?preset=007": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
||||||
|
"/set?preset=008": "8.Широтно импульсная модуляция",
|
||||||
|
"/set?preset=009": "9.Сенсор DHT11 (темп, влажность) и логгирование",
|
||||||
|
"/set?preset=010": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
|
||||||
|
"/set?preset=011": "11.Аналоговый сенсор и логгирование",
|
||||||
|
"/set?preset=012": "12.Cенсор bmp280 (темп, давление) и логгирование",
|
||||||
|
"/set?preset=013": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
|
||||||
|
"/set?preset=014": "14.Сенсор DS18B20 (темп) и логгирование",
|
||||||
|
"/set?preset=015": "15.Термостат на DS18B20 с переключением в ручной режим и логгированием",
|
||||||
|
"/set?preset=016": "16.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
|
||||||
|
"/set?preset=017": "17.Датчик движения включающий свет",
|
||||||
|
"/set?preset=018": "18.Охранный датчик движения",
|
||||||
|
"/set?preset=019": "19.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
||||||
|
"/set?preset=020": "20.Система управления сервоприводами",
|
||||||
|
"/set?preset=021": "21.Модуль uart (serial). Двухстороняя связь с устройством через uart. Получение данных и отправка команд",
|
||||||
|
"/set?preset=100": "22.Настройки по умолчанию"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h2",
|
||||||
|
"title": "{{SetDevConf}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"state": "dev_conf.txt",
|
||||||
|
"style": "width:100%;height:350px",
|
||||||
|
"title": "Сохранить",
|
||||||
|
"action": "/set?devinit",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h2",
|
||||||
|
"title": "Сценарии"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "scen",
|
||||||
|
"title": "Включить сценарии",
|
||||||
|
"action": "/set?scen=[[scen]]",
|
||||||
|
"state": "{{scen}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"state": "dev_scen.txt",
|
||||||
|
"style": "width:100%;height:350px",
|
||||||
|
"title": "Сохранить",
|
||||||
|
"action": "/set?sceninit",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Инструкция к системе автоматизации",
|
||||||
|
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
133
data/set.mqtt.json
Normal file
133
data/set.mqtt.json
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTServerName}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttServer-arg",
|
||||||
|
"state": "{{mqttServer}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPort}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPort-arg",
|
||||||
|
"state": "{{mqttPort}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPrefix}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPrefix-arg",
|
||||||
|
"state": "{{mqttPrefix}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTUserName}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttUser-arg",
|
||||||
|
"state": "{{mqttUser}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPassword}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPass-arg",
|
||||||
|
"state": "{{mqttPass}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "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]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "{{SetMQTTSendSettings}}",
|
||||||
|
"action": "set?mqttsend",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "Проверить соединение с MQTT",
|
||||||
|
"action": "set?mqttcheck",
|
||||||
|
"response": "[[my-block]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn1}}</p></font></div>"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn2}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
51
data/set.push.json
Normal file
51
data/set.push.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"style": "width:60%;float:left;",
|
||||||
|
"title": "Device id:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "push-arg",
|
||||||
|
"style": "width:40%;float:right",
|
||||||
|
"state": "{{pushingboxid}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?pushingboxid=[[push-arg]]",
|
||||||
|
"class": "btn btn-block btn-default",
|
||||||
|
"style": "width:100%;display:inline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
data/set.udp.json
Normal file
96
data/set.udp.json
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"title": "Главная",
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetUDPList}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "csv",
|
||||||
|
"title": [
|
||||||
|
"html",
|
||||||
|
"html",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"state": "dev.csv",
|
||||||
|
"style": "width:100%;",
|
||||||
|
"class": "nan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{SetUDPUpdateList}}",
|
||||||
|
"action": "/set?updatelist",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{SetUDPUpdatePage}}",
|
||||||
|
"action": "/set?updatepage",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn1}}</p></font></div>",
|
||||||
|
"style": "width:100%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetUDPNameOfDev}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "{{SetUDPNameOfDev}}",
|
||||||
|
"name": "devname-arg",
|
||||||
|
"state": "{{name}}",
|
||||||
|
"pattern": "[A-Za-z0-9]{6,12}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "/set?devname=[[devname-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "udponoff",
|
||||||
|
"title": "{{SetUDPDateExchange}}",
|
||||||
|
"action": "/set?udponoff=[[udponoff]]",
|
||||||
|
"state": "{{udponoff}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn2}}</p></font></div>"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
65
data/set.utilities.json
Normal file
65
data/set.utilities.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"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": "h3",
|
||||||
|
"title": "Сканирование шины OneWire"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "Номер пина шины OneWire",
|
||||||
|
"name": "oneWirePin-arg",
|
||||||
|
"state": "{{oneWirePin}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "Сохранить",
|
||||||
|
"action": "/set?oneWirePin=[[oneWirePin-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{oneWire}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Сканировать",
|
||||||
|
"action": "/set?oneWire=[[oneWirePin-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
185
data/set.wifi.json
Normal file
185
data/set.wifi.json
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"title": "Конфигурация",
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiNameOfDev}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "{{SetWiFiNameOfDev}}",
|
||||||
|
"name": "devname-arg",
|
||||||
|
"state": "{{name}}",
|
||||||
|
"pattern": "[A-Za-z0-9]{6,12}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?devname=[[devname-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn1}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiRouterConnect}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "routerssid-arg",
|
||||||
|
"state": "{{routerssid}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "",
|
||||||
|
"name": "routerpass-arg",
|
||||||
|
"state": "{{routerpass}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"class": "btn btn-block btn-default",
|
||||||
|
"action": "set?routerssid=[[routerssid-arg]]&routerpass=[[routerpass-arg]]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn2}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "blink",
|
||||||
|
"title": "Включить светодиод статуса подключения",
|
||||||
|
"action": "/set?blink=[[blink]]",
|
||||||
|
"state": "{{blink}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn5}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiAccessPoint}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "apssid-arg",
|
||||||
|
"state": "{{apssid}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "",
|
||||||
|
"name": "appass-arg",
|
||||||
|
"state": "{{appass}}",
|
||||||
|
"pattern": ".{8,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?apssid=[[apssid-arg]]&appass=[[appass-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn3}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiWeb}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "Логин",
|
||||||
|
"name": "weblogin-arg",
|
||||||
|
"state": "{{weblogin}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "Пароль",
|
||||||
|
"name": "webpass-arg",
|
||||||
|
"state": "{{webpass}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?weblogin=[[weblogin-arg]]&webpass=[[webpass-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiTimeZone}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "timezone-arg",
|
||||||
|
"state": "{{timezone}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "ntp-arg",
|
||||||
|
"state": "{{ntp}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?timezone=[[timezone-arg]]&ntp=[[ntp-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn4}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
5
data/widgets/anydata.json
Normal file
5
data/widgets/anydata.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget": "anydata",
|
||||||
|
"after": "",
|
||||||
|
"icon": ""
|
||||||
|
}
|
||||||
5
data/widgets/chart.json
Normal file
5
data/widgets/chart.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget": "chart",
|
||||||
|
"series": "Temperature, °C",
|
||||||
|
"dateFormat": "HH:mm"
|
||||||
|
}
|
||||||
7
data/widgets/fillgauge.json
Normal file
7
data/widgets/fillgauge.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"widget": "fillgauge",
|
||||||
|
"circleColor": "#00FFFF",
|
||||||
|
"textColor": "#FFFFFF",
|
||||||
|
"waveTextColor": "#000000",
|
||||||
|
"waveColor": "#00FFFF"
|
||||||
|
}
|
||||||
6
data/widgets/inputDate.json
Normal file
6
data/widgets/inputDate.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"widget" : "input",
|
||||||
|
"size" : "small",
|
||||||
|
"color" : "orange",
|
||||||
|
"type" : "date"
|
||||||
|
}
|
||||||
5
data/widgets/inputNum.json
Normal file
5
data/widgets/inputNum.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget" : "input",
|
||||||
|
"color" : "blue",
|
||||||
|
"type" : "number"
|
||||||
|
}
|
||||||
6
data/widgets/inputText.json
Normal file
6
data/widgets/inputText.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"widget" : "input",
|
||||||
|
"size" : "small",
|
||||||
|
"color" : "orange",
|
||||||
|
"type" : "text"
|
||||||
|
}
|
||||||
5
data/widgets/inputTime.json
Normal file
5
data/widgets/inputTime.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget" : "input",
|
||||||
|
"color" : "blue",
|
||||||
|
"type" : "time"
|
||||||
|
}
|
||||||
12
data/widgets/progress-line.json
Normal file
12
data/widgets/progress-line.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"widget": "progress-line",
|
||||||
|
"icon": "sunny",
|
||||||
|
"descrColor": "",
|
||||||
|
"color": "",
|
||||||
|
"max": "100",
|
||||||
|
"background": "",
|
||||||
|
"stroke": "10",
|
||||||
|
"disabled": "",
|
||||||
|
"before": "",
|
||||||
|
"after": ""
|
||||||
|
}
|
||||||
11
data/widgets/progress-round.json
Normal file
11
data/widgets/progress-round.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"widget": "progress-round",
|
||||||
|
"descrColor": "",
|
||||||
|
"max": "100",
|
||||||
|
"stroke": "20",
|
||||||
|
"color": "#45ccce",
|
||||||
|
"background": "#777",
|
||||||
|
"before": "",
|
||||||
|
"semicircle": "1",
|
||||||
|
"after": ""
|
||||||
|
}
|
||||||
9
data/widgets/range.json
Normal file
9
data/widgets/range.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"widget" : "range",
|
||||||
|
"descrColor": "red",
|
||||||
|
"after" : "%",
|
||||||
|
"k" : 0.0977,
|
||||||
|
"min" : 0,
|
||||||
|
"max" : 100,
|
||||||
|
"debounce": 500
|
||||||
|
}
|
||||||
7
data/widgets/select.json
Normal file
7
data/widgets/select.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"widget" : "select",
|
||||||
|
"size" : "small",
|
||||||
|
"fill" : "outline",
|
||||||
|
"options" : "["Zero item", "First item", "Second item"]",
|
||||||
|
"status" : 2
|
||||||
|
}
|
||||||
5
data/widgets/toggle.json
Normal file
5
data/widgets/toggle.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget": "toggle",
|
||||||
|
"icon": "",
|
||||||
|
"iconOff": ""
|
||||||
|
}
|
||||||
BIN
doc/pictures/pic1.png
Normal file
BIN
doc/pictures/pic1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
56
include/Bus/BusScanner.h
Normal file
56
include/Bus/BusScanner.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class BusScanner {
|
||||||
|
public:
|
||||||
|
BusScanner(const char* tag, String& out, size_t tries) : _found{0},
|
||||||
|
_tries{tries},
|
||||||
|
_out{&out} {
|
||||||
|
_tag = new char(strlen(tag) + 1);
|
||||||
|
strcpy(_tag, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scan() {
|
||||||
|
init();
|
||||||
|
bool res;
|
||||||
|
do {
|
||||||
|
res = syncScan();
|
||||||
|
} while (!res && --_tries);
|
||||||
|
|
||||||
|
if (!_found) {
|
||||||
|
addResult("не найдено");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* tag() {
|
||||||
|
return _tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void init(){};
|
||||||
|
|
||||||
|
virtual boolean syncScan() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void addResult(const String& str) {
|
||||||
|
_out->concat(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addResult(uint8_t addr, boolean last = true) {
|
||||||
|
_found++;
|
||||||
|
String str = "0x";
|
||||||
|
if (addr < 16) {
|
||||||
|
str += "0";
|
||||||
|
}
|
||||||
|
str += String(addr, HEX);
|
||||||
|
str += !last ? ", " : ", ";
|
||||||
|
addResult(str);
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
char* _tag;
|
||||||
|
size_t _found;
|
||||||
|
size_t _tries;
|
||||||
|
String* _out;
|
||||||
|
};
|
||||||
23
include/Bus/BusScannerFactory.h
Normal file
23
include/Bus/BusScannerFactory.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Bus/BusScanner.h"
|
||||||
|
#include "Bus/I2CScanner.h"
|
||||||
|
#include "Bus/OneWireScanner.h"
|
||||||
|
#include "Consts.h"
|
||||||
|
#include "Utils/JsonUtils.h"
|
||||||
|
|
||||||
|
class BusScannerFactory {
|
||||||
|
public:
|
||||||
|
static BusScanner* get(String& config, BusScanner_t type, String& str) {
|
||||||
|
switch (type) {
|
||||||
|
case BS_I2C:
|
||||||
|
return new I2CScanner(str);
|
||||||
|
case BS_ONE_WIRE: {
|
||||||
|
uint8_t pin = jsonReadInt(config, TAG_ONE_WIRE_PIN);
|
||||||
|
return new OneWireScanner(str, pin);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
12
include/Bus/I2CScanner.h
Normal file
12
include/Bus/I2CScanner.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Bus/BusScanner.h"
|
||||||
|
|
||||||
|
class I2CScanner : public BusScanner {
|
||||||
|
public:
|
||||||
|
I2CScanner(String& out);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void init() override;
|
||||||
|
virtual boolean syncScan() override;
|
||||||
|
};
|
||||||
21
include/Bus/OneWireBus.h
Normal file
21
include/Bus/OneWireBus.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
|
||||||
|
struct OneWireBus_t {
|
||||||
|
OneWire *bus;
|
||||||
|
uint8_t pin;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OneWireBus {
|
||||||
|
public:
|
||||||
|
OneWireBus();
|
||||||
|
OneWire *get(uint8_t pin);
|
||||||
|
size_t count();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<OneWireBus_t> _items;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern OneWireBus oneWireBus;
|
||||||
15
include/Bus/OneWireScanner.h
Normal file
15
include/Bus/OneWireScanner.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BusScanner.h"
|
||||||
|
#include "OneWireBus.h"
|
||||||
|
|
||||||
|
class OneWireScanner : public BusScanner {
|
||||||
|
public:
|
||||||
|
OneWireScanner(String& out, uint8_t pin);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual boolean syncScan() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
OneWire* _bus;
|
||||||
|
};
|
||||||
165
include/Clock.h
Normal file
165
include/Clock.h
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils/TimeUtils.h"
|
||||||
|
#include "Utils/PrintMessage.h"
|
||||||
|
|
||||||
|
#ifdef ESP8266
|
||||||
|
#include "sntp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class Clock {
|
||||||
|
const char* MODULE = "Clock";
|
||||||
|
|
||||||
|
private:
|
||||||
|
Time_t _time_local;
|
||||||
|
Time_t _time_utc;
|
||||||
|
unsigned long _uptime;
|
||||||
|
unsigned long _unixtime;
|
||||||
|
int _timezone;
|
||||||
|
String _ntp;
|
||||||
|
bool _hasSynced;
|
||||||
|
bool _configured;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Clock() : _uptime{0}, _timezone{0}, _ntp{""}, _hasSynced{false}, _configured{false} {};
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
unsigned long passed = millis_since(_uptime);
|
||||||
|
if (passed < ONE_SECOND_ms) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_uptime += passed;
|
||||||
|
|
||||||
|
// world time
|
||||||
|
time_t now = getSystemTime();
|
||||||
|
time_t estimated = _unixtime + (passed / ONE_SECOND_ms);
|
||||||
|
double drift = difftime(now, estimated);
|
||||||
|
if (drift > 1) {
|
||||||
|
// Обработать ситуации c дрифтом времени на значительные величины
|
||||||
|
}
|
||||||
|
// TODO сохранять время на флеше
|
||||||
|
|
||||||
|
_unixtime = now;
|
||||||
|
|
||||||
|
breakEpochToTime(_unixtime, _time_utc);
|
||||||
|
|
||||||
|
breakEpochToTime(_unixtime + getOffsetInSeconds(_timezone), _time_local);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasSync() {
|
||||||
|
if (!_hasSynced) {
|
||||||
|
startSync();
|
||||||
|
}
|
||||||
|
return _hasSynced;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setNtpPool(String ntp) {
|
||||||
|
if (!_ntp.equals(ntp)) {
|
||||||
|
_ntp = ntp;
|
||||||
|
_configured = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTimezone(int timezone) {
|
||||||
|
if (_timezone != timezone) {
|
||||||
|
_timezone = timezone;
|
||||||
|
_configured = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void startSync() {
|
||||||
|
if (!_configured) {
|
||||||
|
pm.info("sync to: " + _ntp + " timezone: " + String(_timezone));
|
||||||
|
setupSntp();
|
||||||
|
_configured = true;
|
||||||
|
// лучше не ждать, проверим в следующий раз
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_hasSynced = hasTimeSynced();
|
||||||
|
if (_hasSynced) {
|
||||||
|
pm.info("synced " + getDateDotFormated() + " " + getTime());
|
||||||
|
} else {
|
||||||
|
pm.error("failed to obtain");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupSntp() {
|
||||||
|
#ifdef ESP2866
|
||||||
|
sntp_setservername(0, _ntp.c_str());
|
||||||
|
sntp_setservername(1, "ru.pool.ntp.org");
|
||||||
|
sntp_setservername(2, "pool.ntp.org");
|
||||||
|
sntp_stop();
|
||||||
|
sntp_set_timezone(0); // UTC time
|
||||||
|
sntp_init();
|
||||||
|
#else
|
||||||
|
configTime(0, 0, _ntp.c_str(), "ru.pool.ntp.org", "pool.ntp.org");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasTimeSynced() const {
|
||||||
|
return _unixtime > MIN_DATETIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t getSystemTime() const {
|
||||||
|
timeval tv{0, 0};
|
||||||
|
timezone tz = timezone{0, 0};
|
||||||
|
time_t epoch = 0;
|
||||||
|
if (gettimeofday(&tv, &tz) != -1) {
|
||||||
|
epoch = tv.tv_sec;
|
||||||
|
}
|
||||||
|
return epoch;
|
||||||
|
}
|
||||||
|
|
||||||
|
const String getTimeUnix() {
|
||||||
|
return String(_unixtime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Локальное время "дд.ММ.гг"
|
||||||
|
*/
|
||||||
|
const String getDateDotFormated() {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%02d.%02d.%02d", _time_local.day_of_month, _time_local.month, _time_local.year);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Локальное дата время "дд.ММ.гг чч.мм.cc"
|
||||||
|
*/
|
||||||
|
const String getDateTimeDotFormated() {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%02d.%02d.%02d %02d:%02d:%02d", _time_local.day_of_month, _time_local.month, _time_local.year, _time_local.hour, _time_local.minute, _time_local.second);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Локальное время "чч:мм:cc"
|
||||||
|
*/
|
||||||
|
const String getTime() {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%02d:%02d:%02d", _time_local.hour, _time_local.minute, _time_local.second);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
const String getTimeJson() {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%02d-%02d-%02d", _time_local.hour, _time_local.minute, _time_local.second);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Локальное время "чч:мм"
|
||||||
|
*/
|
||||||
|
const String getTimeWOsec() {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%02d:%02d", _time_local.hour, _time_local.minute);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Время с момента запуска "чч:мм:cc" далее "дд чч:мм"
|
||||||
|
*/
|
||||||
|
const String getUptime() {
|
||||||
|
return prettyMillis(_uptime);
|
||||||
|
}
|
||||||
|
};
|
||||||
116
include/Consts.h
Normal file
116
include/Consts.h
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#pragma once
|
||||||
|
/*
|
||||||
|
* Main consts
|
||||||
|
*/
|
||||||
|
#define FIRMWARE_VERSION "2.3.5"
|
||||||
|
#define NUM_BUTTONS 6
|
||||||
|
#define LED_PIN 2
|
||||||
|
#define FLASH_4MB true
|
||||||
|
#define MQTT_RECONNECT_INTERVAL 20000
|
||||||
|
// 1000 * 60 * 60 * 2
|
||||||
|
#define TELEMETRY_UPDATE_INTERVAL 0
|
||||||
|
|
||||||
|
#define DEVICE_CONFIG_FILE "dev_conf.txt"
|
||||||
|
#define DEVICE_SCENARIO_FILE "dev_scen.txt"
|
||||||
|
#define DEFAULT_PRESET 100
|
||||||
|
#define DEFAULT_SCENARIO 100
|
||||||
|
|
||||||
|
#define TAG_ONE_WIRE "oneWire"
|
||||||
|
#define TAG_I2C "i2c"
|
||||||
|
#define TAG_ONE_WIRE_PIN "oneWirePin"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optional
|
||||||
|
*/
|
||||||
|
//#define OTA_UPDATES_ENABLED
|
||||||
|
//#define MDNS_ENABLED
|
||||||
|
//#define WEBSOCKET_ENABLED
|
||||||
|
//#define LAYOUT_IN_RAM
|
||||||
|
#define UDP_ENABLED
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sensor
|
||||||
|
*/
|
||||||
|
#define TANK_LEVEL_SAMPLES 10
|
||||||
|
#define LEVEL_ENABLED
|
||||||
|
#define ANALOG_ENABLED
|
||||||
|
#define DALLAS_ENABLED
|
||||||
|
#define DHT_ENABLED
|
||||||
|
#define BMP_ENABLED
|
||||||
|
#define BME_ENABLED
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gears
|
||||||
|
*/
|
||||||
|
#define STEPPER_ENABLED
|
||||||
|
#define SERVO_ENABLED
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Other
|
||||||
|
*/
|
||||||
|
#define LOGGING_ENABLED
|
||||||
|
#define SERIAL_ENABLED
|
||||||
|
#define PUSH_ENABLED
|
||||||
|
|
||||||
|
struct Time_t {
|
||||||
|
uint8_t second;
|
||||||
|
uint8_t minute;
|
||||||
|
uint8_t hour;
|
||||||
|
uint8_t day_of_week;
|
||||||
|
uint8_t day_of_month;
|
||||||
|
uint8_t month;
|
||||||
|
uint16_t day_of_year;
|
||||||
|
uint16_t year;
|
||||||
|
unsigned long days;
|
||||||
|
unsigned long valid;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TimerTask_t { WIFI_SCAN,
|
||||||
|
WIFI_MQTT_CONNECTION_CHECK,
|
||||||
|
SENSORS,
|
||||||
|
STEPPER1,
|
||||||
|
STEPPER2,
|
||||||
|
LOG1,
|
||||||
|
LOG2,
|
||||||
|
LOG3,
|
||||||
|
LOG4,
|
||||||
|
LOG5,
|
||||||
|
TIMER_COUNTDOWN,
|
||||||
|
TIME,
|
||||||
|
TIME_SYNC,
|
||||||
|
STATISTICS,
|
||||||
|
UPTIME,
|
||||||
|
UDP,
|
||||||
|
UDP_DB,
|
||||||
|
TEST };
|
||||||
|
|
||||||
|
enum ErrorType_t {
|
||||||
|
ET_NONE,
|
||||||
|
ET_FUNCTION,
|
||||||
|
ET_MODULE,
|
||||||
|
ET_SYSTEM
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ErrorLevel_t {
|
||||||
|
EL_NONE,
|
||||||
|
EL_INFO,
|
||||||
|
EL_WARNING,
|
||||||
|
EL_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LedStatus_t {
|
||||||
|
LED_OFF,
|
||||||
|
LED_ON,
|
||||||
|
LED_SLOW,
|
||||||
|
LED_FAST
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ConfigType_t {
|
||||||
|
CT_CONFIG,
|
||||||
|
CT_SCENARIO
|
||||||
|
};
|
||||||
|
|
||||||
|
enum BusScanner_t {
|
||||||
|
BS_I2C,
|
||||||
|
BS_ONE_WIRE
|
||||||
|
};
|
||||||
26
include/ESP32.h
Normal file
26
include/ESP32.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
// don't change order
|
||||||
|
#include "WiFi.h"
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ESPAsyncWebServer.h"
|
||||||
|
#include "SPIFFSEditor.h"
|
||||||
|
// don't change order
|
||||||
|
#include <AsyncUDP.h>
|
||||||
|
#include <ESP32Servo.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#include <HTTPUpdate.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <analogWrite.h>
|
||||||
|
|
||||||
|
#ifdef MDNS_ENABLED
|
||||||
|
#include <ESPmDNS.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern AsyncUDP udp;
|
||||||
|
|
||||||
|
#endif
|
||||||
19
include/ESP8266.h
Normal file
19
include/ESP8266.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef ESP8266
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
#include <ESP8266HTTPUpdate.h>
|
||||||
|
#include "ESPAsyncTCP.h"
|
||||||
|
#include "ESPAsyncWebServer.h"
|
||||||
|
#include <LittleFS.h>
|
||||||
|
#include <SPIFFSEditor.h>
|
||||||
|
#include <Servo.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#ifdef MDNS_ENABLED
|
||||||
|
#include <ESP8266mDNS.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern WiFiUDP udp;
|
||||||
|
|
||||||
|
#endif
|
||||||
52
include/Errors.h
Normal file
52
include/Errors.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
String getErrorLevelStr(ErrorLevel_t level);
|
||||||
|
|
||||||
|
class Error : public Printable {
|
||||||
|
public:
|
||||||
|
static Error OK() {
|
||||||
|
return Error();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Error InfoMessage(const char *message) {
|
||||||
|
return Error(EL_INFO, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Error ErrorMessage(const char *message) {
|
||||||
|
return Error(EL_ERROR, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
Error() : _type{ET_NONE}, _level{EL_NONE} {};
|
||||||
|
|
||||||
|
Error(const ErrorLevel_t level, const char *message) : Error(ET_FUNCTION, level, message){};
|
||||||
|
|
||||||
|
Error(const ErrorType_t type, const ErrorLevel_t level, const char *message) : _type{type}, _level{level} {
|
||||||
|
strncpy(_message, message, sizeof(_message));
|
||||||
|
};
|
||||||
|
|
||||||
|
const ErrorLevel_t level() const { return _level; }
|
||||||
|
|
||||||
|
const ErrorType_t type() const { return _type; }
|
||||||
|
|
||||||
|
const char *message() const { return _message; }
|
||||||
|
|
||||||
|
operator bool() const { return _level != EL_NONE; }
|
||||||
|
|
||||||
|
const String toString() const {
|
||||||
|
char buf[128];
|
||||||
|
sprintf(buf, "[%s] %s", getErrorLevelStr(_level).c_str(), _message);
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t printTo(Print &p) const {
|
||||||
|
return p.println(toString().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
char _message[128];
|
||||||
|
ErrorType_t _type;
|
||||||
|
ErrorLevel_t _level;
|
||||||
|
};
|
||||||
272
include/Global.h
Normal file
272
include/Global.h
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Libraries
|
||||||
|
*/
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include "ESP32.h"
|
||||||
|
#include "ESP8266.h"
|
||||||
|
//
|
||||||
|
#include "Consts.h"
|
||||||
|
#include "Errors.h"
|
||||||
|
#include "GyverFilters.h"
|
||||||
|
#include "Upgrade.h"
|
||||||
|
#include "Clock.h"
|
||||||
|
|
||||||
|
#include "MqttClient.h"
|
||||||
|
#include "Utils\FileUtils.h"
|
||||||
|
#include "Utils\JsonUtils.h"
|
||||||
|
#include "Utils\StringUtils.h"
|
||||||
|
#include "Utils\SysUtils.h"
|
||||||
|
#include "Utils\PrintMessage.h"
|
||||||
|
#include "Utils\WiFiUtils.h"
|
||||||
|
|
||||||
|
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
|
||||||
|
|
||||||
|
#include <Adafruit_BME280.h>
|
||||||
|
#include <Adafruit_BMP280.h>
|
||||||
|
#include <Bounce2.h>
|
||||||
|
#include <DHTesp.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <PubSubClient.h>
|
||||||
|
#include <StringCommand.h>
|
||||||
|
#include <TickerScheduler.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <ArduinoOTA.h>
|
||||||
|
|
||||||
|
#ifdef WEBSOCKET_ENABLED
|
||||||
|
extern AsyncWebSocket ws;
|
||||||
|
//extern AsyncEventSource events;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern Clock* timeNow;
|
||||||
|
|
||||||
|
extern TickerScheduler ts;
|
||||||
|
|
||||||
|
extern WiFiClient espClient;
|
||||||
|
|
||||||
|
extern PubSubClient mqtt;
|
||||||
|
|
||||||
|
extern StringCommand sCmd;
|
||||||
|
|
||||||
|
extern AsyncWebServer server;
|
||||||
|
|
||||||
|
extern DallasTemperature sensors;
|
||||||
|
|
||||||
|
extern boolean but[NUM_BUTTONS];
|
||||||
|
|
||||||
|
extern Bounce* buttons;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global vars
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern boolean just_load;
|
||||||
|
|
||||||
|
extern String configSetupJson; //все настройки
|
||||||
|
extern String configLiveJson; //все данные с датчиков (связан с mqtt)
|
||||||
|
extern String configOptionJson; //для трансфера
|
||||||
|
|
||||||
|
extern String chipId;
|
||||||
|
extern String prex;
|
||||||
|
extern String all_widgets;
|
||||||
|
extern String scenario;
|
||||||
|
extern String order_loop;
|
||||||
|
|
||||||
|
extern String analog_value_names_list;
|
||||||
|
extern int enter_to_analog_counter;
|
||||||
|
|
||||||
|
extern String dallas_value_name;
|
||||||
|
extern int enter_to_dallas_counter;
|
||||||
|
|
||||||
|
extern String levelPr_value_name;
|
||||||
|
extern String ultrasonicCm_value_name;
|
||||||
|
|
||||||
|
extern String dhtT_value_name;
|
||||||
|
extern String dhtH_value_name;
|
||||||
|
|
||||||
|
extern String bmp280T_value_name;
|
||||||
|
extern String bmp280P_value_name;
|
||||||
|
|
||||||
|
extern String bme280T_value_name;
|
||||||
|
extern String bme280P_value_name;
|
||||||
|
extern String bme280H_value_name;
|
||||||
|
extern String bme280A_value_name;
|
||||||
|
|
||||||
|
extern String logging_value_names_list;
|
||||||
|
extern int enter_to_logging_counter;
|
||||||
|
|
||||||
|
extern int scenario_line_status[40];
|
||||||
|
|
||||||
|
extern String lastVersion;
|
||||||
|
|
||||||
|
extern boolean checkUpdatesFlag;
|
||||||
|
extern boolean updateFlag;
|
||||||
|
extern boolean mqttParamsChanged;
|
||||||
|
extern boolean udp_data_parse;
|
||||||
|
extern boolean mqtt_send_settings_to_udp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Запрос на скарнирование шины
|
||||||
|
*/
|
||||||
|
extern boolean busScanFlag;
|
||||||
|
/*
|
||||||
|
* Запрос на сканирование шины, указание какую
|
||||||
|
*/
|
||||||
|
extern BusScanner_t busToScan;
|
||||||
|
|
||||||
|
extern boolean fsCheckFlag;
|
||||||
|
|
||||||
|
extern int sensors_reading_map[15];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Cmd
|
||||||
|
extern void cmd_init();
|
||||||
|
extern void button();
|
||||||
|
extern void buttonSet();
|
||||||
|
extern void buttonChange();
|
||||||
|
extern void pinSet();
|
||||||
|
extern void pinChange();
|
||||||
|
extern void handle_time_init();
|
||||||
|
extern void pwm();
|
||||||
|
extern void switch_();
|
||||||
|
extern void pwmSet();
|
||||||
|
extern void stepper();
|
||||||
|
extern void stepperSet();
|
||||||
|
extern void servo_();
|
||||||
|
extern void servoSet();
|
||||||
|
extern void serialBegin();
|
||||||
|
extern void serialWrite();
|
||||||
|
extern void logging();
|
||||||
|
extern void inputDigit();
|
||||||
|
extern void digitSet();
|
||||||
|
extern void inputTime();
|
||||||
|
extern void button();
|
||||||
|
extern void timeSet();
|
||||||
|
extern void text();
|
||||||
|
extern void textSet();
|
||||||
|
extern void mqttOrderSend();
|
||||||
|
extern void httpOrderSend();
|
||||||
|
extern void firmwareVersion();
|
||||||
|
extern void firmwareUpdate();
|
||||||
|
extern void loadScenario();
|
||||||
|
|
||||||
|
extern void fileExecute(const String& filename);
|
||||||
|
extern void stringExecute(String& cmdStr);
|
||||||
|
// Init
|
||||||
|
extern void loadConfig();
|
||||||
|
extern void all_init();
|
||||||
|
extern void statistics_init();
|
||||||
|
extern void loadScenario();
|
||||||
|
extern void Device_init();
|
||||||
|
extern void prsets_init();
|
||||||
|
|
||||||
|
// Logging
|
||||||
|
extern void logging();
|
||||||
|
extern void deleteOldDate(String filename, size_t max_lines, String date_to_add);
|
||||||
|
extern void clean_log_date();
|
||||||
|
extern void choose_log_date_and_send();
|
||||||
|
|
||||||
|
// Main
|
||||||
|
extern void setChipId();
|
||||||
|
extern void saveConfig();
|
||||||
|
extern void setConfigParam(const char* param, const String& value);
|
||||||
|
|
||||||
|
extern String getURL(const String& urls);
|
||||||
|
extern void do_fscheck();
|
||||||
|
extern void do_scan_bus();
|
||||||
|
extern void servo_();
|
||||||
|
extern void clock_init();
|
||||||
|
|
||||||
|
extern void setLedStatus(LedStatus_t);
|
||||||
|
|
||||||
|
//Scenario
|
||||||
|
extern void eventGen(String event_name, String number);
|
||||||
|
extern String add_set(String param_name);
|
||||||
|
|
||||||
|
//Sensors
|
||||||
|
extern void sensors_init();
|
||||||
|
|
||||||
|
extern void levelPr();
|
||||||
|
extern void ultrasonicCm();
|
||||||
|
extern void ultrasonic_reading();
|
||||||
|
|
||||||
|
extern void analog();
|
||||||
|
extern void analog_reading1();
|
||||||
|
extern void analog_reading2();
|
||||||
|
extern void dallas_reading();
|
||||||
|
extern void dhtT_reading();
|
||||||
|
|
||||||
|
extern void dallas();
|
||||||
|
|
||||||
|
extern void bmp280T();
|
||||||
|
extern void bmp280P();
|
||||||
|
extern void bmp280T_reading();
|
||||||
|
extern void bmp280P_reading();
|
||||||
|
|
||||||
|
extern void bme280T();
|
||||||
|
extern void bme280P();
|
||||||
|
extern void bme280H();
|
||||||
|
extern void bme280A();
|
||||||
|
|
||||||
|
extern void bme280T_reading();
|
||||||
|
extern void bme280P_reading();
|
||||||
|
extern void bme280H_reading();
|
||||||
|
extern void bme280A_reading();
|
||||||
|
|
||||||
|
extern void dhtT();
|
||||||
|
extern void dhtH();
|
||||||
|
extern void dhtP();
|
||||||
|
extern void dhtC();
|
||||||
|
extern void dhtD();
|
||||||
|
extern void dhtH_reading();
|
||||||
|
extern void dhtP_reading();
|
||||||
|
extern void dhtC_reading();
|
||||||
|
extern void dhtD_reading();
|
||||||
|
|
||||||
|
//Timers
|
||||||
|
extern void Timer_countdown_init();
|
||||||
|
extern void timerStart_();
|
||||||
|
extern void addTimer(String number, String time);
|
||||||
|
extern void timerStop_();
|
||||||
|
extern void delTimer(String number);
|
||||||
|
extern int readTimer(int number);
|
||||||
|
|
||||||
|
extern void initUpdater();
|
||||||
|
|
||||||
|
// widget
|
||||||
|
extern void createWidgetByType(String widget_name, String page_name, String page_number, String file, String topic);
|
||||||
|
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
|
||||||
|
extern void createWidget(String widget_name, String page_name, String page_number, String type, String topik);
|
||||||
|
extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount);
|
||||||
|
|
||||||
|
// PushingBox
|
||||||
|
extern void pushControl();
|
||||||
|
|
||||||
|
// UDP
|
||||||
|
extern void udp_init();
|
||||||
|
extern void do_udp_data_parse();
|
||||||
|
extern void do_mqtt_send_settings_to_udp();
|
||||||
|
|
||||||
|
extern void addCommandLoop(const String& cmdStr);
|
||||||
|
extern void loopSerial();
|
||||||
|
extern void loopCmd();
|
||||||
|
extern void loopButton();
|
||||||
|
extern void loopScenario();
|
||||||
|
extern void loopUdp();
|
||||||
|
|
||||||
|
extern void do_update();
|
||||||
|
|
||||||
|
// Init
|
||||||
|
extern void uptime_init();
|
||||||
|
|
||||||
|
// Web
|
||||||
|
extern void web_init();
|
||||||
|
extern void telemetry_init();
|
||||||
9
include/HttpServer.h
Normal file
9
include/HttpServer.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Global.h"
|
||||||
|
|
||||||
|
namespace HttpServer {
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
} // namespace HttpServer
|
||||||
72
include/Module/CharBuffer.h
Normal file
72
include/Module/CharBuffer.h
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class CharBuffer : Print {
|
||||||
|
public:
|
||||||
|
CharBuffer(size_t size) : _capacity(size < 2 ? 2 : size), _write(0), _read(0) {
|
||||||
|
_pool = new char[_capacity + 1];
|
||||||
|
memset(_pool, 0, _capacity + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CharBuffer(const CharBuffer &src) {
|
||||||
|
_capacity = src._capacity;
|
||||||
|
_write = src._write;
|
||||||
|
memcpy(_pool, src._pool, src._write);
|
||||||
|
}
|
||||||
|
|
||||||
|
CharBuffer(const char *str) : CharBuffer(strlen(str) + 1) {
|
||||||
|
write((const uint8_t *)str, strlen(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
~CharBuffer() {
|
||||||
|
delete _pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
memset(_pool, 0, _capacity);
|
||||||
|
_write = 0;
|
||||||
|
_read = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size() const { return _capacity; }
|
||||||
|
|
||||||
|
size_t free() const { return _capacity - _write - 2; }
|
||||||
|
|
||||||
|
size_t available() const { return _write; }
|
||||||
|
|
||||||
|
const char *c_str() {
|
||||||
|
if (_pool[_write] != '\x00')
|
||||||
|
_pool[_write] = '\x00';
|
||||||
|
return _pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t write(char ch) {
|
||||||
|
return write((uint8_t)ch);
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t write(const uint8_t ch) {
|
||||||
|
size_t n = 0;
|
||||||
|
if (_write < (_capacity - 2)) {
|
||||||
|
_pool[_write++] = ch;
|
||||||
|
n = 1;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t write(const uint8_t *ptr, const size_t size) {
|
||||||
|
size_t n = 0;
|
||||||
|
while (n < size) {
|
||||||
|
uint8_t ch = ptr[n++];
|
||||||
|
if (!write(ch))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
char *_pool;
|
||||||
|
size_t _capacity;
|
||||||
|
size_t _write;
|
||||||
|
size_t _read;
|
||||||
|
};
|
||||||
86
include/Module/CircularBuffer.h
Normal file
86
include/Module/CircularBuffer.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
template <typename T, size_t BUFFER_SIZE>
|
||||||
|
class CircularBuffer {
|
||||||
|
public:
|
||||||
|
CircularBuffer() : _head{0}, _tail{0}, _full{false} {}
|
||||||
|
|
||||||
|
~CircularBuffer() {}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
_head = _tail = _full = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const {
|
||||||
|
return _head == _tail && !_full;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool full() const {
|
||||||
|
return _full;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size() const {
|
||||||
|
size_t res = 0;
|
||||||
|
if (!_full) {
|
||||||
|
if (_head < _tail)
|
||||||
|
res = BUFFER_SIZE + _head - _tail;
|
||||||
|
else
|
||||||
|
res = _head - _tail;
|
||||||
|
} else {
|
||||||
|
res = BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(const T &item) {
|
||||||
|
if (_full) {
|
||||||
|
_tail++;
|
||||||
|
if (_tail == BUFFER_SIZE)
|
||||||
|
_tail = 0;
|
||||||
|
}
|
||||||
|
_pool[_head++] = item;
|
||||||
|
if (_head == BUFFER_SIZE)
|
||||||
|
_head = 0;
|
||||||
|
if (_head == _tail)
|
||||||
|
_full = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pop(T &item) {
|
||||||
|
bool res = false;
|
||||||
|
if (!empty()) {
|
||||||
|
item = _pool[_tail++];
|
||||||
|
if (_tail == BUFFER_SIZE) _tail = 0;
|
||||||
|
_full = false;
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pop_back(T &item) {
|
||||||
|
bool res = false;
|
||||||
|
if (!empty()) {
|
||||||
|
item = _pool[--_head];
|
||||||
|
_full = false;
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool peek(T &item) const {
|
||||||
|
bool res = false;
|
||||||
|
if (!empty()) {
|
||||||
|
item = _pool[_tail];
|
||||||
|
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
T _pool[BUFFER_SIZE];
|
||||||
|
size_t _head;
|
||||||
|
size_t _tail;
|
||||||
|
bool _full;
|
||||||
|
};
|
||||||
45
include/Module/CommandShell.h
Normal file
45
include/Module/CommandShell.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#include "Module/Terminal.h"
|
||||||
|
#include "Module/CircularBuffer.h"
|
||||||
|
#include "Module/Runner.h"
|
||||||
|
|
||||||
|
class CommandShell {
|
||||||
|
public:
|
||||||
|
CommandShell(Runner *runner);
|
||||||
|
|
||||||
|
void setTerm(Terminal *term);
|
||||||
|
Terminal *term();
|
||||||
|
|
||||||
|
void showGreetings(bool = true);
|
||||||
|
void showFarewell(bool = true);
|
||||||
|
|
||||||
|
void clearHistory();
|
||||||
|
void addHistory(const char *);
|
||||||
|
bool getHistoryInput(String &);
|
||||||
|
void setEditLine(const String &);
|
||||||
|
bool active();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t printGreetings(Print *);
|
||||||
|
size_t printFarewell(Print *);
|
||||||
|
size_t printPrompt(Print *);
|
||||||
|
|
||||||
|
void onOpen(Print *out);
|
||||||
|
void onClose(Print *out);
|
||||||
|
void onData(const char *);
|
||||||
|
void onHistory(Print *out);
|
||||||
|
bool getLastInput(String &);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CircularBuffer<String, 4> _history;
|
||||||
|
Terminal *_term;
|
||||||
|
Runner *_runner;
|
||||||
|
String _path;
|
||||||
|
bool _active;
|
||||||
|
bool _greetings;
|
||||||
|
bool _farewell;
|
||||||
|
};
|
||||||
68
include/Module/EditLine.h
Normal file
68
include/Module/EditLine.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Module/CharBuffer.h"
|
||||||
|
|
||||||
|
class EditLine : public CharBuffer {
|
||||||
|
public:
|
||||||
|
EditLine(size_t size) : CharBuffer(size){};
|
||||||
|
|
||||||
|
char &operator[](size_t i) { return _pool[i]; }
|
||||||
|
|
||||||
|
char operator[](size_t i) const { return _pool[i]; }
|
||||||
|
|
||||||
|
EditLine &operator=(const EditLine &src) {
|
||||||
|
delete[] _pool;
|
||||||
|
_pool = new char[src._capacity];
|
||||||
|
memcpy(_pool, src._pool, src._capacity);
|
||||||
|
_read = src._read;
|
||||||
|
_write = src._write;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void del() {
|
||||||
|
size_t i;
|
||||||
|
for (i = _write; i < _capacity; ++i)
|
||||||
|
_pool[i] = _pool[i + 1];
|
||||||
|
_pool[i] = '\x00';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool backspace() {
|
||||||
|
bool res = false;
|
||||||
|
if (prev()) {
|
||||||
|
del();
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool next() {
|
||||||
|
bool res = false;
|
||||||
|
if (_write < _capacity - 1) {
|
||||||
|
_write++;
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool prev() {
|
||||||
|
bool res = false;
|
||||||
|
if (_write > 0) {
|
||||||
|
_write--;
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t home() {
|
||||||
|
size_t res = _write;
|
||||||
|
_write = 0;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t end() {
|
||||||
|
size_t n;
|
||||||
|
for (n = 0; n < _capacity - 1; ++n)
|
||||||
|
if (_pool[n] == '\x00') break;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
};
|
||||||
84
include/Module/Module.h
Normal file
84
include/Module/Module.h
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
enum ModuleState_t {
|
||||||
|
MOD_INIT,
|
||||||
|
MOD_INIT_FAILED,
|
||||||
|
MOD_INIT_COMPLETE,
|
||||||
|
MOD_START_FAILED,
|
||||||
|
MOD_ACTIVE
|
||||||
|
};
|
||||||
|
|
||||||
|
class Module {
|
||||||
|
protected:
|
||||||
|
virtual bool onInit() { return true; };
|
||||||
|
virtual void onEnd(){};
|
||||||
|
virtual bool onStart() { return true; }
|
||||||
|
virtual void onStop(){};
|
||||||
|
virtual void onLoop() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Print *_out;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Module() : _state{MOD_INIT} {}
|
||||||
|
|
||||||
|
bool init(bool force = false) {
|
||||||
|
if (_state > MOD_INIT_COMPLETE) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_state == MOD_INIT_FAILED && !force) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_state = onInit() ? MOD_INIT_COMPLETE : MOD_INIT_FAILED;
|
||||||
|
|
||||||
|
return _state == MOD_INIT_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start(bool force = false) {
|
||||||
|
if (_state == MOD_ACTIVE) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_state == MOD_START_FAILED && !force) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (_state < MOD_INIT_COMPLETE) {
|
||||||
|
if (!init(force)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_state = onStart() ? MOD_ACTIVE : MOD_START_FAILED;
|
||||||
|
return _state == MOD_ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop() {
|
||||||
|
if (_state < MOD_ACTIVE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onStop();
|
||||||
|
_state = MOD_INIT_COMPLETE;
|
||||||
|
};
|
||||||
|
|
||||||
|
void end() {
|
||||||
|
if (_state < MOD_INIT_FAILED) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onEnd();
|
||||||
|
_state = MOD_INIT;
|
||||||
|
};
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (_state == MOD_ACTIVE || start()) onLoop();
|
||||||
|
};
|
||||||
|
|
||||||
|
void setOutput(Print *p) { _out = p; }
|
||||||
|
|
||||||
|
ModuleState_t getState() {
|
||||||
|
return _state;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ModuleState_t _state;
|
||||||
|
};
|
||||||
16
include/Module/Runner.h
Normal file
16
include/Module/Runner.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Print.h>
|
||||||
|
|
||||||
|
class Runner {
|
||||||
|
public:
|
||||||
|
virtual void run(const char*, Print*);
|
||||||
|
};
|
||||||
|
|
||||||
|
class CmdRunner : public Runner {
|
||||||
|
public:
|
||||||
|
void run(const char* cmd, Print* out) override {
|
||||||
|
String cmdStr{cmd};
|
||||||
|
stringExecute(cmdStr);
|
||||||
|
}
|
||||||
|
};
|
||||||
51
include/Module/Telnet.h
Normal file
51
include/Module/Telnet.h
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Global.h"
|
||||||
|
|
||||||
|
#include "Module/Module.h"
|
||||||
|
#include "Module/Terminal.h"
|
||||||
|
#include "Module/CommandShell.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
enum TelnetEvent_t {
|
||||||
|
TE_CONNECTED,
|
||||||
|
TE_DISCONNECTED
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::function<void(TelnetEvent_t, WiFiClient*)> TelnetEventHandler;
|
||||||
|
|
||||||
|
class Telnet : public Module {
|
||||||
|
public:
|
||||||
|
Telnet(uint16_t port) : _port{port}, _lastConnected{false} {};
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setEventHandler(TelnetEventHandler);
|
||||||
|
void sendData(const String&);
|
||||||
|
bool hasClient();
|
||||||
|
bool isShellActive();
|
||||||
|
void setCommandShell(CommandShell*);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool onInit() override;
|
||||||
|
void onEnd() override;
|
||||||
|
bool onStart() override;
|
||||||
|
void onStop() override;
|
||||||
|
void onLoop() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onConnect();
|
||||||
|
void onDisconnect();
|
||||||
|
void onData();
|
||||||
|
void onOpen();
|
||||||
|
void onClose();
|
||||||
|
|
||||||
|
private:
|
||||||
|
TelnetEventHandler _eventHandler;
|
||||||
|
uint16_t _port;
|
||||||
|
bool _lastConnected;
|
||||||
|
WiFiClient _client;
|
||||||
|
WiFiServer* _server;
|
||||||
|
Terminal* _term;
|
||||||
|
CommandShell* _shell;
|
||||||
|
};
|
||||||
186
include/Module/Terminal.h
Normal file
186
include/Module/Terminal.h
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#include "Module/EditLine.h"
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#define A_NORMAL 0x0000 // normal
|
||||||
|
#define A_UNDERLINE 0x0001 // underline
|
||||||
|
#define A_REVERSE 0x0002 // reverse
|
||||||
|
#define A_BLINK 0x0004 // blink
|
||||||
|
#define A_BOLD 0x0008 // bold
|
||||||
|
#define A_DIM 0x0010 // dim
|
||||||
|
#define A_STANDOUT A_BOLD // standout (same as bold)
|
||||||
|
|
||||||
|
#define F_BLACK 0x0100 // foreground black
|
||||||
|
#define F_RED 0x0200 // foreground red
|
||||||
|
#define F_GREEN 0x0300 // foreground green
|
||||||
|
#define F_BROWN 0x0400 // foreground brown
|
||||||
|
#define F_BLUE 0x0500 // foreground blue
|
||||||
|
#define F_MAGENTA 0x0600 // foreground magenta
|
||||||
|
#define F_CYAN 0x0700 // foreground cyan
|
||||||
|
#define F_WHITE 0x0800 // foreground white
|
||||||
|
#define F_YELLOW F_BROWN // some terminals show brown as yellow (with A_BOLD)
|
||||||
|
#define F_COLOR 0x0F00 // foreground mask
|
||||||
|
|
||||||
|
#define B_BLACK 0x1000 // background black
|
||||||
|
#define B_RED 0x2000 // background red
|
||||||
|
#define B_GREEN 0x3000 // background green
|
||||||
|
#define B_BROWN 0x4000 // background brown
|
||||||
|
#define B_BLUE 0x5000 // background blue
|
||||||
|
#define B_MAGENTA 0x6000 // background magenta
|
||||||
|
#define B_CYAN 0x7000 // background cyan
|
||||||
|
#define B_WHITE 0x8000 // background white
|
||||||
|
#define B_YELLOW B_BROWN // some terminals show brown as yellow (with A_BOLD)
|
||||||
|
#define B_COLOR 0xF000 // background mask
|
||||||
|
|
||||||
|
#define CHAR_NULL 0x00
|
||||||
|
#define CHAR_BEL 0x07
|
||||||
|
#define CHAR_BS 0x08
|
||||||
|
#define CHAR_SPACE 0x20
|
||||||
|
#define CHAR_TAB 0x09
|
||||||
|
#define CHAR_LF 0x0a
|
||||||
|
#define CHAR_CR 0x0d
|
||||||
|
#define CHR_ZERO 0x30
|
||||||
|
|
||||||
|
#define KEY_DEL 0x7f
|
||||||
|
#define KEY_DOWN 0x80
|
||||||
|
#define KEY_UP 0x81
|
||||||
|
#define KEY_LEFT 0x82
|
||||||
|
#define KEY_RIGHT 0x83
|
||||||
|
#define KEY_HOME 0x84
|
||||||
|
#define KEY_INS 0x86
|
||||||
|
#define KEY_PAGE_DOWN 0x87
|
||||||
|
#define KEY_PAGE_UP 0x88
|
||||||
|
#define KEY_END 0x89
|
||||||
|
#define CHAR_LT 0x8b
|
||||||
|
#define CHAR_CSI 0x9b
|
||||||
|
#define CHAR_ESC 0x1b
|
||||||
|
#define CHAR_BIN 0xFF
|
||||||
|
|
||||||
|
#define ESC_CURSOR_HOME "\x1b[H"
|
||||||
|
#define ESC_SAVE_CURSOR "\x1b[s"
|
||||||
|
#define ESC_UNSAVE_CURSOR "\x1b[u"
|
||||||
|
#define ESC_SAVE_CURSOR_AND_ATTRS "\x1b[7"
|
||||||
|
#define ESC_RESTORE_CURSOR_AND_ATTRS "\x1b[8"
|
||||||
|
|
||||||
|
#define ESC_CLEAR "\x1b[2J"
|
||||||
|
#define ESC_CLEAR_BOTTOM "\x1b[J"
|
||||||
|
#define ESC_CLEAR_EOL "\x1b[0K"
|
||||||
|
|
||||||
|
#define ESC_CURSOR_UP "\x1b[1A"
|
||||||
|
#define ESC_CURSOR_DOWN "\x1b[1B"
|
||||||
|
#define ESC_CURSOR_FORWARD "\x1b[1C"
|
||||||
|
#define ESC_CURSOR_BACKWARD "\x1b[1D"
|
||||||
|
|
||||||
|
#define SEQ_CSI PSTR("\033[") // code introducer
|
||||||
|
#define SEQ_LOAD_G1 PSTR("\033)0") // load G1 character set
|
||||||
|
#define SEQ_CLEAR PSTR("\033[2J") // clear screen
|
||||||
|
#define SEQ_ATTRSET PSTR("\033[0") // set attributes, e.g. "\033[0;7;1m"
|
||||||
|
|
||||||
|
#define SEQ_ATTRSET_BOLD PSTR(";1") // bold
|
||||||
|
#define SEQ_ATTRSET_DIM PSTR(";2") // dim
|
||||||
|
#define SEQ_ATTRSET_FCOLOR PSTR(";3") // forground color
|
||||||
|
#define SEQ_ATTRSET_UNDERLINE PSTR(";4") // underline
|
||||||
|
#define SEQ_ATTRSET_BCOLOR PSTR(";4") // background color
|
||||||
|
#define SEQ_ATTRSET_BLINK PSTR(";5") // blink
|
||||||
|
#define SEQ_ATTRSET_REVERSE PSTR(";7") // reverse
|
||||||
|
|
||||||
|
enum TerminalEventEnum {
|
||||||
|
EVENT_OPEN,
|
||||||
|
EVENT_CLOSE,
|
||||||
|
EVENT_TAB
|
||||||
|
};
|
||||||
|
|
||||||
|
enum SpecialKeyEnum { SPEC_KEY_UP,
|
||||||
|
SPEC_KEY_TAB,
|
||||||
|
SPEC_KEY_ENTER,
|
||||||
|
SPEC_KEY_ESC };
|
||||||
|
|
||||||
|
typedef std::function<bool(SpecialKeyEnum key)> SpecialKeyPressedEvent;
|
||||||
|
|
||||||
|
typedef std::function<void(TerminalEventEnum, Stream *)> TerminalEventHandler;
|
||||||
|
|
||||||
|
typedef std::function<void(const char *)> TerminalInputEventHandler;
|
||||||
|
|
||||||
|
enum EOLType_t { CRLF,
|
||||||
|
LFCR,
|
||||||
|
LF,
|
||||||
|
CR };
|
||||||
|
|
||||||
|
enum State { ST_INACTIVE,
|
||||||
|
ST_NORMAL,
|
||||||
|
ST_ESC_SEQ,
|
||||||
|
ST_CTRL_SEQ };
|
||||||
|
|
||||||
|
class Terminal : public Print {
|
||||||
|
public:
|
||||||
|
Terminal(Stream *stream = nullptr);
|
||||||
|
|
||||||
|
void setStream(Stream *stream);
|
||||||
|
void setEOL(EOLType_t code);
|
||||||
|
void enableControlCodes(bool enabled = true);
|
||||||
|
void enableEcho(bool enabled = true);
|
||||||
|
void enableColors(bool enabled = true);
|
||||||
|
void setOnEvent(TerminalEventHandler);
|
||||||
|
void setOnSpecKeyPress(SpecialKeyPressedEvent);
|
||||||
|
void setOnReadLine(TerminalInputEventHandler);
|
||||||
|
|
||||||
|
bool setLine(const uint8_t *bytes, size_t size);
|
||||||
|
CharBuffer &getLine();
|
||||||
|
|
||||||
|
void backsp();
|
||||||
|
void clear();
|
||||||
|
void clear_line();
|
||||||
|
size_t println(const char *str);
|
||||||
|
size_t println(void);
|
||||||
|
size_t write_P(PGM_P str);
|
||||||
|
size_t write(uint8_t c);
|
||||||
|
size_t write(const uint8_t *buf, size_t size);
|
||||||
|
void writeByDigit(uint8_t i);
|
||||||
|
bool available();
|
||||||
|
void loop();
|
||||||
|
void start();
|
||||||
|
void quit();
|
||||||
|
void initscr();
|
||||||
|
void attrset(uint16_t attr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void move(uint8_t y, uint8_t x);
|
||||||
|
TerminalEventHandler eventHandler_;
|
||||||
|
TerminalInputEventHandler inputHandler_;
|
||||||
|
|
||||||
|
uint8_t attr = 0xff;
|
||||||
|
uint8_t curY = 0xff;
|
||||||
|
uint8_t curX = 0xff;
|
||||||
|
|
||||||
|
unsigned long _lastReceived = 0;
|
||||||
|
State state;
|
||||||
|
Stream *_stream;
|
||||||
|
EditLine _line;
|
||||||
|
char _cc_buf[32] = {0};
|
||||||
|
size_t _cc_pos = 0;
|
||||||
|
bool _color = false;
|
||||||
|
bool _controlCodes = false;
|
||||||
|
bool _echo = false;
|
||||||
|
EOLType_t _eol = CRLF;
|
||||||
|
|
||||||
|
struct ControlCode {
|
||||||
|
const char *cc;
|
||||||
|
const char ch;
|
||||||
|
};
|
||||||
|
|
||||||
|
ControlCode keyMap[10] = {
|
||||||
|
{"G", KEY_HOME}, // 71 Home key
|
||||||
|
{"H", KEY_UP}, // 72 Up arrow
|
||||||
|
{"I", KEY_PAGE_UP}, // 73 PageUp
|
||||||
|
{"K", KEY_LEFT}, // 75 Left arrow
|
||||||
|
{"M", KEY_RIGHT}, // 77 Right arrow
|
||||||
|
{"O", KEY_END}, // 79 End key
|
||||||
|
{"P", KEY_DOWN}, // 80 Down arrow
|
||||||
|
{"Q", KEY_PAGE_DOWN}, // 81 PageDown
|
||||||
|
{"R", KEY_INS}, // 82 Insert
|
||||||
|
{"S", KEY_DEL}, // 83 Delete
|
||||||
|
};
|
||||||
|
};
|
||||||
27
include/MqttClient.h
Normal file
27
include/MqttClient.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
namespace MqttClient {
|
||||||
|
|
||||||
|
void init();
|
||||||
|
boolean connect();
|
||||||
|
void reconnect();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
void subscribe();
|
||||||
|
|
||||||
|
boolean publish(const String& topic, const String& data);
|
||||||
|
boolean publishData(const String& topic, const String& data);
|
||||||
|
boolean publishChart(const String& topic, const String& data);
|
||||||
|
boolean publishControl(String id, String topic, String state);
|
||||||
|
boolean publishChart_test(const String& topic, const String& data);
|
||||||
|
boolean publishStatus(const String& topic, const String& data);
|
||||||
|
|
||||||
|
void publishWidgets();
|
||||||
|
void publishState();
|
||||||
|
|
||||||
|
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
|
||||||
|
const String getStateStr();
|
||||||
|
|
||||||
|
} // namespace MqttClient
|
||||||
8
include/MqttDiscovery.h
Normal file
8
include/MqttDiscovery.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils/SysUtils.h"
|
||||||
|
|
||||||
|
namespace Discovery {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user