Global change

This commit is contained in:
Dmitry Borisenko
2020-06-19 22:14:50 +02:00
parent 446809355b
commit 817a3e5898
90 changed files with 3370 additions and 2709 deletions

View File

@@ -1,10 +1,10 @@
{ {
"name": "IoTmanager", "name": "IoTmanager",
"chipID": "", "chipID": "",
"ssidAP": "WiFi2", "apssid": "IoTmanager",
"passwordAP": "", "appass": "",
"ssid": "rise", "routerssid": "rise",
"password": "hostel3333", "routerpass": "hostel3333",
"timezone": 2, "timezone": 2,
"ntp": "pool.ntp.org", "ntp": "pool.ntp.org",
"mqttServer": "91.204.228.124", "mqttServer": "91.204.228.124",
@@ -12,9 +12,10 @@
"mqttPrefix": "/rise", "mqttPrefix": "/rise",
"mqttUser": "test", "mqttUser": "test",
"mqttPass": "test", "mqttPass": "test",
"scenario": "1", "scen": "1",
"pushingbox_id": "v7C133E426B0C69E", "pushingboxid": "v7C133E426B0C69E",
"web_login": "admin", "weblogin": "admin",
"web_pass": "admin", "webpass": "admin",
"udponoff": "1" "udponoff": "1",
"blink":"1"
} }

View File

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

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

View 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 и отобразит в приложении
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,5 @@
dallas 2 Водонагреватель,#t°C Датчики any-data 1
logging dallas 1 100 Температура Датчики 2
//2 - номер пина датчика
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1,6 @@
dallas > digit1
buttonSet 1 0
end
dallas < digit2
buttonSet 1 1
end

View File

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

View File

@@ -0,0 +1,6 @@
p > digit1
buttonSet 1 0
end
p < digit2
buttonSet 1 1
end

View 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 сек
//задержку выключения можно будет настраивать в приложении

View File

@@ -0,0 +1,7 @@
switch1 = 1
timerStart 1 digit1 sec
buttonSet 1 1
end
timer1 = 0
buttonSet 1 0
end

View 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 - номер пина датчика
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
//написано в текстовом поле, что движение было обнаружено
//так же будет зафиксирован момент времени срабатывания датчика
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении

View File

@@ -0,0 +1,10 @@
switch1 = 1
textSet 1 обнаружено#движение-time
end
button1 = 1
textSet 1 не#обнаружено-time
buttonSet 1 0
end
switch1 = 1
push Внимание обнаружено#движение!
end

View 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 то будет вращаться против часовой стрелки
//можно подключить не более двух шаговиков

View 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

View File

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

View File

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

View 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 градусов.

View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View File

@@ -0,0 +1,4 @@
switch1 = 1
mqtt 3233662-1589485 buttonChange_1
mqtt 2233662-1589486 buttonChange_1
end

6
data/configs/8-pwm.c.txt Normal file
View File

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

1
data/configs/8-pwm.s.txt Normal file
View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

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

View 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

View File

@@ -1,118 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json",
"/config.option.json"
],
"class": "col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Time: {{time}}"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url",
"class": "btn btn-warning btn-lg",
"style": "display:inline",
"title": {
"#": "Выбирите то, во что Вы хотите превратить это устройство <span class=\"caret\"></span>",
"/preset?arg=1": "1.Вкл. выкл. локального реле",
"/preset?arg=2": "2.Вкл. выкл. локального реле в определенное время",
"/preset?arg=3": "3.Вкл. выкл. локального реле на определенный период времени",
"/preset?arg=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
"/preset?arg=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
"/preset?arg=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
"/preset?arg=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
"/preset?arg=8": "8.Широтно импульсная модуляция",
"/preset?arg=9": "9.Сенсор DHT11 и логгирование",
"/preset?arg=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 и логгирование",
"/preset?arg=11": "11.Аналоговый сенсор и логгирование",
"/preset?arg=12": "12.Сенсор DS18B20 и логгирование",
"/preset?arg=13": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
"/preset?arg=14": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование (управление насосом)",
"/preset?arg=15": "15.Датчик движения включающий свет",
"/preset?arg=16": "16.Охранный датчик движения",
"/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/preset?arg=18": "18.Система управления сервоприводами",
"/preset?arg=19": "Настройки по умолчанию"
}
},
{
"type": "h2",
"title": "Конфигурация устройства"
},
{
"type": "file",
"state": "firmware.c.txt",
"style": "width:100%;height:400px",
"title": "Сохранить",
"action": "/init?arg=2",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Подробная инструкция",
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
"class": "btn btn-block btn-primary"
},
{
"type": "h2",
"title": "Сценарии"
},
{
"type": "checkbox",
"name": "scenario",
"title": "Включить сценарии",
"action": "/init?arg=[[scenario]]",
"state": "{{scenario}}"
},
{
"type": "h6",
"title": ""
},
{
"type": "file",
"state": "firmware.s.txt",
"style": "width:100%;height:400px",
"title": "Сохранить",
"action": "/init?arg=4",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Очистить логи сенсоров",
"action": "/init?arg=3",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

Binary file not shown.

View File

@@ -1,92 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "h3",
"title": "Список других устройств в сети:"
},
{
"type": "hr"
},
{
"type": "csv",
"title": [
"html",
"html",
"html"
],
"state": "dev.csv",
"style": "width:100%;",
"class": "nan"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Переформировать список устройств",
"action": "udp?arg=3",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Обновить страницу",
"action": "udp?arg=4",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "После нажатия на кнопку 'Переформировать список устройств' ждите примерно минуту, а затем обновите страницу и список появится вновь"
},
{
"type": "h3",
"title": "Имя этого устройства:"
},
{
"type": "input",
"title": "Имя устройства",
"name": "dev_name",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "Сохранить",
"action": "name?arg=[[dev_name]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "udponoff",
"title": "Включить обмен данными между устройствами",
"action": "/udp?arg=[[udponoff]]",
"state": "{{udponoff}}"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
}
]
}

BIN
data/icon.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View File

@@ -1,7 +1,8 @@
{ {
"configs": [ "configs": [
"/config.live.json", "/config.live.json",
"/config.setup.json" "/config.setup.json",
"/lang/lang.ru.json"
], ],
"title": "Главная", "title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
@@ -9,104 +10,60 @@
{ {
"type": "h5", "type": "h5",
"title": "{{name}}", "title": "{{name}}",
"class": "alert-warning" "class": "alert-default"
}, },
{ {
"type": "h4", "type": "text",
"title": "Device ID: {{chipID}}" "class": "alert alert-light",
}, "title": "<center><img src='/icon.jpeg' alt='IoT Manager'></center>"
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Time: {{time}}"
},
{
"type": "h4",
"title": "Build version: {{firmware_version}}"
},
{
"type": "h4",
"title": "SPIFFS version: 2.3.3"
},
{
"type": "hr"
}, },
{ {
"type": "link", "type": "link",
"title": "Конфигурация устройства", "title": "Конфигурация устройства",
"action": "/?configuration", "action": "/?set.device",
"class": "btn btn-block btn-primary" "class": "btn btn-block btn-default"
},
{
"type": "hr"
}, },
{ {
"type": "link", "type": "link",
"title": "Список других устройств в сети", "title": "Список других устройств в сети",
"action": "/?dev", "action": "/?set.udp",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
}, },
{ {
"type": "link", "type": "link",
"title": "Конфигурация WIFI", "title": "Конфигурация WIFI",
"action": "/?setup", "action": "/?set.wifi",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
}, },
{ {
"type": "link", "type": "link",
"title": "Конфигурация MQTT", "title": "Конфигурация MQTT",
"action": "/?mqtt", "action": "/?set.mqtt",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
}, },
{ {
"type": "link", "type": "link",
"title": "Конфигурация push", "title": "Конфигурация push",
"action": "/?pushingbox", "action": "/?set.push",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
}, },
{ {
"type": "link", "type": "link",
"title": "Утилиты", "title": "Утилиты",
"action": "/?utilities", "action": "/?set.utilities",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "hr"
},
{
"type": "button",
"title": "Обновить прошивку",
"action": "/check",
"response": "[[my-block]]",
"class": "btn btn-block btn-danger"
},
{
"type": "hr"
}, },
{ {
"type": "link", "type": "link",
"title": "Скачать приложение IoT Manager для android", "title": "Скачать приложение IoT Manager для android",
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager", "action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
"class": "btn btn-block btn-warning" "class": "btn btn-block btn-default"
}, },
{ {
"type": "link", "type": "link",
"title": "Скачать приложение IoT Manager для iphone", "title": "Скачать приложение IoT Manager для iphone",
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877", "action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
"class": "btn btn-block btn-warning" "class": "btn btn-block btn-default"
} }
] ]
} }

Binary file not shown.

Binary file not shown.

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

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

View File

@@ -1,111 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство"
},
{
"type": "h4",
"title": "Server name:"
},
{
"type": "input",
"title": "",
"name": "1",
"state": "{{mqttServer}}"
},
{
"type": "h4",
"title": "Port:"
},
{
"type": "input",
"title": "",
"name": "2",
"state": "{{mqttPort}}"
},
{
"type": "h4",
"title": "Prefix:"
},
{
"type": "input",
"title": "",
"name": "3",
"state": "{{mqttPrefix}}"
},
{
"type": "h4",
"title": "User name:"
},
{
"type": "input",
"title": "",
"name": "4",
"state": "{{mqttUser}}"
},
{
"type": "h4",
"title": "Password:"
},
{
"type": "input",
"title": "",
"name": "5",
"state": "{{mqttPass}}"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "Прежде чем нажимать на кнопку <b>'Отправить настройки MQTT'</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
},
{
"type": "button",
"title": "Сохранить",
"action": "mqttSave?mqttServer=[[1]]&mqttPort=[[2]]&mqttPrefix=[[3]]&mqttUser=[[4]]&mqttPass=[[5]]",
"class": "btn btn-block btn-success"
},
{
"type": "button",
"title": "Отправить настройки MQTT с этого устройства на все остальные",
"action": "udp?arg=2",
"class": "btn btn-block btn-success"
},
{
"type": "button",
"title": "Проверить соединение с MQTT",
"action": "mqttCheck",
"response": "[[my-block]]",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

View File

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

143
data/set.device.json Normal file
View File

@@ -0,0 +1,143 @@
{
"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": "SPIFFS version: 2.3.4"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
"/set?preset=1": "1.Вкл. выкл. локального реле",
"/set?preset=2": "2.Вкл. выкл. локального реле в определенное время",
"/set?preset=3": "3.Вкл. выкл. локального реле на определенный период времени",
"/set?preset=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
"/set?preset=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
"/set?preset=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
"/set?preset=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
"/set?preset=8": "8.Широтно импульсная модуляция",
"/set?preset=9": "9.Сенсор DHT11 (темп, влажность) и логгирование",
"/set?preset=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
"/set?preset=11": "11.Аналоговый сенсор и логгирование",
"/set?preset=12": "12.Cенсор bmp280 (темп, давление) и логгирование",
"/set?preset=13": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
"/set?preset=14": "12.Сенсор DS18B20 (темп) и логгирование",
"/set?preset=15": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
"/set?preset=16": "14.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
"/set?preset=17": "15.Датчик движения включающий свет",
"/set?preset=18": "16.Охранный датчик движения",
"/set?preset=19": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/set?preset=20": "18.Система управления сервоприводами",
"/set?preset=21": "Настройки по умолчанию"
}
},
{
"type": "h2",
"title": "{{SetDevConf}}"
},
{
"type": "file",
"state": "firmware.c.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": "firmware.s.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
View 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
View 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
View File

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

View File

@@ -1,7 +1,8 @@
{ {
"configs": [ "configs": [
"/config.live.json", "/config.live.json",
"/config.setup.json" "/config.setup.json",
"/lang/lang.ru.json"
], ],
"title": "Главная", "title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
@@ -9,7 +10,13 @@
{ {
"type": "h5", "type": "h5",
"title": "{{name}}", "title": "{{name}}",
"class": "alert-warning" "class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
}, },
{ {
"type": "hr" "type": "hr"
@@ -25,17 +32,8 @@
{ {
"type": "link", "type": "link",
"title": "Сканировать", "title": "Сканировать",
"action": "/init?arg=5", "action": "/set?itoc",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
} }
] ]
} }

185
data/set.wifi.json Normal file
View 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"
}
]
}

View File

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

View File

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

View File

@@ -1,4 +1,5 @@
#pragma once #pragma once
//Здесь хранятся все настройки прошивки
#define firmware_version "2.3.3" #define firmware_version "2.3.3"

View File

@@ -1,21 +1,27 @@
#pragma once #pragma once
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
#include <Arduino.h> #include <Arduino.h>
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <Bounce2.h> #include <Bounce2.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
extern AsyncWebServer server;
#include <FS.h> #include <FS.h>
#include <PubSubClient.h> #include <PubSubClient.h>
#include <SPIFFSEditor.h> #include <SPIFFSEditor.h>
#include <StringCommand.h> #include <StringCommand.h>
#include <TickerScheduler.h> #include <TickerScheduler.h>
#include <time.h> #include <time.h>
#include "Consts.h" #include "Consts.h"
#include <UpTime.h>
/* #include "GyverFilters.h"
* ESP8266 #include <DallasTemperature.h>
*/ #include <OneWire.h>
#include <DHTesp.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_BME280.h>
//==============ESP8266 БИБЛИОТЕКИ===============
#ifdef ESP8266 #ifdef ESP8266
#include <ESP8266HTTPClient.h> #include <ESP8266HTTPClient.h>
#include <ESP8266HTTPUpdateServer.h> #include <ESP8266HTTPUpdateServer.h>
@@ -29,10 +35,7 @@ WiFiUDP Udp;
#include <ESP8266mDNS.h> #include <ESP8266mDNS.h>
#endif #endif
#endif #endif
//==============ESP32 БИБЛИОТЕКИ===============
/*
* ESP32
*/
#ifdef ESP32 #ifdef ESP32
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include <AsyncUDP.h> #include <AsyncUDP.h>
@@ -55,9 +58,63 @@ extern Servo myServo2;
#include <ArduinoOTA.h> #include <ArduinoOTA.h>
#endif #endif
//==============================Objects.h(без данных)==================================
#ifdef WS_enable
extern AsyncWebSocket ws;
#endif
//extern AsyncEventSource events;
extern TickerScheduler ts;
enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, SENSORS, STEPPER1, STEPPER2, LOG1, LOG2, LOG3, LOG4, LOG5, TIMER_COUNTDOWN, TIME, TIME_SYNC, STATISTICS, UPTIME, UDP, UDP_DB, TEST };
extern WiFiClient espClient;
extern PubSubClient client_mqtt;
extern StringCommand sCmd;
extern AsyncWebServer server; extern AsyncWebServer server;
// Global vars //AsyncWebSocket ws;
//AsyncEventSource events;
#define NUM_BUTTONS
extern boolean but[NUM_BUTTONS];
extern Bounce * buttons;
extern GMedian<10, int> medianFilter;
extern OneWire *oneWire;
extern DallasTemperature sensors;
extern DHTesp dht;
extern Adafruit_BMP280 bmp;
extern Adafruit_Sensor *bmp_temp;
extern Adafruit_Sensor *bmp_pressure;
extern Adafruit_BME280 bme;
extern Adafruit_Sensor *bme_temp;
extern Adafruit_Sensor *bme_pressure;
extern Adafruit_Sensor *bme_humidity;
uptime_interval myUpTime;
///////////////////////////////////// Global vars ////////////////////////////////////////////////////////////////////
extern boolean udp_busy;
extern unsigned int udp_port;
extern IPAddress udp_multicastIP;
extern String received_ip;
extern String received_udp_line;
extern int udp_period;
extern boolean just_load; extern boolean just_load;
extern const char *hostName; extern const char *hostName;
@@ -107,83 +164,10 @@ extern boolean udp_data_parse;
extern boolean mqtt_send_settings_to_udp; extern boolean mqtt_send_settings_to_udp;
extern boolean i2c_scanning; extern boolean i2c_scanning;
#ifdef WS_enable
extern AsyncWebSocket ws;
#endif
extern AsyncEventSource events;
extern int sensors_reading_map[15]; extern int sensors_reading_map[15];
enum {
ROUTER_SEARCHING,
WIFI_MQTT_CONNECTION_CHECK,
SENSORS,
STEPPER1,
STEPPER2,
LOG1,
LOG2,
LOG3,
LOG4,
LOG5,
TIMER_COUNTDOWN,
TIME,
TIME_SYNC,
STATISTICS,
UDP,
UDP_DB,
TEST
};
extern TickerScheduler ts; ///////////////////////////////////// Functions////////////////////////////////////////////////////////////////////
extern WiFiClient espClient;
extern PubSubClient client_mqtt;
extern StringCommand sCmd;
#define NUM_BUTTONS 6
extern boolean but[NUM_BUTTONS];
extern Bounce *buttons;
extern boolean udp_busy;
extern unsigned int udp_port;
extern IPAddress udp_multicastIP;
extern String received_ip;
extern String received_udp_line;
extern int udp_period;
#ifdef level_enable
#include "GyverFilters.h"
extern GMedian<10, int> medianFilter;
#endif
#include <DallasTemperature.h>
#include <OneWire.h>
extern OneWire *oneWire;
extern DallasTemperature sensors;
#include <DHTesp.h>
extern DHTesp dht;
#include <Wire.h>
#ifdef bmp_enable
#include <Adafruit_BMP280.h>
extern Adafruit_BMP280 bmp;
extern Adafruit_Sensor *bmp_temp;
extern Adafruit_Sensor *bmp_pressure;
#endif
#ifdef bme_enable
#include <Adafruit_BME280.h>
extern Adafruit_BME280 bme;
extern Adafruit_Sensor *bme_temp;
extern Adafruit_Sensor *bme_pressure;
extern Adafruit_Sensor *bme_humidity;
#endif
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(14, 12);
// StringUtils // StringUtils
extern uint8_t hexStringToUint8(String hex); extern uint8_t hexStringToUint8(String hex);
@@ -382,3 +366,9 @@ extern void handleScenario();
extern void handleUdp(); extern void handleUdp();
extern void do_upgrade_url(); extern void do_upgrade_url();
extern void do_upgrade(); extern void do_upgrade();
//uptime
extern void handle_uptime();
extern void handle_statistics();
extern void uptime_init();
extern void web_init();

View File

@@ -0,0 +1,2 @@
0.01 2019-01-14
- initial version

View File

@@ -0,0 +1,15 @@
all: README examples/UpTime_tick/README examples/UpTime_synopsis/README
clean:
rm -f README README.bak \
examples/UpTime_tick/README examples/UpTime_tick/README.bak \
examples/UpTime_synopsis/README examples/UpTime_synopsis/README.bak
README: UpTime.h
pod2readme $< $@ && rm -f $@.bak
examples/UpTime_tick/README: examples/UpTime_tick/UpTime_tick.ino
pod2readme $< $@ && rm -f $@.bak
examples/UpTime_synopsis/README: examples/UpTime_synopsis/UpTime_synopsis.ino
pod2readme $< $@ && rm -f $@.bak

99
lib/Arduino-UpTime/README Normal file
View File

@@ -0,0 +1,99 @@
NAME
UpTime.h - Arduino uptime and events in seconds
SYNOPSIS
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}
will output:
uptime: 00:00:00 or 0s
5s elapsed
uptime: 00:00:01 or 1s
uptime: 00:00:02 or 2s
2s elapsed
uptime: 00:00:04 or 4s
2s elapsed
uptime: 00:00:05 or 5s
5s elapsed
uptime: 00:00:07 or 7s
2s elapsed
uptime: 00:00:08 or 8s
2s elapsed
uptime: 00:00:09 or 9s
uptime: 00:00:11 or 11s
2s elapsed
5s elapsed
uptime: 04:41:23 or 16883s
uptime: 04:41:25 or 16885s
2s elapsed
5s elapsed
uptime: 04:41:26 or 16886s
2s elapsed
uptime: 04:41:28 or 16888s
2s elapsed
uptime: 04:41:29 or 16889s
uptime: 04:41:30 or 16890s
2s elapsed
5s elapsed
DESCRIPTION
Uptime class is made to to track uptime of Arduino in seconds. The
uptime() or check() functions has to be called at least once for 0xFFFF
seconds (once in 18h) to work. Seconds will be counted even after
Arduinos millis() overrun and the seconds of unsigned long are enough
to not overrun sooner then in 136+ years. Once 0xFFFF0000 seconds is
elapsed, will trigger reset so that Arduino program clearly starts all
over again.
METHODS
bool check()
Returns true/false if the interval elapset.
void reset(bool postpone = true)
Will reset the time to count from current moment in until interval. If
postpone is set to false, check() will return true with next call.
INSTALL
git clone https://github.com/jozef/Arduino-UpTime sketchbook/libraries/UpTime
EXAMPLES
examples/UpTime_tick/UpTime_synopsis.ino
synopsis section example
examples/UpTime_tick/UpTime_tick.ino
print formatted and raw uptime in seconds und 4x interval
LICENSE
This is free software, licensed under the MIT License.
AUTHOR
Jozef Kutej

View File

@@ -0,0 +1,65 @@
/* see UpTime.h */
#include <Arduino.h>
#include <UpTime.h>
unsigned long _uptime_seconds = 0;
void (*time_to_die)(void) = 0; // reset Arduino after 136+ years
unsigned long uptime() {
unsigned int cur_second = millis() / 1000;
unsigned int _uptime_seconds_uint = _uptime_seconds;
while (_uptime_seconds_uint != cur_second) {
_uptime_seconds++;
_uptime_seconds_uint++;
if (_uptime_seconds > 0xFFFF0000) time_to_die();
}
return _uptime_seconds;
}
uptime_interval::uptime_interval(unsigned int inte, bool postpone) : interval(inte) {
reset(postpone);
}
bool uptime_interval::check() {
if (next <= uptime()) {
next += interval;
return true;
}
return false;
}
void uptime_interval::reset(bool postpone) {
next = (postpone ? _uptime_seconds + interval : _uptime_seconds);
}
String _uptime_two_dig(uint8_t x) {
if (x > 9) {
return String(x);
}
else {
return "0"+String(x);
}
}
String uptime_as_string() {
unsigned long tmp_uptime = uptime();
unsigned long seconds;
unsigned long minutes;
unsigned long hours;
unsigned long days;
seconds = tmp_uptime % 60;
tmp_uptime = tmp_uptime / 60;
minutes = tmp_uptime % 60;
tmp_uptime = tmp_uptime / 60;
hours = tmp_uptime % 24;
days = tmp_uptime / 24;
return (days ? String(days)+'d'+' ' : "")
+ _uptime_two_dig(hours)
+ ':' + _uptime_two_dig(minutes)
+ ':' + _uptime_two_dig(seconds);
}

124
lib/Arduino-UpTime/UpTime.h Normal file
View File

@@ -0,0 +1,124 @@
/* VERSION 0.01; 14.1.2019; see below for description and documentation */
#ifndef UpTime_h
#define UpTime_h
#define UPTIME_RIGHT_AWAY false
unsigned long uptime();
String uptime_as_string();
class uptime_interval {
private:
unsigned long next;
unsigned int interval;
public:
uptime_interval(unsigned int inte, bool postpone = true);
bool check();
void reset(bool postpone = true);
};
#endif
/*
=head1 NAME
UpTime.h - Arduino uptime and events in seconds
=head1 SYNOPSIS
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}
will output:
uptime: 00:00:00 or 0s
5s elapsed
uptime: 00:00:01 or 1s
uptime: 00:00:02 or 2s
2s elapsed
uptime: 00:00:04 or 4s
2s elapsed
uptime: 00:00:05 or 5s
5s elapsed
uptime: 00:00:07 or 7s
2s elapsed
uptime: 00:00:08 or 8s
2s elapsed
uptime: 00:00:09 or 9s
uptime: 00:00:11 or 11s
2s elapsed
5s elapsed
uptime: 04:41:23 or 16883s
uptime: 04:41:25 or 16885s
2s elapsed
5s elapsed
uptime: 04:41:26 or 16886s
2s elapsed
uptime: 04:41:28 or 16888s
2s elapsed
uptime: 04:41:29 or 16889s
uptime: 04:41:30 or 16890s
2s elapsed
5s elapsed
=head1 DESCRIPTION
Uptime class is made to to track uptime of Arduino in seconds. The uptime()
or check() functions has to be called at least once for 0xFFFF seconds
(once in 18h) to work. Seconds will be counted even after Arduinos
millis() overrun and the seconds of unsigned long are enough to not overrun
sooner then in 136+ years. Once 0xFFFF0000 seconds is elapsed, will trigger
reset so that Arduino program clearly starts all over again.
=head1 METHODS
=head2 bool check()
Returns true/false if the interval elapset.
=head2 void reset(bool postpone = true)
Will reset the time to count from current moment in until interval. If
C<postpone> is set to false, check() will return true with next call.
=head1 INSTALL
git clone https://github.com/jozef/Arduino-UpTime sketchbook/libraries/UpTime
=head1 EXAMPLES
=head2 examples/UpTime_tick/UpTime_synopsis.ino
synopsis section example
=head2 examples/UpTime_tick/UpTime_tick.ino
print formatted and raw uptime in seconds und 4x interval
=head1 LICENSE
This is free software, licensed under the MIT License.
=head1 AUTHOR
Jozef Kutej
=cut
*/

View File

@@ -0,0 +1,4 @@
DESCRIPTION
synopsis section example from UpTime.h

View File

@@ -0,0 +1,24 @@
/*
=head1 DESCRIPTION
synopsis section example from UpTime.h
=cut
*/
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}

View File

@@ -0,0 +1,11 @@
NAME
UpTime_tick.ino - print formatted and raw uptime in seconds und 4x
interval
DESCRIPTION
On serial port will print current uptime in seconds with 4 interval
checks. Each loop has random 0-5s delay. Intervals will be printed once
elapsed.

View File

@@ -0,0 +1,52 @@
/*
=head1 NAME
UpTime_tick.ino - print formatted and raw uptime in seconds und 4x interval
=head1 DESCRIPTION
On serial port will print current uptime in seconds with 4 interval checks.
Each loop has random 0-5s delay. Intervals will be printed once elapsed.
=cut
*/
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5);
uptime_interval fire10(10, UPTIME_RIGHT_AWAY);
uptime_interval fire60(60, UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
while (Serial.available()) { Serial.read(); }
randomSeed(analogRead(0));
}
void loop () {
Serial.print("uptime: ");
Serial.println(uptime_as_string());
if (fire2.check()) {
Serial.println("fire 2s");
}
if (fire5.check()) {
Serial.println("fire 5s");
}
if (fire10.check()) {
Serial.println("fire 10s");
}
if (fire60.check()) {
Serial.println("fire 60s");
}
int rand_delay = random(5000);
Serial.print("delay(");
Serial.print(rand_delay);
Serial.println(")");
delay(rand_delay);
}

View File

@@ -2,8 +2,8 @@
#include "push_pushingbox.h" #include "push_pushingbox.h"
void CMD_init() void CMD_init() {
{
sCmd.addCommand("button", button); sCmd.addCommand("button", button);
sCmd.addCommand("buttonSet", buttonSet); sCmd.addCommand("buttonSet", buttonSet);
sCmd.addCommand("buttonChange", buttonChange); sCmd.addCommand("buttonChange", buttonChange);
@@ -90,8 +90,12 @@ void CMD_init()
handle_time_init(); handle_time_init();
} }
void button()
{
//==========================================================================================================
//==========================================Модуль кнопок===================================================
void button() {
String button_number = sCmd.next(); String button_number = sCmd.next();
String button_param = sCmd.next(); String button_param = sCmd.next();
String widget_name = sCmd.next(); String widget_name = sCmd.next();
@@ -102,27 +106,22 @@ void button()
jsonWriteStr(configOptionJson, "button_param" + button_number, button_param); jsonWriteStr(configOptionJson, "button_param" + button_number, button_param);
jsonWriteStr(configLiveJson, "button" + button_number, start_state); jsonWriteStr(configLiveJson, "button" + button_number, start_state);
if (isDigitStr(button_param)) if (isDigitStr (button_param)) {
{
pinMode(button_param.toInt(), OUTPUT); pinMode(button_param.toInt(), OUTPUT);
digitalWrite(button_param.toInt(), start_state.toInt()); digitalWrite(button_param.toInt(), start_state.toInt());
} }
if (button_param == "scenario") if (button_param == "scen") {
{ jsonWriteStr(configSetupJson, "scen", start_state);
jsonWriteStr(configSetupJson, "scenario", start_state);
Scenario_init(); Scenario_init();
saveConfig(); saveConfig();
} }
if (button_param.indexOf("line") != -1) if (button_param.indexOf("line") != -1) {
{
String str = button_param; String str = button_param;
while (str.length() != 0) while (str.length() != 0) {
{ if (str == "") return;
if (str == "") String tmp = selectToMarker (str, ","); //line1,
return;
String tmp = selectToMarker(str, ","); //line1,
String number = deleteBeforeDelimiter(tmp, "e"); //1, String number = deleteBeforeDelimiter(tmp, "e"); //1,
number.replace(",", ""); number.replace(",", "");
Serial.println(number); Serial.println(number);
@@ -131,35 +130,30 @@ void button()
str = deleteBeforeDelimiter(str, ","); str = deleteBeforeDelimiter(str, ",");
} }
} }
createWidget(widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number); createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number);
} }
void buttonSet() void buttonSet() {
{
String button_number = sCmd.next(); String button_number = sCmd.next();
String button_state = sCmd.next(); String button_state = sCmd.next();
String button_param = jsonReadStr(configOptionJson, "button_param" + button_number); String button_param = jsonReadStr(configOptionJson, "button_param" + button_number);
if (button_param != "na" || button_param != "scenario" || button_param.indexOf("line") != -1) if (button_param != "na" || button_param != "scen" || button_param.indexOf("line") != -1) {
{
digitalWrite(button_param.toInt(), button_state.toInt()); digitalWrite(button_param.toInt(), button_state.toInt());
} }
if (button_param == "scenario") if (button_param == "scen") {
{ jsonWriteStr(configSetupJson, "scen", button_state);
jsonWriteStr(configSetupJson, "scenario", button_state);
Scenario_init(); Scenario_init();
saveConfig(); saveConfig();
} }
if (button_param.indexOf("line") != -1) if (button_param.indexOf("line") != -1) {
{
String str = button_param; String str = button_param;
while (str.length() != 0) while (str.length() != 0) {
{ if (str == "") return;
if (str == "") String tmp = selectToMarker (str, ","); //line1,
return;
String tmp = selectToMarker(str, ","); //line1,
String number = deleteBeforeDelimiter(tmp, "e"); //1, String number = deleteBeforeDelimiter(tmp, "e"); //1,
number.replace(",", ""); number.replace(",", "");
Serial.println(number); Serial.println(number);
@@ -169,22 +163,18 @@ void buttonSet()
} }
} }
eventGen("button", button_number); eventGen ("button", button_number);
jsonWriteStr(configLiveJson, "button" + button_number, button_state); jsonWriteStr(configLiveJson, "button" + button_number, button_state);
sendSTATUS("button" + button_number, button_state); sendSTATUS("button" + button_number, button_state);
} }
void buttonChange() void buttonChange() {
{
String button_number = sCmd.next(); String button_number = sCmd.next();
String current_state = jsonReadStr(configLiveJson, "button" + button_number); String current_state = jsonReadStr(configLiveJson, "button" + button_number);
if (current_state == "1") if (current_state == "1") {
{
current_state = "0"; current_state = "0";
} } else if (current_state == "0") {
else if (current_state == "0")
{
current_state = "1"; current_state = "1";
} }
order_loop += "buttonSet " + button_number + " " + current_state + ","; order_loop += "buttonSet " + button_number + " " + current_state + ",";
@@ -192,25 +182,23 @@ void buttonChange()
sendSTATUS("button" + button_number, current_state); sendSTATUS("button" + button_number, current_state);
} }
void pinSet() void pinSet() {
{
String pin_number = sCmd.next(); String pin_number = sCmd.next();
String pin_state = sCmd.next(); String pin_state = sCmd.next();
pinMode(pin_number.toInt(), OUTPUT); pinMode(pin_number.toInt(), OUTPUT);
digitalWrite(pin_number.toInt(), pin_state.toInt()); digitalWrite(pin_number.toInt(), pin_state.toInt());
} }
void pinChange() void pinChange() {
{
String pin_number = sCmd.next(); String pin_number = sCmd.next();
pinMode(pin_number.toInt(), OUTPUT); pinMode(pin_number.toInt(), OUTPUT);
digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt())); digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt()));
} }
//==================================================================================================================
//==========================================Модуль управления ШИМ===================================================
void pwm() {
void pwm() static boolean flag = true;
{
// TODO Unused
// static boolean flag = true;
String pwm_number = sCmd.next(); String pwm_number = sCmd.next();
String pwm_pin = sCmd.next(); String pwm_pin = sCmd.next();
String widget_name = sCmd.next(); String widget_name = sCmd.next();
@@ -219,16 +207,19 @@ void pwm()
String start_state = sCmd.next(); String start_state = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
uint8_t pwm_pin_int = pwm_pin.toInt(); uint8_t pwm_pin_int = pwm_pin.toInt();
jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin); jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin);
pinMode(pwm_pin_int, INPUT); pinMode(pwm_pin_int, INPUT);
analogWrite(pwm_pin_int, start_state.toInt()); analogWrite(pwm_pin_int, start_state.toInt());
//analogWriteFreq(32000);
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state); jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
createWidget(widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number);
createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number);
} }
void pwmSet() void pwmSet() {
{
String pwm_number = sCmd.next(); String pwm_number = sCmd.next();
String pwm_state = sCmd.next(); String pwm_state = sCmd.next();
int pwm_state_int = pwm_state.toInt(); int pwm_state_int = pwm_state.toInt();
@@ -236,15 +227,15 @@ void pwmSet()
int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number); int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number);
analogWrite(pin, pwm_state_int); analogWrite(pin, pwm_state_int);
eventGen("pwm", pwm_number); eventGen ("pwm", pwm_number);
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
sendSTATUS("pwm" + pwm_number, pwm_state); sendSTATUS("pwm" + pwm_number, pwm_state);
} }
//================================================================================================================== //==================================================================================================================
//==========================================Модуль физической кнопки================================================ //==========================================Модуль физической кнопки================================================
void switch_() void switch_ () {
{
String switch_number = sCmd.next(); String switch_number = sCmd.next();
String switch_pin = sCmd.next(); String switch_pin = sCmd.next();
String switch_delay = sCmd.next(); String switch_delay = sCmd.next();
@@ -254,33 +245,32 @@ void switch_()
but[switch_number.toInt()] = true; but[switch_number.toInt()] = true;
} }
void handleButton() void handleButton() {
{
static uint8_t switch_number = 1; static uint8_t switch_number = 1;
if (but[switch_number]) if (but[switch_number]) {
{
buttons[switch_number].update(); buttons[switch_number].update();
if (buttons[switch_number].fell()) if (buttons[switch_number].fell()) {
{
eventGen("switch", String(switch_number)); eventGen ("switch", String(switch_number));
jsonWriteStr(configLiveJson, "switch" + String(switch_number), "1"); jsonWriteStr(configLiveJson, "switch" + String(switch_number), "1");
} }
if (buttons[switch_number].rose()) if (buttons[switch_number].rose()) {
{
eventGen("switch", String(switch_number)); eventGen ("switch", String(switch_number));
jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0"); jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0");
} }
} }
switch_number++; switch_number++;
if (switch_number == NUM_BUTTONS) if (switch_number == 6) switch_number = 0;
switch_number = 0;
} }
void inputDigit() //=====================================================================================================================================
{ //=========================================Добавление окна ввода цифры=================================================================
void inputDigit() {
String value_name = sCmd.next(); String value_name = sCmd.next();
String number = value_name.substring(5); String number = value_name.substring(5);
String widget_name = sCmd.next(); String widget_name = sCmd.next();
@@ -290,19 +280,17 @@ void inputDigit()
String start_state = sCmd.next(); String start_state = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, start_state); jsonWriteStr(configLiveJson, "digit" + number, start_state);
createWidget(widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number);
} }
void digitSet() {
void digitSet()
{
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, value); jsonWriteStr(configLiveJson, "digit" + number, value);
sendSTATUS("digit" + number, value); sendSTATUS("digit" + number, value);
} }
//=====================================================================================================================================
void inputTime() //=========================================Добавление окна ввода времени===============================================================
{ void inputTime() {
String value_name = sCmd.next(); String value_name = sCmd.next();
String number = value_name.substring(4); String number = value_name.substring(4);
String widget_name = sCmd.next(); String widget_name = sCmd.next();
@@ -312,48 +300,47 @@ void inputTime()
String start_state = sCmd.next(); String start_state = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, start_state); jsonWriteStr(configLiveJson, "time" + number, start_state);
createWidget(widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number);
} }
void timeSet() {
void timeSet()
{
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configLiveJson, "time" + number, value); jsonWriteStr(configLiveJson, "time" + number, value);
sendSTATUS("time" + number, value); sendSTATUS("time" + number, value);
} }
void handle_time_init() void handle_time_init() {
{ ts.add(TIME, 1000, [&](void*) {
ts.add(
TIME, 1000, [&](void *) {
String tmp = GetTime(); String tmp = GetTime();
jsonWriteStr(configLiveJson, "time", tmp); jsonWriteStr(configLiveJson, "time", tmp);
tmp.replace(":", "-"); tmp.replace(":", "-");
jsonWriteStr(configLiveJson, "timenow", tmp); jsonWriteStr(configLiveJson, "timenow", tmp);
eventGen("timenow", ""); eventGen ("timenow", "");
},
nullptr, true); }, nullptr, true);
} }
void text() //=====================================================================================================================================
{ //=========================================Добавление текстового виджета============================================================
void text() {
String number = sCmd.next(); String number = sCmd.next();
String widget_name = sCmd.next(); String widget_name = sCmd.next();
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
createWidget(widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number);
} }
void textSet()
{ void textSet() {
String number = sCmd.next(); String number = sCmd.next();
String text = sCmd.next(); String text = sCmd.next();
text.replace("_", " "); text.replace("_", " ");
if (text.indexOf("-time") >= 0) if (text.indexOf("-time") >= 0) {
{
text.replace("-time", ""); text.replace("-time", "");
text.replace("#", " "); text.replace("#", " ");
String time = GetTime(); String time = GetTime();
@@ -364,11 +351,11 @@ void textSet()
jsonWriteStr(configLiveJson, "text" + number, text); jsonWriteStr(configLiveJson, "text" + number, text);
sendSTATUS("text" + number, text); sendSTATUS("text" + number, text);
} }
//=====================================================================================================================================
//=========================================Модуль шагового мотора======================================================================
#ifdef stepper_enable #ifdef stepper_enable
//stepper 1 12 13 //stepper 1 12 13
void stepper() void stepper() {
{
String stepper_number = sCmd.next(); String stepper_number = sCmd.next();
String pin_step = sCmd.next(); String pin_step = sCmd.next();
String pin_dir = sCmd.next(); String pin_dir = sCmd.next();
@@ -379,57 +366,46 @@ void stepper()
} }
//stepperSet 1 100 5 //stepperSet 1 100 5
void stepperSet() void stepperSet() {
{
String stepper_number = sCmd.next(); String stepper_number = sCmd.next();
String steps = sCmd.next(); String steps = sCmd.next();
jsonWriteStr(configOptionJson, "steps" + stepper_number, steps); jsonWriteStr(configOptionJson, "steps" + stepper_number, steps);
String stepper_speed = sCmd.next(); String stepper_speed = sCmd.next();
String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper" + stepper_number), " ");
String pin_dir = deleteBeforeDelimiter(jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); String pin_dir = deleteBeforeDelimiter (jsonReadStr(configOptionJson, "stepper" + stepper_number), " ");
Serial.println(pin_step); Serial.println(pin_step);
Serial.println(pin_dir); Serial.println(pin_dir);
if (steps.toInt() > 0) if (steps.toInt() > 0) digitalWrite(pin_dir.toInt(), HIGH);
digitalWrite(pin_dir.toInt(), HIGH); if (steps.toInt() < 0) digitalWrite(pin_dir.toInt(), LOW);
if (steps.toInt() < 0) if (stepper_number == "1") {
digitalWrite(pin_dir.toInt(), LOW); ts.add(STEPPER1, stepper_speed.toInt(), [&](void*) {
if (stepper_number == "1")
{
ts.add(
STEPPER1, stepper_speed.toInt(), [&](void *) {
int steps_int = abs(jsonReadInt(configOptionJson, "steps1") * 2); int steps_int = abs(jsonReadInt(configOptionJson, "steps1") * 2);
static int count; static int count;
count++; count++;
String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper1"), " "); String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper1"), " ");
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
yield(); yield();
if (count > steps_int) if (count > steps_int) {
{
digitalWrite(pin_step.toInt(), LOW); digitalWrite(pin_step.toInt(), LOW);
ts.remove(STEPPER1); ts.remove(STEPPER1);
count = 0; count = 0;
} }
}, }, nullptr, true);
nullptr, true);
} }
if (stepper_number == "2") if (stepper_number == "2") {
{ ts.add(STEPPER2, stepper_speed.toInt(), [&](void*) {
ts.add(
STEPPER2, stepper_speed.toInt(), [&](void *) {
int steps_int = abs(jsonReadInt(configOptionJson, "steps2") * 2); int steps_int = abs(jsonReadInt(configOptionJson, "steps2") * 2);
static int count; static int count;
count++; count++;
String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper2"), " "); String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper2"), " ");
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
yield(); yield();
if (count > steps_int) if (count > steps_int) {
{
digitalWrite(pin_step.toInt(), LOW); digitalWrite(pin_step.toInt(), LOW);
ts.remove(STEPPER2); ts.remove(STEPPER2);
count = 0; count = 0;
} }
}, }, nullptr, true);
nullptr, true);
} }
} }
#endif #endif
@@ -437,8 +413,7 @@ void stepperSet()
//=================================================================Сервоприводы======================================================================= //=================================================================Сервоприводы=======================================================================
#ifdef servo_enable #ifdef servo_enable
//servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2 //servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
void servo_() void servo_() {
{
String servo_number = sCmd.next(); String servo_number = sCmd.next();
String servo_pin = sCmd.next(); String servo_pin = sCmd.next();
String start_state = sCmd.next(); String start_state = sCmd.next();
@@ -457,8 +432,7 @@ void servo_()
jsonWriteStr(configOptionJson, "servo_pin" + servo_number, servo_pin); jsonWriteStr(configOptionJson, "servo_pin" + servo_number, servo_pin);
start_state_int = map(start_state_int, min_value.toInt(), max_value.toInt(), min_deg.toInt(), max_deg.toInt()); start_state_int = map(start_state_int, min_value.toInt(), max_value.toInt(), min_deg.toInt(), max_deg.toInt());
if (servo_number == "1") if (servo_number == "1") {
{
#ifdef ESP8266 #ifdef ESP8266
myServo1.attach(servo_pin.toInt()); myServo1.attach(servo_pin.toInt());
myServo1.write(start_state_int); myServo1.write(start_state_int);
@@ -469,8 +443,7 @@ void servo_()
#endif #endif
} }
if (servo_number == "2") if (servo_number == "2") {
{
#ifdef ESP8266 #ifdef ESP8266
myServo2.attach(servo_pin.toInt()); myServo2.attach(servo_pin.toInt());
myServo2.write(start_state_int); myServo2.write(start_state_int);
@@ -488,17 +461,15 @@ void servo_()
jsonWriteStr(configLiveJson, "servo" + servo_number, start_state); jsonWriteStr(configLiveJson, "servo" + servo_number, start_state);
createWidgetParam(widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1"); createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
} }
void servoSet() void servoSet() {
{
String servo_number = sCmd.next(); String servo_number = sCmd.next();
String servo_state = sCmd.next(); String servo_state = sCmd.next();
int servo_state_int = servo_state.toInt(); int servo_state_int = servo_state.toInt();
// TODO Unused int pin = jsonReadInt(configOptionJson, "servo_pin" + servo_number);
//int pin = jsonReadInt(configOptionJson, "servo_pin" + servo_number);
servo_state_int = map(servo_state_int, servo_state_int = map(servo_state_int,
jsonReadInt(configOptionJson, "s_min_val" + servo_number), jsonReadInt(configOptionJson, "s_min_val" + servo_number),
@@ -506,8 +477,7 @@ void servoSet()
jsonReadInt(configOptionJson, "s_min_deg" + servo_number), jsonReadInt(configOptionJson, "s_min_deg" + servo_number),
jsonReadInt(configOptionJson, "s_max_deg" + servo_number)); jsonReadInt(configOptionJson, "s_max_deg" + servo_number));
if (servo_number == "1") if (servo_number == "1") {
{
#ifdef ESP8266 #ifdef ESP8266
myServo1.write(servo_state_int); myServo1.write(servo_state_int);
#endif #endif
@@ -516,8 +486,7 @@ void servoSet()
#endif #endif
} }
if (servo_number == "2") if (servo_number == "2") {
{
#ifdef ESP8266 #ifdef ESP8266
myServo2.write(servo_state_int); myServo2.write(servo_state_int);
#endif #endif
@@ -526,7 +495,9 @@ void servoSet()
#endif #endif
} }
eventGen("servo", servo_number); //Serial.println(servo_state_int);
eventGen ("servo", servo_number);
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
sendSTATUS("servo" + servo_number, servo_state); sendSTATUS("servo" + servo_number, servo_state);
@@ -535,8 +506,7 @@ void servoSet()
//==================================================================================================================================================== //====================================================================================================================================================
//===================================================================================serial=========================================================== //===================================================================================serial===========================================================
#ifdef serial_enable #ifdef serial_enable
void serialBegin() void serialBegin() {
{
//String s_speed = sCmd.next(); //String s_speed = sCmd.next();
//String rxPin = sCmd.next(); //String rxPin = sCmd.next();
//String txPin = sCmd.next(); //String txPin = sCmd.next();
@@ -544,8 +514,7 @@ void serialBegin()
//mySerial.begin(s_speed.toInt()); //mySerial.begin(s_speed.toInt());
} }
void serialWrite() void serialWrite() {
{
//String text = sCmd.next(); //String text = sCmd.next();
//mySerial.println(text); //mySerial.println(text);
} }
@@ -553,17 +522,20 @@ void serialWrite()
//==================================================================================================================================================== //====================================================================================================================================================
//=================================================Глобальные команды удаленного управления=========================================================== //=================================================Глобальные команды удаленного управления===========================================================
void mqttOrderSend() void mqttOrderSend() {
{
String id = sCmd.next(); String id = sCmd.next();
String order = sCmd.next(); String order = sCmd.next();
String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/order"; String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/order";
client_mqtt.publish(all_line.c_str(), order.c_str(), false); //Serial.print(all_line);
//Serial.print("->");
//Serial.println(order);
int send_status = client_mqtt.publish (all_line.c_str(), order.c_str(), false);
} }
void httpOrderSend() void httpOrderSend() {
{
String ip = sCmd.next(); String ip = sCmd.next();
String order = sCmd.next(); String order = sCmd.next();
order.replace("_", "%20"); order.replace("_", "%20");
@@ -585,10 +557,10 @@ void firmwareVersion() {
//============================================================================================================================== //==============================================================================================================================
//============================выполнение команд (в лупе) по очереди из строки order============================================= //============================выполнение команд (в лупе) по очереди из строки order=============================================
void handleCMD_loop() void handleCMD_loop() {
{
if (order_loop != "") if (order_loop != "") {
{
String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1, String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1,
sCmd.readStr(tmp); //выполняем первую команду sCmd.readStr(tmp); //выполняем первую команду
Serial.println("[ORDER] => " + order_loop); Serial.println("[ORDER] => " + order_loop);
@@ -596,32 +568,34 @@ void handleCMD_loop()
} }
} }
void txtExecution(String file) //=======================================================================================================================================
{ //=======================================================================================================================================
void txtExecution(String file) {
String command_all = readFile(file, 2048) + "\r\n"; String command_all = readFile(file, 2048) + "\r\n";
command_all.replace("\r\n", "\n"); command_all.replace("\r\n", "\n");
command_all.replace("\r", "\n"); command_all.replace("\r", "\n");
while (command_all.length() != 0) while (command_all.length() != 0) {
{
String tmp = selectToMarker(command_all, "\n"); String tmp = selectToMarker (command_all, "\n");
sCmd.readStr(tmp); sCmd.readStr(tmp);
command_all = deleteBeforeDelimiter(command_all, "\n"); command_all = deleteBeforeDelimiter(command_all, "\n");
} }
command_all = ""; command_all = "";
} }
void stringExecution(String str) void stringExecution(String str) {
{
str = str + "\r\n"; str = str + "\r\n";
str.replace("\r\n", "\n"); str.replace("\r\n", "\n");
str.replace("\r", "\n"); str.replace("\r", "\n");
while (str.length()) while (str.length() != 0) {
{
String tmp = selectToMarker(str, "\n"); String tmp = selectToMarker (str, "\n");
sCmd.readStr(tmp); sCmd.readStr(tmp);
str = deleteBeforeDelimiter(str, "\n"); str = deleteBeforeDelimiter(str, "\n");

View File

@@ -1,6 +1,7 @@
#include "Global.h" #include "Global.h"
void File_system_init() { void File_system_init() {
Serial.begin(115200); Serial.begin(115200);
//Serial.setDebugOutput(true); //Serial.setDebugOutput(true);
Serial.println("--------------started----------------"); Serial.println("--------------started----------------");
@@ -10,8 +11,9 @@ void File_system_init() {
configSetupJson.replace(" ", ""); configSetupJson.replace(" ", "");
configSetupJson.replace("\r\n", ""); configSetupJson.replace("\r\n", "");
Serial.println(configSetupJson); Serial.println(configSetupJson);
jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name")); //jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name"));
jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang")); //jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang"));
#ifdef ESP32 #ifdef ESP32
uint32_t chipID_u = ESP.getEfuseMac(); uint32_t chipID_u = ESP.getEfuseMac();
@@ -20,7 +22,7 @@ void File_system_init() {
#endif #endif
#ifdef ESP8266 #ifdef ESP8266
chipID = String(ESP.getChipId()) + "-" + String(ESP.getFlashChipId()); chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId());
jsonWriteStr(configSetupJson, "chipID", chipID); jsonWriteStr(configSetupJson, "chipID", chipID);
Serial.setDebugOutput(0); Serial.setDebugOutput(0);
#endif #endif
@@ -29,7 +31,10 @@ void File_system_init() {
prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID; prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID;
Serial.println(chipID); Serial.println(chipID);
} }
void get_esp_info() { void get_esp_info() {
} }

View File

@@ -1,23 +1,52 @@
#include "Global.h" #include "Global.h"
#include "JsonUtils.h" #include "JsonUtils.h"
//==============================Objects.cpp(с данными)==================================
#ifdef WS_enable
AsyncWebSocket ws;
#endif
//AsyncEventSource events;
TickerScheduler ts(TEST + 1); TickerScheduler ts(TEST + 1);
WiFiClient espClient; WiFiClient espClient;
PubSubClient client_mqtt(espClient); PubSubClient client_mqtt(espClient);
StringCommand sCmd; StringCommand sCmd;
// Web
AsyncWebServer server(80); AsyncWebServer server(80);
#ifdef WS_enable //AsyncWebSocket ws("/ws");
AsyncWebSocket ws("/ws");
#endif
AsyncEventSource events("/events"); //AsyncEventSource events("/events");
#define NUM_BUTTONS 6
boolean but[NUM_BUTTONS];
Bounce * buttons = new Bounce[NUM_BUTTONS];
GMedian<10, int> medianFilter;
OneWire *oneWire;
DallasTemperature sensors;
DHTesp dht;
Adafruit_BMP280 bmp;
Adafruit_Sensor *bmp_temp;
Adafruit_Sensor *bmp_pressure;
Adafruit_BME280 bme;
Adafruit_Sensor *bme_temp;
Adafruit_Sensor *bme_pressure;
Adafruit_Sensor *bme_humidity;
uptime_interval myUpTime(10);
////////////////////////////////////// Global vars ////////////////////////////////////////////////////////////////////
// Global vars
boolean just_load = true; boolean just_load = true;
const char *hostName = "IoT Manager"; const char *hostName = "IoT Manager";
@@ -77,13 +106,11 @@ boolean udp_data_parse = false;
boolean mqtt_send_settings_to_udp = false; boolean mqtt_send_settings_to_udp = false;
boolean i2c_scanning = false; boolean i2c_scanning = false;
// Servo
Servo myServo1;
Servo myServo2;
//Buttons //Buttons
boolean but[NUM_BUTTONS]; //boolean but[6];
Bounce *buttons = new Bounce[NUM_BUTTONS];
// Udp // Udp
boolean udp_busy = false; boolean udp_busy = false;
@@ -102,24 +129,6 @@ int udp_period;
// i2c // i2c
String i2c_list; String i2c_list;
OneWire *oneWire;
DallasTemperature sensors;
DHTesp dht;
#ifdef level_enable
GMedian<10, int> medianFilter;
#endif
#ifdef bmp_enable
Adafruit_BMP280 bmp;
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
#endif
#ifdef bme_enable
Adafruit_BME280 bme;
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
#endif

View File

@@ -1,50 +1,13 @@
#include "Global.h" #include "Global.h"
void All_init() { void All_init() {
server.on("/init", HTTP_GET, [](AsyncWebServerRequest* request) {
String value;
if (request->hasArg("arg")) {
value = request->getParam("arg")->value();
}
if (value == "0") { //выкл сценариев
jsonWriteStr(configSetupJson, "scenario", value);
saveConfig();
Scenario_init();
request->send(200, "text/text", "OK");
}
if (value == "1") { //вкл сценариев
jsonWriteStr(configSetupJson, "scenario", value);
saveConfig();
Scenario_init();
request->send(200, "text/text", "OK");
}
if (value == "2") { //инициализация
Device_init();
request->send(200, "text/text", "OK");
}
if (value == "3") {
#ifdef logging_enable
clean_log_date();
#endif
request->send(200, "text/text", "OK");
}
if (value == "4") {
Scenario_init();
request->send(200, "text/text", "OK");
}
if (value == "5") {
i2c_scanning = true;
request->redirect("/?utilities");
}
});
prsets_init();
Device_init(); Device_init();
Scenario_init(); Scenario_init();
Timer_countdown_init(); Timer_countdown_init();
} }
void Device_init() { void Device_init() {
logging_value_names_list = ""; logging_value_names_list = "";
enter_to_logging_counter = LOG1 - 1; enter_to_logging_counter = LOG1 - 1;
@@ -52,6 +15,7 @@ void Device_init() {
enter_to_analog_counter = 0; enter_to_analog_counter = 0;
levelPr_value_name = ""; levelPr_value_name = "";
ultrasonicCm_value_name = "";
dhtT_value_name = ""; dhtT_value_name = "";
dhtH_value_name = ""; dhtH_value_name = "";
@@ -83,129 +47,30 @@ void Device_init() {
txtExecution("firmware.c.txt"); txtExecution("firmware.c.txt");
//outcoming_date(); //outcoming_date();
} }
//-------------------------------сценарии-----------------------------------------------------
void Scenario_init() { void Scenario_init() {
if (jsonReadStr(configSetupJson, "scenario") == "1") { if (jsonReadStr(configSetupJson, "scen") == "1") {
scenario = readFile("firmware.s.txt", 2048); scenario = readFile("firmware.s.txt", 2048);
} }
} }
void prsets_init() { void uptime_init() {
server.on("/preset", HTTP_GET, [](AsyncWebServerRequest* request) { ts.add(UPTIME, 5000, [&](void*) {
String value; handle_uptime();
if (request->hasArg("arg")) { }, nullptr, true);
value = request->getParam("arg")->value(); ts.add(STATISTICS, statistics_update, [&](void*) {
} handle_statistics();
if (value == "1") { }, nullptr, true);
writeFile("firmware.c.txt", readFile("configs/relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay.s.txt", 2048));
}
if (value == "2") {
writeFile("firmware.c.txt", readFile("configs/relay_t.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_t.s.txt", 2048));
}
if (value == "3") {
writeFile("firmware.c.txt", readFile("configs/relay_c.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_c.s.txt", 2048));
}
if (value == "4") {
writeFile("firmware.c.txt", readFile("configs/relay_s.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_s.s.txt", 2048));
}
if (value == "5") {
writeFile("firmware.c.txt", readFile("configs/relay_sw.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_sw.s.txt", 2048));
}
if (value == "6") {
writeFile("firmware.c.txt", readFile("configs/relay_br.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_br.s.txt", 2048));
}
if (value == "7") {
writeFile("firmware.c.txt", readFile("configs/relay_sr.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/relay_sr.s.txt", 2048));
}
if (value == "8") {
writeFile("firmware.c.txt", readFile("configs/pwm.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/pwm.s.txt", 2048));
}
if (value == "9") {
writeFile("firmware.c.txt", readFile("configs/dht11.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/dht11.s.txt", 2048));
}
if (value == "10") {
writeFile("firmware.c.txt", readFile("configs/dht22.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/dht22.s.txt", 2048));
}
if (value == "11") {
writeFile("firmware.c.txt", readFile("configs/analog.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/analog.s.txt", 2048));
}
if (value == "12") {
writeFile("firmware.c.txt", readFile("configs/dallas.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/dallas.s.txt", 2048));
}
if (value == "13") {
writeFile("firmware.c.txt", readFile("configs/termostat.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/termostat.s.txt", 2048));
}
if (value == "14") {
writeFile("firmware.c.txt", readFile("configs/level.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/level.s.txt", 2048));
}
if (value == "15") {
writeFile("firmware.c.txt", readFile("configs/moution_r.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/moution_r.s.txt", 2048));
}
if (value == "16") {
writeFile("firmware.c.txt", readFile("configs/moution_s.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/moution_s.s.txt", 2048));
}
if (value == "17") {
writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/stepper.s.txt", 2048));
}
if (value == "18") {
writeFile("firmware.c.txt", readFile("configs/servo.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/servo.s.txt", 2048));
}
if (value == "19") {
writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
}
Device_init();
Scenario_init();
request->redirect("/?configuration");
});
} }
void up_time() { void handle_uptime() {
uint32_t ss = millis() / 1000; if (myUpTime.check()) {
uint32_t mm = ss / 60; jsonWriteStr(configSetupJson, "uptime", uptime_as_string());
uint32_t hh = mm / 60;
uint32_t dd = hh / 24;
String out = "";
if (ss != 0) {
out = "[i] uptime = " + String(ss) + " sec";
jsonWriteStr(configLiveJson, "uptime", String(ss) + " sec");
} }
if (mm != 0) {
out = "[i] uptime = " + String(mm) + " min";
jsonWriteStr(configLiveJson, "uptime", String(mm) + " min");
}
if (hh != 0) {
out = "[i] uptime = " + String(hh) + " hours";
jsonWriteStr(configLiveJson, "uptime", String(hh) + " hours");
}
if (dd != 0) {
out = "[i] uptime = " + String(dd) + " days";
jsonWriteStr(configLiveJson, "uptime", String(dd) + " days");
}
Serial.println(out + ", mqtt_lost_error: " + String(mqtt_lost_error) + ", wifi_lost_error: " + String(wifi_lost_error));
} }
void statistics() { void handle_statistics() {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
String urls = "http://backup.privet.lv/visitors/?"; String urls = "http://backup.privet.lv/visitors/?";
//----------------------------------------------------------------- //-----------------------------------------------------------------
@@ -219,23 +84,20 @@ void statistics() {
urls += "iot-manager_esp32"; urls += "iot-manager_esp32";
#endif #endif
urls += "&"; urls += "&";
//-----------------------------------------------------------------
#ifdef ESP8266 #ifdef ESP8266
urls += ESP.getResetReason(); urls += ESP.getResetReason();
//Serial.println(ESP.getResetReason());
#endif #endif
#ifdef ESP32 #ifdef ESP32
urls += "Power on"; urls += "Power on";
#endif #endif
urls += "&"; urls += "&";
//-----------------------------------------------------------------
urls += "ver: "; urls += "ver: ";
urls += String(firmware_version); urls += String(firmware_version);
//-----------------------------------------------------------------
String stat = getURL(urls); String stat = getURL(urls);
//Serial.println(stat);
} }
} }
void statistics_init() {
ts.add(
STATISTICS, statistics_update, [&](void*) {
statistics();
},
nullptr, true);
}

View File

@@ -14,57 +14,43 @@ void logging() {
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
logging_value_names_list += value_name + ","; logging_value_names_list += value_name + ",";
// считаем количество входов в эту функцию enter_to_logging_counter++; //считаем количество входов в эту функцию
enter_to_logging_counter++; jsonWriteStr(configOptionJson, value_name + "_c", maxCount); //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count
//создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", value_name + "_ch", maxCount); //создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch
jsonWriteStr(configOptionJson, value_name + "_c", maxCount);
//создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch
createChart(widget_name, page_name, page_number, "widgets/widget.chart.json", value_name + "_ch", maxCount);
if (enter_to_logging_counter == LOG1) { if (enter_to_logging_counter == LOG1) {
ts.add( ts.add(LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0); String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0);
deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadInt(configOptionJson, tmp_buf_1 + "_c"), jsonReadStr(configLiveJson, tmp_buf_1)); deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadInt(configOptionJson, tmp_buf_1 + "_c"), jsonReadStr(configLiveJson, tmp_buf_1));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done"); Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done");
}, }, nullptr, false);
nullptr, false);
} }
if (enter_to_logging_counter == LOG2) { if (enter_to_logging_counter == LOG2) {
ts.add( ts.add(LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1); String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1);
deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadInt(configOptionJson, tmp_buf_2 + "_c"), jsonReadStr(configLiveJson, tmp_buf_2)); deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadInt(configOptionJson, tmp_buf_2 + "_c"), jsonReadStr(configLiveJson, tmp_buf_2));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done"); Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done");
}, }, nullptr, false);
nullptr, false);
} }
if (enter_to_logging_counter == LOG3) { if (enter_to_logging_counter == LOG3) {
ts.add( ts.add(LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2); String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2);
deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadInt(configOptionJson, tmp_buf_3 + "_c"), jsonReadStr(configLiveJson, tmp_buf_3)); deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadInt(configOptionJson, tmp_buf_3 + "_c"), jsonReadStr(configLiveJson, tmp_buf_3));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done"); Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done");
}, }, nullptr, false);
nullptr, false);
} }
if (enter_to_logging_counter == LOG4) { if (enter_to_logging_counter == LOG4) {
ts.add( ts.add(LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3); String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3);
deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadInt(configOptionJson, tmp_buf_4 + "_c"), jsonReadStr(configLiveJson, tmp_buf_4)); deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadInt(configOptionJson, tmp_buf_4 + "_c"), jsonReadStr(configLiveJson, tmp_buf_4));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done"); Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done");
}, }, nullptr, false);
nullptr, false);
} }
if (enter_to_logging_counter == LOG5) { if (enter_to_logging_counter == LOG5) {
ts.add( ts.add(LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4); String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4);
deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadInt(configOptionJson, tmp_buf_5 + "_c"), jsonReadStr(configLiveJson, tmp_buf_5)); deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadInt(configOptionJson, tmp_buf_5 + "_c"), jsonReadStr(configLiveJson, tmp_buf_5));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done"); Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done");
}, }, nullptr, false);
nullptr, false);
} }
} }
@@ -100,14 +86,12 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
void choose_log_date_and_send() { void choose_log_date_and_send() {
String all_line = logging_value_names_list; String all_line = logging_value_names_list;
while (all_line.length() != 0) { while (all_line.length() != 0) {
String tmp = selectToMarker(all_line, ","); String tmp = selectToMarker (all_line, ",");
sendLogData("log." + tmp + ".txt", tmp + "_ch" sendLogData("log." + tmp + ".txt", tmp + "_ch");
);
all_line = deleteBeforeDelimiter(all_line, ","); all_line = deleteBeforeDelimiter(all_line, ",");
} }
all_line = ""; all_line = "";
} }
//=========================================Отправка данных=================================================================================== //=========================================Отправка данных===================================================================================
void sendLogData(String file, String topic) { void sendLogData(String file, String topic) {
String log_date = readFile(file, 5000); String log_date = readFile(file, 5000);
@@ -119,9 +103,9 @@ void sendLogData(String file, String topic) {
String unix_time; String unix_time;
String value; String value;
while (log_date.length() != 0) { while (log_date.length() != 0) {
String tmp = selectToMarker(log_date, "\n"); String tmp = selectToMarker (log_date, "\n");
log_date = deleteBeforeDelimiter(log_date, "\n"); log_date = deleteBeforeDelimiter(log_date, "\n");
unix_time = selectToMarker(tmp, " "); unix_time = selectToMarker (tmp, " ");
jsonWriteInt(buf, "x", unix_time.toInt()); jsonWriteInt(buf, "x", unix_time.toInt());
value = deleteBeforeDelimiter(tmp, " "); value = deleteBeforeDelimiter(tmp, " ");
jsonWriteFloat(buf, "y1", value.toFloat()); jsonWriteFloat(buf, "y1", value.toFloat());
@@ -164,7 +148,7 @@ void sendLogData(String file, String topic) {
void clean_log_date() { void clean_log_date() {
String all_line = logging_value_names_list; String all_line = logging_value_names_list;
while (all_line.length() != 0) { while (all_line.length() != 0) {
String tmp = selectToMarker(all_line, ","); String tmp = selectToMarker (all_line, ",");
SPIFFS.remove("/log." + tmp + ".txt"); SPIFFS.remove("/log." + tmp + ".txt");
all_line = deleteBeforeDelimiter(all_line, ","); all_line = deleteBeforeDelimiter(all_line, ",");
} }

View File

@@ -1,6 +1,7 @@
#include "Global.h" #include "Global.h"
void callback(char* topic, byte* payload, unsigned int length); void callback(char* topic, byte* payload, unsigned int length);
String stateMQTT(); String stateMQTT();
void sendAllData(); void sendAllData();
void sendAllWigets(); void sendAllWigets();
@@ -9,9 +10,7 @@ void outcoming_date();
//===============================================ИНИЦИАЛИЗАЦИЯ================================================ //===============================================ИНИЦИАЛИЗАЦИЯ================================================
void MQTT_init() { void MQTT_init() {
ts.add( ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) {
WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) {
up_time();
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
Serial.println("[VV] WiFi-ok"); Serial.println("[VV] WiFi-ok");
if (client_mqtt.connected()) { if (client_mqtt.connected()) {
@@ -27,38 +26,7 @@ void MQTT_init() {
ts.remove(WIFI_MQTT_CONNECTION_CHECK); ts.remove(WIFI_MQTT_CONNECTION_CHECK);
StartAPMode(); StartAPMode();
} }
}, }, nullptr, true);
nullptr, true);
server.on("/mqttSave", HTTP_GET, [](AsyncWebServerRequest* request) {
if (request->hasArg("mqttServer")) {
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWriteInt(configSetupJson, "mqttPort", port);
}
if (request->hasArg("mqttPrefix")) {
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
}
if (request->hasArg("mqttUser")) {
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
}
if (request->hasArg("mqttPass")) {
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
}
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
});
server.on("/mqttCheck", HTTP_GET, [](AsyncWebServerRequest* request) {
String tmp = "{}";
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
jsonWriteStr(tmp, "class", "pop-up");
request->send(200, "text/text", tmp);
});
} }
void do_mqtt_connection() { void do_mqtt_connection() {
@@ -69,6 +37,7 @@ void do_mqtt_connection() {
} }
} }
//================================================ОБНОВЛЕНИЕ====================================================
void handleMQTT() { void handleMQTT() {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
if (client_mqtt.connected()) { if (client_mqtt.connected()) {
@@ -76,7 +45,6 @@ void handleMQTT() {
} }
} }
} }
boolean MQTT_Connecting() { boolean MQTT_Connecting() {
bool res = false; bool res = false;
String mqtt_server = jsonReadStr(configSetupJson, "mqttServer"); String mqtt_server = jsonReadStr(configSetupJson, "mqttServer");
@@ -94,6 +62,9 @@ boolean MQTT_Connecting() {
client_mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи client_mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/update").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/devc").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/devs").c_str());
Serial.println("[V] Callback set, subscribe done"); Serial.println("[V] Callback set, subscribe done");
res = true; res = true;
} else { } else {
@@ -108,8 +79,9 @@ boolean MQTT_Connecting() {
return res; return res;
} }
//=====================================================ВХОДЯЩИЕ ДАННЫЕ======================================================== //=====================================================ВХОДЯЩИЕ ДАННЫЕ========================================================
void callback(char* topic, byte* payload, unsigned int length) { void callback(char* topic, byte * payload, unsigned int length) {
Serial.print("[MQTT] "); Serial.print("[MQTT] ");
Serial.print(topic); Serial.print(topic);
String topic_str = String(topic); String topic_str = String(topic);
@@ -142,10 +114,19 @@ void callback(char* topic, byte* payload, unsigned int length) {
upgrade = true; upgrade = true;
} }
} }
if (topic_str.indexOf("devc") > 0) {
writeFile("firmware.c.txt", str);
Device_init();
}
if (topic_str.indexOf("devs") > 0) {
writeFile("firmware.s.txt", str);
Scenario_init();
}
} }
//данные которые отправляем при подключении или отбновлении страницы //данные которые отправляем при подключении или отбновлении страницы
void outcoming_date() { void outcoming_date() {
sendAllWigets(); sendAllWigets();
sendAllData(); sendAllData();
@@ -156,6 +137,8 @@ void outcoming_date() {
Serial.println("[V] Sending all date to iot manager completed"); Serial.println("[V] Sending all date to iot manager completed");
} }
//======================================CONFIG==================================================
boolean sendMQTT(String end_of_topik, String data) { boolean sendMQTT(String end_of_topik, String data) {
String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + end_of_topik;
boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
@@ -172,16 +155,24 @@ boolean sendCHART(String topik, String data) {
return send_status; return send_status;
} }
boolean sendCHART_test(String topik, String data) {
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
boolean send_status = client_mqtt.publish (topik.c_str(), data.c_str(), false);
return send_status;
}
//======================================STATUS==================================================
void sendSTATUS(String topik, String state) { void sendSTATUS(String topik, String state) {
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
String json_ = "{}"; String json_ = "{}";
jsonWriteStr(json_, "status", state); jsonWriteStr(json_, "status", state);
client_mqtt.publish(topik.c_str(), json_.c_str(), false); int send_status = client_mqtt.publish (topik.c_str(), json_.c_str(), false);
} }
//======================================CONTROL==================================================
void sendCONTROL(String id, String topik, String state) { void sendCONTROL(String id, String topik, String state) {
String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control"; String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control";
client_mqtt.publish(all_line.c_str(), state.c_str(), false); int send_status = client_mqtt.publish (all_line.c_str(), state.c_str(), false);
} }
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
@@ -234,10 +225,11 @@ void sendAllData() { //берет строку json и ключи превра
current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1", current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
while (current_config.length() != 0) { while (current_config.length() != 0) {
String tmp = selectToMarker(current_config, ",");
String topic = selectToMarker(tmp, ":"); String tmp = selectToMarker (current_config, ",");
String topic = selectToMarker (tmp, ":");
topic.replace("\"", ""); topic.replace("\"", "");
String state = selectToMarkerLast(tmp, ":"); String state = selectToMarkerLast (tmp, ":");
state.replace("\"", ""); state.replace("\"", "");
if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) { if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
sendSTATUS(topic, state); sendSTATUS(topic, state);
@@ -247,6 +239,8 @@ void sendAllData() { //берет строку json и ключи превра
} }
} }
String stateMQTT() { String stateMQTT() {
int state = client_mqtt.state(); int state = client_mqtt.state();
switch (state) { switch (state) {
@@ -285,69 +279,3 @@ String stateMQTT() {
break; break;
} }
} }
/*void scenario_devices_topiks_subscribe() {
//SCENARIO ANALOG > 5 800324-1458415 rel1 0
if (jsonReadStr(configSetupJson, "scenario") == "1") {
//String all_text = readFile("firmware.s.txt", 1024) + "\r\n";
String all_text = scenario + "\r\n";
all_text.replace("\r\n", "\n");
all_text.replace("\r", "\n");
while (all_text.length() != 0) {
String line_ = selectToMarker (all_text, "\n");
String id = selectFromMarkerToMarker(line_, " ", 4);
if (id != "not found") {
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/+/status").c_str(), 0);
Serial.println("subscribed to device, id: " + id);
}
all_text = deleteBeforeDelimiter(all_text, "\n");
}
}
}
*/
/*void scenario_devices_test_msg_send() {
if (jsonReadStr(configSetupJson, "scenario") == "1") {
String all_text = scenario + "\r\n";
all_text.replace("\r\n", "\n");
all_text.replace("\r", "\n");
while (all_text.length() != 0) {
String line_ = selectToMarker (all_text, "\n");
String id = selectFromMarkerToMarker(line_, " ", 4);
if (id != "not found") {
//Serial.println();
Serial.println(client_mqtt.publish ((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id).c_str(), "CHECK", true));
}
all_text = deleteBeforeDelimiter(all_text, "\n");
}
}
}*/
/*
//-----------------------------------------------------------------------------------------------------------------------------------------------
//jsonWriteStr(tmp, "status", "1");
String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
current_config.replace("{", "");
current_config.replace("}", ""); //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
while (current_config.length() != 0) {
String tmp = selectToMarker (current_config, ","); //"rel1":"1"
String topic = selectToMarker (tmp, ":"); //"rel1"
topic.replace("\"", ""); //rel1
Serial.println(topic);
String state = selectToMarkerLast (tmp, ":"); //"1"
state.replace("\"", ""); //1
//if (widget.lastIndexOf(topic) > 0) {
jsonWriteStr(tmp, "status", state);
//}
current_config = deleteBeforeDelimiter(current_config, ",");
}
//-------------------------------------------------------------------------------------------------------------------------------------------------
*/

View File

@@ -1,7 +1,8 @@
#include "Global.h" #include "Global.h"
void handleScenario() { void handleScenario() {
if (jsonReadStr(configSetupJson, "scenario") == "1") {
if (jsonReadStr(configSetupJson, "scen") == "1") {
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) { if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
int i = 0; int i = 0;
String str = scenario; //читаем переменную с сценариями (то что из файла на странице) String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
@@ -10,20 +11,20 @@ void handleScenario() {
str.replace("\r", "\n"); str.replace("\r", "\n");
while (str.length() != 0) { while (str.length() != 0) {
//----------------------------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------------------------
String tmp = selectToMarker(str, "end"); //выделяем первый сценарий из файла вместе с командами String tmp = selectToMarker (str, "end"); //выделяем первый сценарий из файла вместе с командами
if (tmp == "") return; if (tmp == "") return;
i++; i++;
if (scenario_line_status[i] == 1) { if (scenario_line_status[i] == 1) {
//Serial.println(i); //Serial.println(i);
String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
String param_name = selectFromMarkerToMarker(condition, " ", 0); String param_name = selectFromMarkerToMarker(condition, " " , 0);
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
String param = selectToMarker(order, ","); //читаем первое событие из файла событий String param = selectToMarker (order, ","); //читаем первое событие из файла событий
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
String sign = selectFromMarkerToMarker(condition, " ", 1); //читаем знак (=) String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=)
String value = selectFromMarkerToMarker(condition, " ", 2); //читаем значение (1) String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1)
if (value.indexOf("digit") != -1) { if (value.indexOf("digit") != -1) {
// value = add_set(value); // value = add_set(value);
value = jsonReadStr(configLiveJson, value); value = jsonReadStr(configLiveJson, value);
@@ -53,11 +54,11 @@ void handleScenario() {
} }
if (flag) { if (flag) {
//удаляем строку самого сценария оставляя только команды tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
tmp = deleteBeforeDelimiter(tmp, "\n"); stringExecution(tmp); //выполняем все команды
//выполняем все команды
stringExecution(tmp);
Serial.println("[SCENARIO] '" + condition + "'"); Serial.println("[SCENARIO] '" + condition + "'");
//Serial.println(" " + tmp);
} }
} }
} }
@@ -72,10 +73,10 @@ void handleScenario() {
} }
} }
//событие выглядит как имя плюс set плюс номер: button+Set+1 void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
void eventGen(String event_name, String number) {
if (jsonReadStr(configSetupJson, "scenario") == "1") { if (jsonReadStr(configSetupJson, "scen") == "1") {
String tmp = jsonReadStr(configOptionJson, "scenario_status"); //генерирование события String tmp = jsonReadStr(configOptionJson, "scenario_status") ; //генерирование события
//Serial.println(event_name); //Serial.println(event_name);
jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ","); jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ",");
} }

View File

@@ -1,23 +1,9 @@
#include "Global.h" #include "Global.h"
void Time_Init() { void Time_Init() {
server.on("/time", HTTP_GET, [](AsyncWebServerRequest* request) { ts.add(TIME_SYNC, 30000, [&](void*) {
if (request->hasArg("timezone")) {
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
}
if (request->hasArg("ntp")) {
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
}
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
});
ts.add(
TIME_SYNC, 30000, [&](void*) {
time_check(); time_check();
}, }, nullptr, true);
nullptr, true);
} }
void time_check() { void time_check() {
@@ -70,7 +56,6 @@ String GetTimeUnix() {
return String(now); return String(now);
} }
} }
// Получение текущего времени // Получение текущего времени
String GetTime() { String GetTime() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
@@ -110,7 +95,9 @@ String GetDate() {
String GetDataDigital() { String GetDataDigital() {
String date = GetDate(); String date = GetDate();
date = deleteBeforeDelimiter(date, " "); date = deleteBeforeDelimiter(date, " ");
date.replace("Jan", "01"); date.replace("Jan", "01");
date.replace("Feb", "02"); date.replace("Feb", "02");
date.replace("Mar", "03"); date.replace("Mar", "03");
@@ -140,7 +127,7 @@ String GetDataDigital() {
int timeToMin(String Time) { int timeToMin(String Time) {
//"00:00:00" время в секунды //"00:00:00" время в секунды
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
Time = deleteBeforeDelimiter(Time, ":"); // Теперь здесь минуты секунды Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
return min; return min;
} }

View File

@@ -1,32 +1,34 @@
#include "Global.h" #include "Global.h"
//================================================================================================================
//=========================================Таймеры=================================================================
void Timer_countdown_init() { void Timer_countdown_init() {
ts.add(
TIMER_COUNTDOWN, 1000, [&](void*) { ts.add(TIMER_COUNTDOWN, 1000, [&](void*) {
String old_line = jsonReadStr(configOptionJson, "timers"); String old_line = jsonReadStr(configOptionJson, "timers");
if (old_line != "") { if (old_line != "") {
//Serial.println(old_line); //Serial.println(old_line);
int i = 0; int i = 0;
do { do {
String timer = selectFromMarkerToMarker(old_line, ",", i); String timer = selectFromMarkerToMarker(old_line, "," , i);
Serial.print("timer no " + String(i) + ": "); Serial.print("timer no " + String (i) + ": ");
Serial.println(timer); Serial.println(timer);
if (timer == "not found" || timer == "") return; if (timer == "not found" || timer == "") return;
int number = selectToMarker(timer, ":").toInt(); int number = selectToMarker (timer, ":").toInt();
int time = readTimer(number); int time = readTimer(number);
if (time == 0) { if (time == 0) {
delTimer(String(number)); delTimer (String (number));
jsonWriteStr(configLiveJson, "timer" + String(number), "0"); jsonWriteStr(configLiveJson, "timer" + String(number), "0");
eventGen("timer", String(number)); eventGen ("timer", String(number));
} else { } else {
time--; time--;
addTimer(String(number), String(time)); addTimer(String (number), String (time));
} }
i++; i++;
} while (i <= 9); } while (i <= 9);
} }
}, }, nullptr, true);
nullptr, true);
} }
void timerStart_() { void timerStart_() {
@@ -34,6 +36,7 @@ void timerStart_() {
String period_of_time = sCmd.next(); String period_of_time = sCmd.next();
String type = sCmd.next(); String type = sCmd.next();
if (period_of_time.indexOf("digit") != -1) { if (period_of_time.indexOf("digit") != -1) {
//period_of_time = add_set(period_of_time);
period_of_time = jsonReadStr(configLiveJson, period_of_time); period_of_time = jsonReadStr(configLiveJson, period_of_time);
} }
if (type == "sec") period_of_time = period_of_time; if (type == "sec") period_of_time = period_of_time;
@@ -42,7 +45,6 @@ void timerStart_() {
addTimer(number, period_of_time); addTimer(number, period_of_time);
jsonWriteStr(configLiveJson, "timer" + number, "1"); jsonWriteStr(configLiveJson, "timer" + number, "1");
} }
void addTimer(String number, String time) { void addTimer(String number, String time) {
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
String new_timer = number + ":" + time; String new_timer = number + ":" + time;
@@ -65,7 +67,7 @@ void timerStop_() {
delTimer(number); delTimer(number);
} }
void delTimer(String number) { void delTimer (String number) {
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
if (psn1 != -1) { //если он есть if (psn1 != -1) { //если он есть

View File

@@ -1,109 +1,73 @@
#include "Global.h" #include "Global.h"
static const char* UPDATE_URL PROGMEM = "http://91.204.228.124:1100/update/%s/%s";
static const char* FIRMWARE_FILE = "esp32-esp8266_iot-manager_modules_firmware.spiffs.bin";
#ifdef ESP32
static const char* MCU = "esp32";
#else
static const char* MCU = "esp8266";
#endif
const String createUrl(const char* qry) {
char buf[128];
sprintf_P(buf, UPDATE_URL, MCU, qry);
return String(buf);
}
const String getVersionUrl() {
return createUrl("version.txt");
}
const String getFirmwareUrl() {
return createUrl(FIRMWARE_FILE);
}
void initUpgrade() { void initUpgrade() {
String last_version = WiFi.status() == WL_CONNECTED ? getURL(getVersionUrl()) : ""; #ifdef ESP8266
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
#endif
#ifdef ESP32
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
#endif
jsonWriteStr(configSetupJson, "last_version", last_version); jsonWriteStr(configSetupJson, "last_version", last_version);
Serial.print("[i] Last firmware version: ");
Serial.printf("[i] Last firmware version: %s\n", last_version.c_str()); Serial.println(last_version);
server.on("/check", HTTP_GET, [last_version](AsyncWebServerRequest* request) {
upgrade_url = true;
Serial.printf("[i] Last firmware version: %s\n", last_version.c_str());
String tmp = "{}";
if (WiFi.status() == WL_CONNECTED) {
if (mb_4_of_memory) {
if (last_version != "") {
if (last_version != "error") {
if (last_version == firmware_version) {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWriteStr(tmp, "class", "pop-up");
} else {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
jsonWriteStr(tmp, "class", "pop-up");
}
} else {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWriteStr(tmp, "class", "pop-up");
}
} else {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
jsonWriteStr(tmp, "class", "pop-up");
}
} else {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
jsonWriteStr(tmp, "class", "pop-up");
}
} else {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключен к роутеру...");
jsonWriteStr(tmp, "class", "pop-up");
}
request->send(200, "text/text", tmp);
});
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest* request) {
upgrade = true;
String tmp = "{}";
request->send(200, "text/text", "ok");
});
} }
void do_upgrade_url() { void do_upgrade_url() {
if (upgrade_url) { if (upgrade_url) {
upgrade_url = false; upgrade_url = false;
last_version = getURL(getVersionUrl()); #ifdef ESP32
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
#endif
#ifdef ESP8266
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
#endif
jsonWriteStr(configSetupJson, "last_version", last_version); jsonWriteStr(configSetupJson, "last_version", last_version);
} }
} }
void upgrade_firmware() { void upgrade_firmware() {
String scenario_for_update; String scenario_for_update;
String config_for_update; String config_for_update;
String configSetupJson_for_update; String configSetup_for_update;
scenario_for_update = readFile("firmware.s.txt", 4000); scenario_for_update = readFile("firmware.s.txt", 4000);
config_for_update = readFile("firmware.c.txt", 4000); config_for_update = readFile("firmware.c.txt", 4000);
configSetupJson_for_update = configSetupJson; configSetup_for_update = configSetupJson;
Serial.println("Start upgrade SPIFFS, please wait..."); Serial.println("Start upgrade SPIFFS, please wait...");
WiFiClient client_for_upgrade; WiFiClient client_for_upgrade;
#ifdef ESP32
httpUpdate.rebootOnUpdate(false); httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, getFirmwareUrl()); t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
if (ret == HTTP_UPDATE_OK) { if (ret == HTTP_UPDATE_OK) {
writeFile("firmware.s.txt", scenario_for_update); writeFile("firmware.s.txt", scenario_for_update);
writeFile("firmware.c.txt", config_for_update); writeFile("firmware.c.txt", config_for_update);
writeFile("config.json", configSetupJson_for_update); writeFile("config.json", configSetup_for_update);
saveConfig(); saveConfig();
Serial.println("SPIFFS upgrade done!"); Serial.println("SPIFFS upgrade done!");
Serial.println("Start upgrade BUILD, please wait..."); Serial.println("Start upgrade BUILD, please wait...");
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, getFirmwareUrl()); #ifdef ESP32
//httpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
#ifdef ESP8266
//ESPhttpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = ESPhttpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
if (ret == HTTP_UPDATE_OK) { if (ret == HTTP_UPDATE_OK) {
Serial.println("BUILD upgrade done!"); Serial.println("BUILD upgrade done!");
Serial.println("Restart ESP...."); Serial.println("Restart ESP....");
ESP.restart(); ESP.restart();
@@ -128,95 +92,12 @@ void do_upgrade() {
case HTTP_UPDATE_FAILED: case HTTP_UPDATE_FAILED:
Serial.printf("UPDATE_FAILED Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); Serial.printf("UPDATE_FAILED Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
break; break;
case HTTP_UPDATE_NO_UPDATES: case HTTP_UPDATE_NO_UPDATES:
Serial.println("NO_UPDATES"); Serial.println("NO_UPDATES");
break; break;
case HTTP_UPDATE_OK: case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK"); Serial.println("HTTP_UPDATE_OK");
break; break;
} }
} }
*/ */
/*
// ----------------------- Обновление с сайта
void webUpgrade() {
#ifdef ESP8266
String spiffsData = "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin";
String buildData = "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin";
#endif
#ifdef ESP32
String spiffsData = "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin";
String buildData = "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin";
#endif
if (spiffsData != "") { // Если нужно прошить FS
String scenario_for_update;
String config_for_update;
String configSetupJson_for_update;
Serial.println(spiffsData);
scenario_for_update = readFile("firmware.s.txt", 2048);
config_for_update = readFile("config.all.txt", 2048);
configSetupJson_for_update = configSetupJson;
ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления
updateHTTP(spiffsData, true);
writeFile("firmware.s.txt", scenario_for_update);
writeFile("config.all.txt", config_for_update);
writeFile("config.json", configSetupJson_for_update);
saveConfig();
}
if (buildData != "") { // Если нужно прошить build
Serial.println(buildData);
ESPhttpUpdate.rebootOnUpdate(true); // Включим перезагрузку после обновления
updateHTTP(buildData, false);
}
}
// ------------------ Обновление по url
void updateHTTP(String url, boolean mode) {
if (url == "") return;
ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);
if (mode) {
Serial.println("Update Spiffs...");
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(url);
UpdateStatus(ret , "Spiffs");
} else {
Serial.println("Update Build...");
t_httpUpdate_return ret = ESPhttpUpdate.update(url);
UpdateStatus(ret , "build");
}
}
void UpdateStatus(t_httpUpdate_return set, String mode) {
switch (set) {
case HTTP_UPDATE_FAILED:
Serial.println(mode + "_FAILED");
var = "{}";
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_FAILED");
jsonWriteStr(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println(mode + "_NO_UPDATES");
var = "{}";
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_NO_UPDATES");
jsonWriteStr(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
case HTTP_UPDATE_OK:
Serial.println(mode + "_UPDATE_OK");
var = "{}";
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_UPDATE_OK");
jsonWriteStr(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
}
}
*/

356
src/Web.cpp Normal file
View File

@@ -0,0 +1,356 @@
#include "Global.h"
String stateMQTT();
void web_init() {
server.on("/set", HTTP_GET, [](AsyncWebServerRequest * request) {
String value;
//============================device settings=====================================
if (request->hasArg("preset")) {
//--------------------------------------------------------------------------------
String value;
value = request->getParam("preset")->value();
if (value == "1") {
writeFile("firmware.c.txt", readFile("configs/1-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/1-relay.s.txt", 2048));
}
if (value == "2") {
writeFile("firmware.c.txt", readFile("configs/2-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/2-relay.s.txt", 2048));
}
if (value == "3") {
writeFile("firmware.c.txt", readFile("configs/3-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/3-relay.s.txt", 2048));
}
if (value == "4") {
writeFile("firmware.c.txt", readFile("configs/4-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/4-relay.s.txt", 2048));
}
if (value == "5") {
writeFile("firmware.c.txt", readFile("configs/5-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/5-relay.s.txt", 2048));
}
if (value == "6") {
writeFile("firmware.c.txt", readFile("configs/6-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/6-relay.s.txt", 2048));
}
if (value == "7") {
writeFile("firmware.c.txt", readFile("configs/7-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/7-relay.s.txt", 2048));
}
if (value == "8") {
writeFile("firmware.c.txt", readFile("configs/8-pwm.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/8-pwm.s.txt", 2048));
}
if (value == "9") {
writeFile("firmware.c.txt", readFile("configs/9-dht11.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/9-dht11.s.txt", 2048));
}
if (value == "10") {
writeFile("firmware.c.txt", readFile("configs/10-dht22.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/10-dht22.s.txt", 2048));
}
if (value == "11") {
writeFile("firmware.c.txt", readFile("configs/11-analog.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/11-analog.s.txt", 2048));
}
if (value == "12") {
writeFile("firmware.c.txt", readFile("configs/12-bmp280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/12-bmp280.s.txt", 2048));
}
if (value == "13") {
writeFile("firmware.c.txt", readFile("configs/13-bme280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/13-bme280.s.txt", 2048));
}
if (value == "14") {
writeFile("firmware.c.txt", readFile("configs/14-dallas.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/14-dallas.s.txt", 2048));
}
if (value == "15") {
writeFile("firmware.c.txt", readFile("configs/15-termostat.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/15-termostat.s.txt", 2048));
}
if (value == "16") {
writeFile("firmware.c.txt", readFile("configs/16-ultrasonic.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/16-ultrasonic.s.txt", 2048));
}
if (value == "17") {
writeFile("firmware.c.txt", readFile("configs/17-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/17-moution.s.txt", 2048));
}
if (value == "18") {
writeFile("firmware.c.txt", readFile("configs/18-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/18-moution.s.txt", 2048));
}
if (value == "19") {
writeFile("firmware.c.txt", readFile("configs/19-stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/19-stepper.s.txt", 2048));
}
if (value == "20") {
writeFile("firmware.c.txt", readFile("configs/20-servo.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/20-servo.s.txt", 2048));
}
if (value == "21") {
writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
}
Device_init();
Scenario_init();
request->redirect("/?set.device");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devinit")) {
Device_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("scen")) {
value = request->getParam("scen")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("sceninit")) {
Scenario_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
#ifdef logging_enable
if (request->hasArg("cleanlog")) {
clean_log_date();
request->send(200, "text/text", "OK");
}
#endif
//==============================udp settings=============================================
if (request->hasArg("udponoff")) {
value = request->getParam("udponoff")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatelist")) {
SPIFFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address");
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatepage")) {
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devname")) {
jsonWriteStr(configSetupJson, "name", request->getParam("devname")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//==============================wifi settings=============================================
if (request->hasArg("routerssid")) {
jsonWriteStr(configSetupJson, "routerssid", request->getParam("routerssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("routerpass")) {
jsonWriteStr(configSetupJson, "routerpass", request->getParam("routerpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("apssid")) {
jsonWriteStr(configSetupJson, "apssid", request->getParam("apssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("appass")) {
jsonWriteStr(configSetupJson, "appass", request->getParam("appass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("weblogin")) {
jsonWriteStr(configSetupJson, "weblogin", request->getParam("weblogin")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("webpass")) {
jsonWriteStr(configSetupJson, "webpass", request->getParam("webpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("timezone")) {
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
if (request->hasArg("ntp")) {
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") ESP.restart();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("blink")) {
value = request->getParam("blink")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
request->send(200, "text/text", "OK");
}
//==============================mqtt settings=============================================
if (request->hasArg("mqttServer")) {
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWriteInt(configSetupJson, "mqttPort", port);
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPrefix")) {
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttUser")) {
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPass")) {
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttsend")) {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttcheck")) {
String tmp = "{}";
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
jsonWriteStr(tmp, "class", "pop-up");
request->send(200, "text/text", tmp);
}
//==============================push settings=============================================
#ifdef push_enable
if (request->hasArg("pushingboxid")) {
jsonWriteStr(configSetupJson, "pushingboxid", request->getParam("pushingboxid")->value());
saveConfig();
request->send(200, "text/text", "ok");
}
#endif
//==============================utilities settings=============================================
if (request->hasArg("itoc")) {
i2c_scanning = true;
request->redirect("/?set.utilities");
}
});
//==============================upgrade settings=============================================
server.on("/check", HTTP_GET, [](AsyncWebServerRequest * request) {
upgrade_url = true;
Serial.print("[i] Last firmware version: ");
Serial.println(last_version);
String tmp = "{}";
int case_of_update;
if (WiFi.status() != WL_CONNECTED) last_version = "nowifi";
if (!mb_4_of_memory) last_version = "less";
if (last_version == firmware_version) case_of_update = 1;
if (last_version != firmware_version) case_of_update = 2;
if (last_version == "error") case_of_update = 3;
if (last_version == "") case_of_update = 4;
if (last_version == "less") case_of_update = 5;
if (last_version == "nowifi") case_of_update = 6;
if (last_version == "notsupported") case_of_update = 7;
switch (case_of_update) {
case 1: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWriteStr(tmp, "class", "pop-up");
}
break;
case 2: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
jsonWriteStr(tmp, "class", "pop-up");
}
break;
case 3: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWriteStr(tmp, "class", "pop-up");
}
break;
case 4: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 5: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 6: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключено к роутеру...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 7: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление на новую версию возможно только через usb...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
}
request->send(200, "text/text", tmp);
});
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) {
upgrade = true;
String tmp = "{}";
request->send(200, "text/text", "ok");
});
}

View File

@@ -1,6 +1,9 @@
#include "Global.h" #include "Global.h"
void Web_server_init() { void Web_server_init() {
/*********************************************************************************
***************************************OTA****************************************
*********************************************************************************/
#ifdef OTA_enable #ifdef OTA_enable
ArduinoOTA.onStart([]() { ArduinoOTA.onStart([]() {
events.send("Update Start", "ota"); events.send("Update Start", "ota");
@@ -14,16 +17,11 @@ void Web_server_init() {
events.send(p, "ota"); events.send(p, "ota");
}); });
ArduinoOTA.onError([](ota_error_t error) { ArduinoOTA.onError([](ota_error_t error) {
if (error == OTA_AUTH_ERROR) if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
events.send("Auth Failed", "ota"); else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
else if (error == OTA_BEGIN_ERROR) else if (error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota");
events.send("Begin Failed", "ota"); else if (error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota");
else if (error == OTA_CONNECT_ERROR) else if (error == OTA_END_ERROR) events.send("End Failed", "ota");
events.send("Connect Failed", "ota");
else if (error == OTA_RECEIVE_ERROR)
events.send("Recieve Failed", "ota");
else if (error == OTA_END_ERROR)
events.send("End Failed", "ota");
}); });
ArduinoOTA.setHostname(hostName); ArduinoOTA.setHostname(hostName);
ArduinoOTA.begin(); ArduinoOTA.begin();
@@ -42,17 +40,19 @@ void Web_server_init() {
ws.onEvent(onWsEvent); ws.onEvent(onWsEvent);
server.addHandler(&ws); server.addHandler(&ws);
events.onConnect([](AsyncEventSourceClient *client) { events.onConnect([](AsyncEventSourceClient * client) {
//!!!client->send("hello!", NULL, millis(), 1000); //!!!client->send("hello!", NULL, millis(), 1000);
}); });
server.addHandler(&events); server.addHandler(&events);
#endif #endif
/*********************************************************************************
**************************************WEB****************************************
*********************************************************************************/
#ifdef ESP32 #ifdef ESP32
server.addHandler(new SPIFFSEditor(SPIFFS, jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str())); server.addHandler(new SPIFFSEditor(SPIFFS, jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
#elif defined(ESP8266) #elif defined(ESP8266)
server.addHandler(new SPIFFSEditor(jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str())); server.addHandler(new SPIFFSEditor(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
#endif #endif
/* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) { /* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
@@ -62,10 +62,12 @@ void Web_server_init() {
server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000"); server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000");
server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000"); server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000");
server.serveStatic("/favicon.ico", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000"); server.serveStatic("/favicon.ico", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000");
server.serveStatic("/icon.jpeg", SPIFFS, "/icon.jpeg").setCacheControl("max-age=31536000");
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm").setAuthentication(jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str()); server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm")
.setAuthentication(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str());
server.onNotFound([](AsyncWebServerRequest *request) { server.onNotFound([](AsyncWebServerRequest * request) {
Serial.printf("NOT_FOUND: "); Serial.printf("NOT_FOUND: ");
if (request->method() == HTTP_GET) if (request->method() == HTTP_GET)
Serial.printf("GET"); Serial.printf("GET");
@@ -93,13 +95,13 @@ void Web_server_init() {
int headers = request->headers(); int headers = request->headers();
int i; int i;
for (i = 0; i < headers; i++) { for (i = 0; i < headers; i++) {
AsyncWebHeader *h = request->getHeader(i); AsyncWebHeader* h = request->getHeader(i);
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
} }
int params = request->params(); int params = request->params();
for (i = 0; i < params; i++) { for (i = 0; i < params; i++) {
AsyncWebParameter *p = request->getParam(i); AsyncWebParameter* p = request->getParam(i);
if (p->isFile()) { if (p->isFile()) {
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if (p->isPost()) { } else if (p->isPost()) {
@@ -112,40 +114,42 @@ void Web_server_init() {
request->send(404); request->send(404);
}); });
server.onFileUpload([](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) {
server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) {
if (!index) if (!index)
Serial.printf("UploadStart: %s\n", filename.c_str()); Serial.printf("UploadStart: %s\n", filename.c_str());
Serial.printf("%s", (const char *)data); Serial.printf("%s", (const char*)data);
if (final) if (final)
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len); Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
}); });
server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
if (!index) if (!index)
Serial.printf("BodyStart: %u\n", total); Serial.printf("BodyStart: %u\n", total);
Serial.printf("%s", (const char *)data); Serial.printf("%s", (const char*)data);
if (index + len == total) if (index + len == total)
Serial.printf("BodyEnd: %u\n", total); Serial.printf("BodyEnd: %u\n", total);
}); });
server.begin(); server.begin();
// --------------------Выдаем данные configLiveJson //config.live.json - динамические данные // --------------------Выдаем данные configJson //config.live.json - динамические данные
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configLiveJson); request->send(200, "application/json", configLiveJson);
}); });
// --------------------Выдаем данные configOptionJson //config.option.json - данные не являющиеся событиями // --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configOptionJson); request->send(200, "application/json", configOptionJson);
}); });
// -------------------Выдаем данные configSetupJson //config.setup.json - для хранения постоянных данных // -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configSetupJson); request->send(200, "application/json", configSetupJson);
}); });
// ------------------Выполнение команды из запроса // ------------------Выполнение команды из запроса
//http://192.168.88.45/cmd?command=rel%201%201 //http://192.168.88.45/cmd?command=rel%201%201
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) {
String com = request->getParam("command")->value(); String com = request->getParam("command")->value();
Serial.println(com); Serial.println(com);
order_loop += com + ","; order_loop += com + ",";
@@ -156,7 +160,7 @@ void Web_server_init() {
*********************************************************WS********************************************************************** *********************************************************WS**********************************************************************
********************************************************************************************************************************/ ********************************************************************************************************************************/
#ifdef WS_enable #ifdef WS_enable
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
if (type == WS_EVT_CONNECT) { if (type == WS_EVT_CONNECT) {
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
client->printf(json.c_str(), client->id()); client->printf(json.c_str(), client->id());
@@ -164,11 +168,11 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
} else if (type == WS_EVT_DISCONNECT) { } else if (type == WS_EVT_DISCONNECT) {
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
} else if (type == WS_EVT_ERROR) { } else if (type == WS_EVT_ERROR) {
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t *)arg), (char *)data); Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
} else if (type == WS_EVT_PONG) { } else if (type == WS_EVT_PONG) {
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char *)data : ""); Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char*)data : "");
} else if (type == WS_EVT_DATA) { } else if (type == WS_EVT_DATA) {
AwsFrameInfo *info = (AwsFrameInfo *)arg; AwsFrameInfo * info = (AwsFrameInfo*)arg;
String msg = ""; String msg = "";
if (info->final && info->index == 0 && info->len == len) { if (info->final && info->index == 0 && info->len == len) {
//the whole message is in a single frame and we got all of it's data //the whole message is in a single frame and we got all of it's data
@@ -176,13 +180,13 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
if (info->opcode == WS_TEXT) { if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < info->len; i++) { for (size_t i = 0; i < info->len; i++) {
msg += (char)data[i]; msg += (char) data[i];
} }
} else { } else {
char buff[3]; char buff[3];
for (size_t i = 0; i < info->len; i++) { for (size_t i = 0; i < info->len; i++) {
sprintf(buff, "%02x ", (uint8_t)data[i]); sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff; msg += buff ;
} }
} }
Serial.printf("%s\n", msg.c_str()); Serial.printf("%s\n", msg.c_str());
@@ -203,13 +207,13 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
if (info->opcode == WS_TEXT) { if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
msg += (char)data[i]; msg += (char) data[i];
} }
} else { } else {
char buff[3]; char buff[3];
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t)data[i]); sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff; msg += buff ;
} }
} }
Serial.printf("%s\n", msg.c_str()); Serial.printf("%s\n", msg.c_str());

View File

@@ -2,88 +2,29 @@
boolean RouterFind(String ssid); boolean RouterFind(String ssid);
void WIFI_init() void ROUTER_Connecting() {
{
// --------------------Получаем ssid password со страницы
server.on("/ssid", HTTP_GET, [](AsyncWebServerRequest *request) {
if (request->hasArg("ssid"))
{
jsonWriteStr(configSetupJson, "ssid", request->getParam("ssid")->value());
}
if (request->hasArg("password"))
{
jsonWriteStr(configSetupJson, "password", request->getParam("password")->value());
}
saveConfig(); // Функция сохранения данных во Flash
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// --------------------Получаем ssidAP passwordAP со страницы
server.on("/ssidap", HTTP_GET, [](AsyncWebServerRequest *request) {
if (request->hasArg("ssidAP"))
{
jsonWriteStr(configSetupJson, "ssidAP", request->getParam("ssidAP")->value());
}
if (request->hasArg("passwordAP"))
{
jsonWriteStr(configSetupJson, "passwordAP", request->getParam("passwordAP")->value());
}
saveConfig(); // Функция сохранения данных во Flash
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// --------------------Получаем логин и пароль для web со страницы
server.on("/web", HTTP_GET, [](AsyncWebServerRequest *request) {
if (request->hasArg("web_login"))
{
jsonWriteStr(configSetupJson, "web_login", request->getParam("web_login")->value());
}
if (request->hasArg("web_pass"))
{
jsonWriteStr(configSetupJson, "web_pass", request->getParam("web_pass")->value());
}
saveConfig(); // Функция сохранения данных во Flash
//Web_server_init();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/restart", HTTP_GET, [](AsyncWebServerRequest *request) {
if (request->hasArg("device"))
{
if (request->getParam("device")->value() == "ok")
ESP.restart();
}
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
ROUTER_Connecting();
}
void ROUTER_Connecting()
{
led_blink("slow"); led_blink("slow");
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
byte tries = 20; byte tries = 20;
String _ssid = jsonReadStr(configSetupJson, "ssid"); String _ssid = jsonReadStr(configSetupJson, "routerssid");
String _password = jsonReadStr(configSetupJson, "password"); String _password = jsonReadStr(configSetupJson, "routerpass");
//WiFi.persistent(false); //WiFi.persistent(false);
if (_ssid == "" && _password == "") if (_ssid == "" && _password == "") {
{
WiFi.begin(); WiFi.begin();
} }
else else {
{
WiFi.begin(_ssid.c_str(), _password.c_str()); WiFi.begin(_ssid.c_str(), _password.c_str());
Serial.print("ssid: "); Serial.print("ssid: ");
Serial.println(_ssid); Serial.println(_ssid);
} }
// Делаем проверку подключения до тех пор пока счетчик tries // Делаем проверку подключения до тех пор пока счетчик tries
// не станет равен нулю или не получим подключение // не станет равен нулю или не получим подключение
while (--tries && WiFi.status() != WL_CONNECTED) while (--tries && WiFi.status() != WL_CONNECTED) {
{ if (WiFi.status() == WL_CONNECT_FAILED) {
if (WiFi.status() == WL_CONNECT_FAILED)
{
Serial.println("[E] password is not correct"); Serial.println("[E] password is not correct");
tries = 1; tries = 1;
jsonWriteInt(configOptionJson, "pass_status", 1); jsonWriteInt(configOptionJson, "pass_status", 1);
@@ -92,57 +33,58 @@ void ROUTER_Connecting()
delay(1000); delay(1000);
} }
Serial.println();
if (WiFi.status() != WL_CONNECTED) if (WiFi.status() != WL_CONNECTED)
{ {
// Если не удалось подключиться запускаем в режиме AP
Serial.println("");
// WiFi.disconnect(true);
StartAPMode(); StartAPMode();
} }
else else {
{ // Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("[V] WiFi connected"); Serial.println("[V] WiFi connected");
Serial.print("[V] IP address: http://"); Serial.print("[V] IP address: http://");
Serial.print(WiFi.localIP()); Serial.print(WiFi.localIP());
Serial.println(); Serial.println("");
jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString());
jsonWriteStr(configLiveJson, "ip", WiFi.localIP().toString());
led_blink("off"); led_blink("off");
//add_dev_in_list("dev.txt", chipID, WiFi.localIP().toString());
MQTT_init();
} }
} }
bool StartAPMode() bool StartAPMode() {
{
Serial.println("WiFi up AP"); Serial.println("WiFi up AP");
WiFi.disconnect(); WiFi.disconnect();
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
String _ssidAP = jsonReadStr(configSetupJson, "ssidAP"); String _ssidAP = jsonReadStr(configSetupJson, "apssid");
String _passwordAP = jsonReadStr(configSetupJson, "passwordAP"); String _passwordAP = jsonReadStr(configSetupJson, "appass");
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP(); IPAddress myIP = WiFi.softAPIP();
led_blink("on"); led_blink("on");
Serial.print("AP IP address: "); Serial.print("AP IP address: ");
Serial.println(myIP); Serial.println(myIP);
jsonWriteStr(configLiveJson, "ip", myIP.toString()); jsonWriteStr(configSetupJson, "ip", myIP.toString());
if (jsonReadInt(configOptionJson, "pass_status") != 1) //if (jsonReadInt(configOptionJson, "pass_status") != 1) {
{ ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) {
ts.add(
ROUTER_SEARCHING, 10 * 1000, [&](void *) {
Serial.println("->try find router"); Serial.println("->try find router");
if (RouterFind(jsonReadStr(configSetupJson, "ssid"))) if (RouterFind(jsonReadStr(configSetupJson, "routerssid"))) {
{
ts.remove(ROUTER_SEARCHING); ts.remove(ROUTER_SEARCHING);
WiFi.scanDelete(); WiFi.scanDelete();
ROUTER_Connecting(); ROUTER_Connecting();
MQTT_init();
}
},
nullptr, true);
} }
}, nullptr, true);
//}
return true; return true;
} }
boolean RouterFind(String ssid) boolean RouterFind(String ssid)
{ {
bool res = false; bool res = false;

View File

@@ -1,16 +1,23 @@
#include "Global.h" #include "Global.h"
void createWidget(String widget_name, String page_name, String page_number, String file, String topic) { //======================================================================================================================
//===============================================Создание виджетов=======================================================
void createWidget (String widget_name, String page_name, String page_number, String file, String topic) {
String widget; String widget;
widget = readFile(file, 1024); widget = readFile(file, 1024);
if (widget == "Failed") return; if (widget == "Failed") return;
if (widget == "Large") return; if (widget == "Large") return;
widget_name.replace("#", " "); widget_name.replace("#", " ");
page_name.replace("#", " "); page_name.replace("#", " ");
jsonWriteStr(widget, "page", page_name); jsonWriteStr(widget, "page", page_name);
jsonWriteStr(widget, "order", page_number); jsonWriteStr(widget, "order", page_number);
jsonWriteStr(widget, "descr", widget_name); jsonWriteStr(widget, "descr", widget_name);
jsonWriteStr(widget, "topic", prex + "/" + topic); jsonWriteStr(widget, "topic", prex + "/" + topic);
#ifdef layout_in_ram #ifdef layout_in_ram
all_widgets += widget + "\r\n"; all_widgets += widget + "\r\n";
#else #else
@@ -19,7 +26,8 @@ void createWidget(String widget_name, String page_name, String page_number, Stri
widget = ""; widget = "";
} }
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) { 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) {
String widget; String widget;
widget = readFile(file, 1024); widget = readFile(file, 1024);
@@ -46,7 +54,8 @@ void createWidgetParam(String widget_name, String page_name, String page_number,
widget = ""; widget = "";
} }
void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount) { void createChart (String widget_name, String page_name, String page_number, String file, String topic, String maxCount) {
String widget; String widget;
widget = readFile(file, 1024); widget = readFile(file, 1024);
@@ -72,8 +81,10 @@ void createChart(String widget_name, String page_name, String page_number, Strin
} }
void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) { void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) {
if (type == "any-data") createWidget(widget_name, page_name, page_number, "widgets/widget.anyData.json", topik);
if (type == "progress-line") createWidget(widget_name, page_name, page_number, "widgets/widget.progLine.json", topik); if (type == "any-data") createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", topik);
if (type == "progress-round") createWidget(widget_name, page_name, page_number, "widgets/widget.progRound.json", topik); if (type == "progress-line") createWidget (widget_name, page_name, page_number, "widgets/widget.progLine.json", topik);
if (type == "fill-gauge") createWidget(widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik); if (type == "progress-round") createWidget (widget_name, page_name, page_number, "widgets/widget.progRound.json", topik);
if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik);
} }

View File

@@ -1,22 +1,23 @@
#include "Global.h" #include "Global.h"
void setup() { void setup() {
//--------------------------------------------------------------
File_system_init(); File_system_init();
Serial.println("SPIFFS_init"); Serial.println("SPIFFS_init");
//--------------------------------------------------------------
CMD_init(); CMD_init();
Serial.println("[V] CMD_init"); Serial.println("[V] CMD_init");
//--------------------------------------------------------------
sensors_init(); sensors_init();
Serial.println("[V] sensors_init"); Serial.println("[V] sensors_init");
//--------------------------------------------------------------
All_init(); All_init();
Serial.println("[V] All_init"); Serial.println("[V] All_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
WIFI_init(); ROUTER_Connecting();
Serial.println("[V] WIFI_init"); Serial.println("[V] ROUTER_Connecting");
//-------------------------------------------------------------- //--------------------------------------------------------------
statistics_init(); uptime_init();
Serial.println("[V] statistics_init"); Serial.println("[V] statistics_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
initUpgrade(); initUpgrade();
@@ -25,34 +26,32 @@ void setup() {
Web_server_init(); Web_server_init();
Serial.println("[V] Web_server_init"); Serial.println("[V] Web_server_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
MQTT_init(); web_init();
Serial.println("[V] MQTT_init"); Serial.println("[V] web_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
Time_Init(); Time_Init();
Serial.println("[V] Time_Init"); Serial.println("[V] Time_Init");
//-------------------------------------------------------------- //--------------------------------------------------------------
#ifdef push_enable
Push_init();
Serial.println("[V] Push_init");
#endif
//--------------------------------------------------------------
#ifdef UDP_enable #ifdef UDP_enable
UDP_init(); UDP_init();
Serial.println("[V] UDP_init"); Serial.println("[V] UDP_init");
#endif #endif
//-------------------------------------------------------------- //--------------------------------------------------------------
ts.add(
TEST, 10000, [&](void*) {
ts.add(TEST, 10000, [&](void*) {
getMemoryLoad("[i] periodic check of"); getMemoryLoad("[i] periodic check of");
//ws.textAll(json); //ws.textAll(json);
}, }, nullptr, true);
nullptr, true);
just_load = false; just_load = false;
} }
void loop() { void loop() {
#ifdef OTA_enable #ifdef OTA_enable
ArduinoOTA.handle(); ArduinoOTA.handle();
#endif #endif

View File

@@ -5,40 +5,6 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip);
#ifdef UDP_enable #ifdef UDP_enable
void UDP_init() { void UDP_init() {
server.on("/udp", HTTP_GET, [](AsyncWebServerRequest * request) {
String value;
if (request->hasArg("arg")) {
value = request->getParam("arg")->value();
}
if (value == "0") {
jsonWriteStr(configSetupJson, "udponoff", value);
request->send(200, "text/text", "ok");
}
if (value == "1") {
jsonWriteStr(configSetupJson, "udponoff", value);
request->send(200, "text/text", "ok");
}
if (value == "2") {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
}
if (value == "3") {
SPIFFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address");
request->redirect("/?dev");
}
if (value == "4") {
request->redirect("/?dev");
}
});
server.on("/name", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("arg")) {
jsonWriteStr(configSetupJson, "name", request->getParam("arg")->value());
jsonWriteStr(configLiveJson, "name", request->getParam("arg")->value());
saveConfig();
}
request->send(200, "text/text", "OK");
});
SPIFFS.remove("/dev.csv"); SPIFFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address"); addFile("dev.csv", "device id;device name;ip address");