diff --git a/data/config.json b/data/config.json index 180bdcd3..589bab8c 100644 --- a/data/config.json +++ b/data/config.json @@ -1,10 +1,10 @@ { "name": "IoTmanager", "chipID": "", - "ssidAP": "WiFi2", - "passwordAP": "", - "ssid": "rise", - "password": "hostel3333", + "apssid": "IoTmanager", + "appass": "", + "routerssid": "rise", + "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", "mqttServer": "91.204.228.124", @@ -12,9 +12,10 @@ "mqttPrefix": "/rise", "mqttUser": "test", "mqttPass": "test", - "scenario": "1", - "pushingbox_id": "v7C133E426B0C69E", - "web_login": "admin", - "web_pass": "admin", - "udponoff": "1" + "scen": "1", + "pushingboxid": "v7C133E426B0C69E", + "weblogin": "admin", + "webpass": "admin", + "udponoff": "1", + "blink":"1" } \ No newline at end of file diff --git a/data/configs/1-relay.c.txt b/data/configs/1-relay.c.txt new file mode 100644 index 00000000..733f4c95 --- /dev/null +++ b/data/configs/1-relay.c.txt @@ -0,0 +1,3 @@ +button 1 5 Включить#реле Реле 0 1 + +//это простая кнопка номер 1 управляющая пином 5 имеющая начальное состояние 0 \ No newline at end of file diff --git a/data/configs/1-relay.s.txt b/data/configs/1-relay.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/1-relay.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/10-dht22.c.txt b/data/configs/10-dht22.c.txt new file mode 100644 index 00000000..a0124e41 --- /dev/null +++ b/data/configs/10-dht22.c.txt @@ -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 \ No newline at end of file diff --git a/data/configs/10-dht22.s.txt b/data/configs/10-dht22.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/10-dht22.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/11-analog.c.txt b/data/configs/11-analog.c.txt new file mode 100644 index 00000000..429ccada --- /dev/null +++ b/data/configs/11-analog.c.txt @@ -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 diff --git a/data/configs/11-analog.s.txt b/data/configs/11-analog.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/11-analog.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/12-bmp280.c.txt b/data/configs/12-bmp280.c.txt new file mode 100644 index 00000000..16956455 --- /dev/null +++ b/data/configs/12-bmp280.c.txt @@ -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) \ No newline at end of file diff --git a/data/configs/12-bmp280.s.txt b/data/configs/12-bmp280.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/12-bmp280.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/13-bme280.c.txt b/data/configs/13-bme280.c.txt new file mode 100644 index 00000000..e8414f61 --- /dev/null +++ b/data/configs/13-bme280.c.txt @@ -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) \ No newline at end of file diff --git a/data/configs/13-bme280.s.txt b/data/configs/13-bme280.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/13-bme280.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/14-dallas.c.txt b/data/configs/14-dallas.c.txt new file mode 100644 index 00000000..e6686b14 --- /dev/null +++ b/data/configs/14-dallas.c.txt @@ -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 \ No newline at end of file diff --git a/data/configs/14-dallas.s.txt b/data/configs/14-dallas.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/14-dallas.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/15-termostat.c.txt b/data/configs/15-termostat.c.txt new file mode 100644 index 00000000..af75deeb --- /dev/null +++ b/data/configs/15-termostat.c.txt @@ -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 - номер пина реле +//это термостат который будет держать температуру между двумя +//установленными в приложении значениями, так же можно выключить +//автоматический режим, и тогда нагреватель будет управляться в ручную \ No newline at end of file diff --git a/data/configs/15-termostat.s.txt b/data/configs/15-termostat.s.txt new file mode 100644 index 00000000..60782623 --- /dev/null +++ b/data/configs/15-termostat.s.txt @@ -0,0 +1,6 @@ +dallas > digit1 +buttonSet 1 0 +end +dallas < digit2 +buttonSet 1 1 +end \ No newline at end of file diff --git a/data/configs/16-ultrasonic.c.txt b/data/configs/16-ultrasonic.c.txt new file mode 100644 index 00000000..4eacdf30 --- /dev/null +++ b/data/configs/16-ultrasonic.c.txt @@ -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 \ No newline at end of file diff --git a/data/configs/16-ultrasonic.s.txt b/data/configs/16-ultrasonic.s.txt new file mode 100644 index 00000000..babd78ab --- /dev/null +++ b/data/configs/16-ultrasonic.s.txt @@ -0,0 +1,6 @@ +p > digit1 +buttonSet 1 0 +end +p < digit2 +buttonSet 1 1 +end \ No newline at end of file diff --git a/data/configs/17-moution.c.txt b/data/configs/17-moution.c.txt new file mode 100644 index 00000000..fa0b78ac --- /dev/null +++ b/data/configs/17-moution.c.txt @@ -0,0 +1,11 @@ +button 1 5 Прихожая Освещение 0 1 +inputDigit digit1 Задержка#выключения Освещение 30 2 +switch 1 0 10 + +//0 - номер пина датчика движения +//5 - номер пина реле +//при срабатывании датчика движения включится реле и обратный таймер на 30 сек +//если движение не будет обнаружено повтороно в течении 30 секунд - свет выключится +//если движение повторится в течении 30 секунд то таймер продлится опять на 30 сек +//свет выключится только в том случае если в комнате все замрет на 30 сек +//задержку выключения можно будет настраивать в приложении \ No newline at end of file diff --git a/data/configs/17-moution.s.txt b/data/configs/17-moution.s.txt new file mode 100644 index 00000000..899b7035 --- /dev/null +++ b/data/configs/17-moution.s.txt @@ -0,0 +1,7 @@ +switch1 = 1 +timerStart 1 digit1 sec +buttonSet 1 1 +end +timer1 = 0 +buttonSet 1 0 +end \ No newline at end of file diff --git a/data/configs/18-moution.c.txt b/data/configs/18-moution.c.txt new file mode 100644 index 00000000..bc7d8192 --- /dev/null +++ b/data/configs/18-moution.c.txt @@ -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 - номер пина датчика +//при срабатывании датчика движения устройство пошлет пуш и в приложении будет +//написано в текстовом поле, что движение было обнаружено +//так же будет зафиксирован момент времени срабатывания датчика +//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин +//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении \ No newline at end of file diff --git a/data/configs/18-moution.s.txt b/data/configs/18-moution.s.txt new file mode 100644 index 00000000..f764dc9d --- /dev/null +++ b/data/configs/18-moution.s.txt @@ -0,0 +1,10 @@ +switch1 = 1 +textSet 1 обнаружено#движение-time +end +button1 = 1 +textSet 1 не#обнаружено-time +buttonSet 1 0 +end +switch1 = 1 +push Внимание обнаружено#движение! +end \ No newline at end of file diff --git a/data/configs/19-stepper.c.txt b/data/configs/19-stepper.c.txt new file mode 100644 index 00000000..82b41ae2 --- /dev/null +++ b/data/configs/19-stepper.c.txt @@ -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 то будет вращаться против часовой стрелки +//можно подключить не более двух шаговиков \ No newline at end of file diff --git a/data/configs/19-stepper.s.txt b/data/configs/19-stepper.s.txt new file mode 100644 index 00000000..16e7cfa6 --- /dev/null +++ b/data/configs/19-stepper.s.txt @@ -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 \ No newline at end of file diff --git a/data/configs/2-relay.c.txt b/data/configs/2-relay.c.txt new file mode 100644 index 00000000..1e54f5dd --- /dev/null +++ b/data/configs/2-relay.c.txt @@ -0,0 +1,6 @@ +inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1 +inputTime time2 Во#сколько#выключить? Таймеры 20-35-00 2 +button 1 5 Кнопка#(по#таймеру) Таймеры 0 3 + +//время в приложение необходимо вводить в строгом формате: ЧЧ-ММ-СС +//можно создавать любое количество таймеров, копируя строку inputTime... \ No newline at end of file diff --git a/data/configs/2-relay.s.txt b/data/configs/2-relay.s.txt new file mode 100644 index 00000000..5deba589 --- /dev/null +++ b/data/configs/2-relay.s.txt @@ -0,0 +1,6 @@ +timenow = time1 +buttonSet 1 1 +end +timenow = time2 +buttonSet 1 0 +end diff --git a/data/configs/20-servo.c.txt b/data/configs/20-servo.c.txt new file mode 100644 index 00000000..5d45aea0 --- /dev/null +++ b/data/configs/20-servo.c.txt @@ -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 градусов. \ No newline at end of file diff --git a/data/configs/20-servo.s.txt b/data/configs/20-servo.s.txt new file mode 100644 index 00000000..b4340463 --- /dev/null +++ b/data/configs/20-servo.s.txt @@ -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 \ No newline at end of file diff --git a/data/configs/3-relay.c.txt b/data/configs/3-relay.c.txt new file mode 100644 index 00000000..9f0c5c45 --- /dev/null +++ b/data/configs/3-relay.c.txt @@ -0,0 +1,4 @@ +button 1 5 Вкл#на#время Таймеры 0 1 +inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2 + +//в сценариях можно поменять на sec, min или hours если нужны другие размерности времени \ No newline at end of file diff --git a/data/configs/3-relay.s.txt b/data/configs/3-relay.s.txt new file mode 100644 index 00000000..f8ced990 --- /dev/null +++ b/data/configs/3-relay.s.txt @@ -0,0 +1,6 @@ +button1 = 1 +timerStart 1 digit1 sec +end +timer1 = 0 +buttonSet 1 0 +end \ No newline at end of file diff --git a/data/configs/4-relay.c.txt b/data/configs/4-relay.c.txt new file mode 100644 index 00000000..b0978b0d --- /dev/null +++ b/data/configs/4-relay.c.txt @@ -0,0 +1,3 @@ +button 1 na Включить#все Освещение 0 1 + +//при нажатии на эту кнопку пины номер 5 и 13 поведут себя как установленно в сценариях \ No newline at end of file diff --git a/data/configs/4-relay.s.txt b/data/configs/4-relay.s.txt new file mode 100644 index 00000000..276282c3 --- /dev/null +++ b/data/configs/4-relay.s.txt @@ -0,0 +1,8 @@ +button1 = 1 +pinSet 5 1 +pinSet 13 0 +end +button1 = 0 +pinSet 5 0 +pinSet 13 1 +end \ No newline at end of file diff --git a/data/configs/5-relay.c.txt b/data/configs/5-relay.c.txt new file mode 100644 index 00000000..5ef7e5f5 --- /dev/null +++ b/data/configs/5-relay.c.txt @@ -0,0 +1,4 @@ +button 1 13 Включить#реле Реле 0 1 +switch 1 0 10 + +//можно управлять реле на пине 13 кнопкой на пине 0 или кнопкой в приложении \ No newline at end of file diff --git a/data/configs/5-relay.s.txt b/data/configs/5-relay.s.txt new file mode 100644 index 00000000..093de1fe --- /dev/null +++ b/data/configs/5-relay.s.txt @@ -0,0 +1,3 @@ +switch1 = 1 +buttonChange 1 +end \ No newline at end of file diff --git a/data/configs/6-relay.c.txt b/data/configs/6-relay.c.txt new file mode 100644 index 00000000..db812455 --- /dev/null +++ b/data/configs/6-relay.c.txt @@ -0,0 +1,6 @@ +button 1 5 Включить#все Реле 0 1 + + +//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет +//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID +//того esp, кнопка на этом девайсе будет выключать другие устройства по воздуху \ No newline at end of file diff --git a/data/configs/6-relay.s.txt b/data/configs/6-relay.s.txt new file mode 100644 index 00000000..9eb30933 --- /dev/null +++ b/data/configs/6-relay.s.txt @@ -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 \ No newline at end of file diff --git a/data/configs/7-relay.c.txt b/data/configs/7-relay.c.txt new file mode 100644 index 00000000..739a1424 --- /dev/null +++ b/data/configs/7-relay.c.txt @@ -0,0 +1,6 @@ +switch 1 0 10 + +//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет +//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID +//того esp, к данному модулю нужно подключить кнопку к пину 0 и тогда +//один девайс будет управлять другим по воздуху \ No newline at end of file diff --git a/data/configs/7-relay.s.txt b/data/configs/7-relay.s.txt new file mode 100644 index 00000000..0c48cbdf --- /dev/null +++ b/data/configs/7-relay.s.txt @@ -0,0 +1,4 @@ +switch1 = 1 +mqtt 3233662-1589485 buttonChange_1 +mqtt 2233662-1589486 buttonChange_1 +end \ No newline at end of file diff --git a/data/configs/8-pwm.c.txt b/data/configs/8-pwm.c.txt new file mode 100644 index 00000000..09eef72c --- /dev/null +++ b/data/configs/8-pwm.c.txt @@ -0,0 +1,6 @@ +pwm 1 3 Яркость#коредор: Реле 1023 1 +pwm 2 4 Яркость#ванная: Реле 510 2 + +//в приложении появятся ползунки, соответствующее значение pwm +//будет установленно на пинах 3 и 4 +//1023 и 510 это начальные значения после загрузки модуля \ No newline at end of file diff --git a/data/configs/8-pwm.s.txt b/data/configs/8-pwm.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/8-pwm.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/9-dht11.c.txt b/data/configs/9-dht11.c.txt new file mode 100644 index 00000000..ce8ec1a8 --- /dev/null +++ b/data/configs/9-dht11.c.txt @@ -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 \ No newline at end of file diff --git a/data/configs/9-dht11.s.txt b/data/configs/9-dht11.s.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/data/configs/9-dht11.s.txt @@ -0,0 +1 @@ + diff --git a/data/configs/firmware.c.txt b/data/configs/firmware.c.txt new file mode 100644 index 00000000..99beb0be --- /dev/null +++ b/data/configs/firmware.c.txt @@ -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 это количество точек \ No newline at end of file diff --git a/data/configs/firmware.s.txt b/data/configs/firmware.s.txt new file mode 100644 index 00000000..4927ac1e --- /dev/null +++ b/data/configs/firmware.s.txt @@ -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 \ No newline at end of file diff --git a/data/configuration.json b/data/configuration.json deleted file mode 100644 index fb4381dd..00000000 --- a/data/configuration.json +++ /dev/null @@ -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": { - "#": "Выбирите то, во что Вы хотите превратить это устройство ", - "/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" - } - ] -} \ No newline at end of file diff --git a/data/css/build.css.gz b/data/css/build.css.gz index fc58d776..4bf6e060 100644 Binary files a/data/css/build.css.gz and b/data/css/build.css.gz differ diff --git a/data/dev.json b/data/dev.json deleted file mode 100644 index 9b474644..00000000 --- a/data/dev.json +++ /dev/null @@ -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" - } - ] -} \ No newline at end of file diff --git a/data/icon.jpeg b/data/icon.jpeg new file mode 100644 index 00000000..abdd18c0 Binary files /dev/null and b/data/icon.jpeg differ diff --git a/data/index.htm.gz b/data/index.htm.gz index 0e9eb070..139f0040 100644 Binary files a/data/index.htm.gz and b/data/index.htm.gz differ diff --git a/data/index.json b/data/index.json index 26adcc1a..1b6413ad 100644 --- a/data/index.json +++ b/data/index.json @@ -1,7 +1,8 @@ { "configs": [ "/config.live.json", - "/config.setup.json" + "/config.setup.json", + "/lang/lang.ru.json" ], "title": "Главная", "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", @@ -9,104 +10,60 @@ { "type": "h5", "title": "{{name}}", - "class": "alert-warning" + "class": "alert-default" }, { - "type": "h4", - "title": "Device ID: {{chipID}}" - }, - { - "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": "text", + "class": "alert alert-light", + "title": "
IoT Manager
" + }, { "type": "link", "title": "Конфигурация устройства", - "action": "/?configuration", - "class": "btn btn-block btn-primary" - }, - { - "type": "hr" + "action": "/?set.device", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Список других устройств в сети", - "action": "/?dev", - "class": "btn btn-block btn-success" + "action": "/?set.udp", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Конфигурация WIFI", - "action": "/?setup", - "class": "btn btn-block btn-success" + "action": "/?set.wifi", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Конфигурация MQTT", - "action": "/?mqtt", - "class": "btn btn-block btn-success" + "action": "/?set.mqtt", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Конфигурация push", - "action": "/?pushingbox", - "class": "btn btn-block btn-success" + "action": "/?set.push", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Утилиты", - "action": "/?utilities", - "class": "btn btn-block btn-success" - }, - { - "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" + "action": "/?set.utilities", + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Скачать приложение IoT Manager для android", "action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager", - "class": "btn btn-block btn-warning" + "class": "btn btn-block btn-default" }, { "type": "link", "title": "Скачать приложение IoT Manager для iphone", "action": "https://apps.apple.com/ru/app/iot-manager/id1155934877", - "class": "btn btn-block btn-warning" + "class": "btn btn-block btn-default" } ] } diff --git a/data/js/build.chart.js.gz b/data/js/build.chart.js.gz index bb94fbc9..ac021668 100644 Binary files a/data/js/build.chart.js.gz and b/data/js/build.chart.js.gz differ diff --git a/data/js/function.js.gz b/data/js/function.js.gz index 7e661ff6..443fbca2 100644 Binary files a/data/js/function.js.gz and b/data/js/function.js.gz differ diff --git a/data/lang/lang.ru.json b/data/lang/lang.ru.json new file mode 100644 index 00000000..2c089bcb --- /dev/null +++ b/data/lang/lang.ru.json @@ -0,0 +1,39 @@ +{ + "SetDevConf": "Конфигурация устройства", + "SetDevPreset": "Выберите из списка подходящий пресет кофигурации", + + "ButSave":"Сохранить", + "ButMainPage":"Главная", + + + "SetUDPList": "Список других устройств в сети:", + "SetUDPWarn1": "После нажатия на кнопку переформировать список устройств ждите примерно минуту, а затем обновите страницу и список появится вновь", + + "SetUDPUpdateList":"Переформировать список устройств", + "SetUDPUpdatePage":"Обновить страницу", + "SetUDPNameOfDev":"Имя этого устройства:", + "SetUDPDateExchange":"Включить обмен данными между устройствами", + "SetUDPWarn2":"Если обмен данными включен, то устройства будут обмениваться широковещательными пакетами udp для формирования списка устройств и для осуществления посылки настроек mqtt. Данный обмен создает дополнительную нагрузку на wifi сеть.", + + "SetWiFiNameOfDev":"Имя устройства:", + "SetWiFiRouterConnect":"Подключение к WiFi роутеру:", + "SetWiFiAccessPoint":"Точка доступа:", + "SetWiFiWeb":"Логин и пароль web interface:", + "SetWiFiTimeZone":"Временная зона:", + "SetWiFiNTP":"Сервер NTP:", + "SetWiFiWarn1":"Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов", + "SetWiFiWarn2":"После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку перезагрузить устройство внизу этой страницы", + "SetWiFiWarn3":"Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа", + "SetWiFiWarn4":"После изменения поля NTP сервер необходимо перезагрузить устройство", + "SetWiFiWarn5":"Светодиод статуса подключения показывает четыре состояния подключения:
1. мигает редко - идет подключение к wifi
2. мигает часто - идет подключение к серверу mqtt
3. горит постоянно - модуль в режиме точки доступа,
4. не горит - модуль подключен к wifi и к mqtt.
Светодиод подключен к gpio2. Если галочка стоит - то использовать этот пин нельзя", + + "SetMQTTServerName":"Имя сервера:", + "SetMQTTPort":"Номер порта:", + "SetMQTTPrefix":"Префикс:", + "SetMQTTUserName":"Имя пользователя:", + "SetMQTTPassword":"Пароль:", + + "SetMQTTSendSettings":"Отправить настройки MQTT с этого устройства на все остальные", + "SetMQTTWarn1":"Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: /prefix, вариант вида: /prefix1/prefix2 работать не будет. После изменения поля prefix необходимо перезагрузить устройство", + "SetMQTTWarn2":"Прежде чем нажимать на кнопку Отправить настройки MQTT сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети" +} \ No newline at end of file diff --git a/data/mqtt.json b/data/mqtt.json deleted file mode 100644 index 0bd4acc5..00000000 --- a/data/mqtt.json +++ /dev/null @@ -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 может состоять только из одного слова и одного разделителя: /prefix, вариант вида: /prefix1/prefix2 работать не будет. После изменения поля 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": "Прежде чем нажимать на кнопку 'Отправить настройки MQTT' сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети" - }, - { - "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" - } - ] -} \ No newline at end of file diff --git a/data/pushingbox.json b/data/pushingbox.json deleted file mode 100644 index eac5a080..00000000 --- a/data/pushingbox.json +++ /dev/null @@ -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" - } - ] -} diff --git a/data/set.device.json b/data/set.device.json new file mode 100644 index 00000000..7236fb0c --- /dev/null +++ b/data/set.device.json @@ -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}}", + "/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" + } + ] +} \ No newline at end of file diff --git a/data/set.mqtt.json b/data/set.mqtt.json new file mode 100644 index 00000000..a088c2dc --- /dev/null +++ b/data/set.mqtt.json @@ -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": "

{{SetMQTTWarn1}}

" + + }, + { + "type": "text", + "style": "width:100%;float:left;", + "title": "

{{SetMQTTWarn2}}

" + }, + { + "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" + } + ] +} \ No newline at end of file diff --git a/data/set.push.json b/data/set.push.json new file mode 100644 index 00000000..555797e4 --- /dev/null +++ b/data/set.push.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/data/set.udp.json b/data/set.udp.json new file mode 100644 index 00000000..6bea3042 --- /dev/null +++ b/data/set.udp.json @@ -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": "

{{SetUDPWarn1}}

", + "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": "

{{SetUDPWarn2}}

" + } + ] +} \ No newline at end of file diff --git a/data/utilities.json b/data/set.utilities.json similarity index 70% rename from data/utilities.json rename to data/set.utilities.json index ee82a0c0..92769f85 100644 --- a/data/utilities.json +++ b/data/set.utilities.json @@ -1,7 +1,8 @@ { "configs": [ "/config.live.json", - "/config.setup.json" + "/config.setup.json", + "/lang/lang.ru.json" ], "title": "Главная", "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", @@ -9,7 +10,13 @@ { "type": "h5", "title": "{{name}}", - "class": "alert-warning" + "class": "alert-default" + }, + { + "type": "link", + "title": "{{ButMainPage}}", + "action": "/", + "class": "btn btn-block btn-default" }, { "type": "hr" @@ -25,17 +32,8 @@ { "type": "link", "title": "Сканировать", - "action": "/init?arg=5", - "class": "btn btn-block btn-success" - }, - { - "type": "hr" - }, - { - "type": "link", - "title": "Главная", - "action": "/", - "class": "btn btn-block btn-danger" + "action": "/set?itoc", + "class": "btn btn-block btn-default" } ] } \ No newline at end of file diff --git a/data/set.wifi.json b/data/set.wifi.json new file mode 100644 index 00000000..d68edc7f --- /dev/null +++ b/data/set.wifi.json @@ -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": "

{{SetWiFiWarn1}}

" + }, + { + "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": "

{{SetWiFiWarn2}}

" + }, + { + "type": "hr" + }, + { + "type": "checkbox", + "name": "blink", + "title": "Включить светодиод статуса подключения", + "action": "/set?blink=[[blink]]", + "state": "{{blink}}" + }, + { + "type": "text", + "title": "

{{SetWiFiWarn5}}

" + }, + { + "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": "

{{SetWiFiWarn3}}

" + }, + { + "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": "

{{SetWiFiWarn4}}

" + }, + { + "type": "hr" + }, + { + "type": "link", + "title": "Перезагрузить устройство", + "action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}", + "class": "btn btn-block btn-danger" + } + ] +} \ No newline at end of file diff --git a/data/setup.json b/data/setup.json deleted file mode 100644 index 18ebf108..00000000 --- a/data/setup.json +++ /dev/null @@ -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": "После изменения поля 'NTP сервер' необходимо перезагрузить устройство" - }, - { - "type": "hr" - }, - { - "type": "link", - "title": "Перезагрузить устройство", - "action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}", - "class": "btn btn-block btn-warning" - } - ] -} \ No newline at end of file diff --git a/data/widgets/outstanding/widget.select.json b/data/widgets/outstanding/widget.select.json new file mode 100644 index 00000000..c6531b70 --- /dev/null +++ b/data/widgets/outstanding/widget.select.json @@ -0,0 +1,7 @@ +{ + "widget" : "select", + "size" : "small", + "fill" : "outline", + "options" : "["Zero item", "First item", "Second item"]", + "status" : 2 +} \ No newline at end of file diff --git a/include/Consts.h b/include/Consts.h index c9ef6d63..30c750ae 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -1,4 +1,5 @@ #pragma once +//Здесь хранятся все настройки прошивки #define firmware_version "2.3.3" diff --git a/include/Global.h b/include/Global.h index 331d95cd..5bf3e39c 100644 --- a/include/Global.h +++ b/include/Global.h @@ -1,21 +1,27 @@ #pragma once +//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК=============== #include #include #include #include +extern AsyncWebServer server; #include #include #include #include #include #include - #include "Consts.h" - -/* -* ESP8266 -*/ +#include +#include "GyverFilters.h" +#include +#include +#include +#include +#include +#include +//==============ESP8266 БИБЛИОТЕКИ=============== #ifdef ESP8266 #include #include @@ -29,10 +35,7 @@ WiFiUDP Udp; #include #endif #endif - -/* -* ESP32 -*/ +//==============ESP32 БИБЛИОТЕКИ=============== #ifdef ESP32 #include #include @@ -55,9 +58,63 @@ extern Servo myServo2; #include #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; -// 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 const char *hostName; @@ -107,83 +164,10 @@ extern boolean udp_data_parse; extern boolean mqtt_send_settings_to_udp; extern boolean i2c_scanning; -#ifdef WS_enable -extern AsyncWebSocket ws; -#endif - -extern AsyncEventSource events; - 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; - -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 -#include -extern OneWire *oneWire; -extern DallasTemperature sensors; - -#include -extern DHTesp dht; - -#include - -#ifdef bmp_enable -#include -extern Adafruit_BMP280 bmp; -extern Adafruit_Sensor *bmp_temp; -extern Adafruit_Sensor *bmp_pressure; -#endif - -#ifdef bme_enable -#include -extern Adafruit_BME280 bme; -extern Adafruit_Sensor *bme_temp; -extern Adafruit_Sensor *bme_pressure; -extern Adafruit_Sensor *bme_humidity; -#endif - -//#include -//SoftwareSerial mySerial(14, 12); +///////////////////////////////////// Functions//////////////////////////////////////////////////////////////////// // StringUtils extern uint8_t hexStringToUint8(String hex); @@ -381,4 +365,10 @@ extern void handleButton(); extern void handleScenario(); extern void handleUdp(); extern void do_upgrade_url(); -extern void do_upgrade(); \ No newline at end of file +extern void do_upgrade(); + +//uptime +extern void handle_uptime(); +extern void handle_statistics(); +extern void uptime_init(); +extern void web_init(); \ No newline at end of file diff --git a/lib/Arduino-UpTime/Changelog b/lib/Arduino-UpTime/Changelog new file mode 100644 index 00000000..16c1e045 --- /dev/null +++ b/lib/Arduino-UpTime/Changelog @@ -0,0 +1,2 @@ +0.01 2019-01-14 + - initial version diff --git a/lib/Arduino-UpTime/Makefile b/lib/Arduino-UpTime/Makefile new file mode 100644 index 00000000..3d0fb738 --- /dev/null +++ b/lib/Arduino-UpTime/Makefile @@ -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 diff --git a/lib/Arduino-UpTime/README b/lib/Arduino-UpTime/README new file mode 100644 index 00000000..6a3fa83c --- /dev/null +++ b/lib/Arduino-UpTime/README @@ -0,0 +1,99 @@ +NAME + + UpTime.h - Arduino uptime and events in seconds + +SYNOPSIS + + #include + #include // 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 + diff --git a/lib/Arduino-UpTime/UpTime.cpp b/lib/Arduino-UpTime/UpTime.cpp new file mode 100644 index 00000000..846638af --- /dev/null +++ b/lib/Arduino-UpTime/UpTime.cpp @@ -0,0 +1,65 @@ +/* see UpTime.h */ + +#include +#include + +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); +} diff --git a/lib/Arduino-UpTime/UpTime.h b/lib/Arduino-UpTime/UpTime.h new file mode 100644 index 00000000..e643a99c --- /dev/null +++ b/lib/Arduino-UpTime/UpTime.h @@ -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 + #include // 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 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 + +*/ diff --git a/lib/Arduino-UpTime/examples/UpTime_synopsis/README b/lib/Arduino-UpTime/examples/UpTime_synopsis/README new file mode 100644 index 00000000..6640df09 --- /dev/null +++ b/lib/Arduino-UpTime/examples/UpTime_synopsis/README @@ -0,0 +1,4 @@ +DESCRIPTION + + synopsis section example from UpTime.h + diff --git a/lib/Arduino-UpTime/examples/UpTime_synopsis/UpTime_synopsis.ino b/lib/Arduino-UpTime/examples/UpTime_synopsis/UpTime_synopsis.ino new file mode 100644 index 00000000..f6ad1bb1 --- /dev/null +++ b/lib/Arduino-UpTime/examples/UpTime_synopsis/UpTime_synopsis.ino @@ -0,0 +1,24 @@ +/* +=head1 DESCRIPTION + +synopsis section example from UpTime.h + +=cut +*/ + +#include +#include // 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); +} diff --git a/lib/Arduino-UpTime/examples/UpTime_tick/README b/lib/Arduino-UpTime/examples/UpTime_tick/README new file mode 100644 index 00000000..34869144 --- /dev/null +++ b/lib/Arduino-UpTime/examples/UpTime_tick/README @@ -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. + diff --git a/lib/Arduino-UpTime/examples/UpTime_tick/UpTime_tick.ino b/lib/Arduino-UpTime/examples/UpTime_tick/UpTime_tick.ino new file mode 100644 index 00000000..f532c5c8 --- /dev/null +++ b/lib/Arduino-UpTime/examples/UpTime_tick/UpTime_tick.ino @@ -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 +#include // 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); +} diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 2390ccb7..8a792241 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -2,573 +2,545 @@ #include "push_pushingbox.h" -void CMD_init() -{ - sCmd.addCommand("button", button); - sCmd.addCommand("buttonSet", buttonSet); - sCmd.addCommand("buttonChange", buttonChange); +void CMD_init() { - sCmd.addCommand("pinSet", pinSet); - sCmd.addCommand("pinChange", pinChange); + sCmd.addCommand("button", button); + sCmd.addCommand("buttonSet", buttonSet); + sCmd.addCommand("buttonChange", buttonChange); - sCmd.addCommand("pwm", pwm); - sCmd.addCommand("pwmSet", pwmSet); + sCmd.addCommand("pinSet", pinSet); + sCmd.addCommand("pinChange", pinChange); - sCmd.addCommand("switch", switch_); + sCmd.addCommand("pwm", pwm); + sCmd.addCommand("pwmSet", pwmSet); + + sCmd.addCommand("switch", switch_); #ifdef analog_enable - sCmd.addCommand("analog", analog); + sCmd.addCommand("analog", analog); #endif #ifdef level_enable - sCmd.addCommand("levelPr", levelPr); - sCmd.addCommand("ultrasonicCm", ultrasonicCm); + sCmd.addCommand("levelPr", levelPr); + sCmd.addCommand("ultrasonicCm", ultrasonicCm); #endif #ifdef dallas_enable - sCmd.addCommand("dallas", dallas); + sCmd.addCommand("dallas", dallas); #endif #ifdef dht_enable - sCmd.addCommand("dhtT", dhtT); - sCmd.addCommand("dhtH", dhtH); - sCmd.addCommand("dhtPerception", dhtP); - sCmd.addCommand("dhtComfort", dhtC); - sCmd.addCommand("dhtDewpoint", dhtD); + sCmd.addCommand("dhtT", dhtT); + sCmd.addCommand("dhtH", dhtH); + sCmd.addCommand("dhtPerception", dhtP); + sCmd.addCommand("dhtComfort", dhtC); + sCmd.addCommand("dhtDewpoint", dhtD); #endif #ifdef bmp_enable - sCmd.addCommand("bmp280T", bmp280T); - sCmd.addCommand("bmp280P", bmp280P); + sCmd.addCommand("bmp280T", bmp280T); + sCmd.addCommand("bmp280P", bmp280P); #endif #ifdef bme_enable - sCmd.addCommand("bme280T", bme280T); - sCmd.addCommand("bme280P", bme280P); - sCmd.addCommand("bme280H", bme280H); - sCmd.addCommand("bme280A", bme280A); + sCmd.addCommand("bme280T", bme280T); + sCmd.addCommand("bme280P", bme280P); + sCmd.addCommand("bme280H", bme280H); + sCmd.addCommand("bme280A", bme280A); #endif #ifdef stepper_enable - sCmd.addCommand("stepper", stepper); - sCmd.addCommand("stepperSet", stepperSet); + sCmd.addCommand("stepper", stepper); + sCmd.addCommand("stepperSet", stepperSet); #endif #ifdef servo_enable - sCmd.addCommand("servo", servo_); - sCmd.addCommand("servoSet", servoSet); + sCmd.addCommand("servo", servo_); + sCmd.addCommand("servoSet", servoSet); #endif #ifdef serial_enable - sCmd.addCommand("serialBegin", serialBegin); - sCmd.addCommand("serialWrite", serialWrite); + sCmd.addCommand("serialBegin", serialBegin); + sCmd.addCommand("serialWrite", serialWrite); #endif #ifdef logging_enable - sCmd.addCommand("logging", logging); + sCmd.addCommand("logging", logging); #endif - sCmd.addCommand("inputDigit", inputDigit); - sCmd.addCommand("digitSet", digitSet); + sCmd.addCommand("inputDigit", inputDigit); + sCmd.addCommand("digitSet", digitSet); - sCmd.addCommand("inputTime", inputTime); - sCmd.addCommand("timeSet", timeSet); + sCmd.addCommand("inputTime", inputTime); + sCmd.addCommand("timeSet", timeSet); - sCmd.addCommand("timerStart", timerStart_); - sCmd.addCommand("timerStop", timerStop_); + sCmd.addCommand("timerStart", timerStart_); + sCmd.addCommand("timerStop", timerStop_); - sCmd.addCommand("text", text); - sCmd.addCommand("textSet", textSet); + sCmd.addCommand("text", text); + sCmd.addCommand("textSet", textSet); - sCmd.addCommand("mqtt", mqttOrderSend); - sCmd.addCommand("http", httpOrderSend); + sCmd.addCommand("mqtt", mqttOrderSend); + sCmd.addCommand("http", httpOrderSend); #ifdef push_enable - sCmd.addCommand("push", pushControl); + sCmd.addCommand("push", pushControl); #endif - sCmd.addCommand("firmwareUpdate", firmwareUpdate); - sCmd.addCommand("firmwareVersion", firmwareVersion); + sCmd.addCommand("firmwareUpdate", firmwareUpdate); + sCmd.addCommand("firmwareVersion", firmwareVersion); - handle_time_init(); + handle_time_init(); } -void button() -{ - String button_number = sCmd.next(); - String button_param = sCmd.next(); - String widget_name = sCmd.next(); - String page_name = sCmd.next(); - String start_state = sCmd.next(); - String page_number = sCmd.next(); - jsonWriteStr(configOptionJson, "button_param" + button_number, button_param); - jsonWriteStr(configLiveJson, "button" + button_number, start_state); - if (isDigitStr(button_param)) - { - pinMode(button_param.toInt(), OUTPUT); - digitalWrite(button_param.toInt(), start_state.toInt()); +//========================================================================================================== +//==========================================Модуль кнопок=================================================== +void button() { + + String button_number = sCmd.next(); + String button_param = sCmd.next(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String start_state = sCmd.next(); + String page_number = sCmd.next(); + + jsonWriteStr(configOptionJson, "button_param" + button_number, button_param); + jsonWriteStr(configLiveJson, "button" + button_number, start_state); + + if (isDigitStr (button_param)) { + pinMode(button_param.toInt(), OUTPUT); + digitalWrite(button_param.toInt(), start_state.toInt()); + } + + if (button_param == "scen") { + jsonWriteStr(configSetupJson, "scen", start_state); + Scenario_init(); + saveConfig(); + } + + if (button_param.indexOf("line") != -1) { + String str = button_param; + while (str.length() != 0) { + if (str == "") return; + String tmp = selectToMarker (str, ","); //line1, + String number = deleteBeforeDelimiter(tmp, "e"); //1, + number.replace(",", ""); + Serial.println(number); + int number_int = number.toInt(); + scenario_line_status[number_int] = start_state.toInt(); + str = deleteBeforeDelimiter(str, ","); } - - if (button_param == "scenario") - { - jsonWriteStr(configSetupJson, "scenario", start_state); - Scenario_init(); - saveConfig(); - } - - if (button_param.indexOf("line") != -1) - { - String str = button_param; - while (str.length() != 0) - { - if (str == "") - return; - String tmp = selectToMarker(str, ","); //line1, - String number = deleteBeforeDelimiter(tmp, "e"); //1, - number.replace(",", ""); - Serial.println(number); - int number_int = number.toInt(); - scenario_line_status[number_int] = start_state.toInt(); - str = deleteBeforeDelimiter(str, ","); - } - } - 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() -{ - String button_number = sCmd.next(); - String button_state = sCmd.next(); - String button_param = jsonReadStr(configOptionJson, "button_param" + button_number); +void buttonSet() { - if (button_param != "na" || button_param != "scenario" || button_param.indexOf("line") != -1) - { - digitalWrite(button_param.toInt(), button_state.toInt()); + String button_number = sCmd.next(); + String button_state = sCmd.next(); + String button_param = jsonReadStr(configOptionJson, "button_param" + button_number); + + if (button_param != "na" || button_param != "scen" || button_param.indexOf("line") != -1) { + digitalWrite(button_param.toInt(), button_state.toInt()); + } + + if (button_param == "scen") { + jsonWriteStr(configSetupJson, "scen", button_state); + Scenario_init(); + saveConfig(); + } + + if (button_param.indexOf("line") != -1) { + String str = button_param; + while (str.length() != 0) { + if (str == "") return; + String tmp = selectToMarker (str, ","); //line1, + String number = deleteBeforeDelimiter(tmp, "e"); //1, + number.replace(",", ""); + Serial.println(number); + int number_int = number.toInt(); + scenario_line_status[number_int] = button_state.toInt(); + str = deleteBeforeDelimiter(str, ","); } + } - if (button_param == "scenario") - { - jsonWriteStr(configSetupJson, "scenario", button_state); - Scenario_init(); - saveConfig(); - } + eventGen ("button", button_number); - if (button_param.indexOf("line") != -1) - { - String str = button_param; - while (str.length() != 0) - { - if (str == "") - return; - String tmp = selectToMarker(str, ","); //line1, - String number = deleteBeforeDelimiter(tmp, "e"); //1, - number.replace(",", ""); - Serial.println(number); - int number_int = number.toInt(); - scenario_line_status[number_int] = button_state.toInt(); - str = deleteBeforeDelimiter(str, ","); - } - } - - eventGen("button", button_number); - - jsonWriteStr(configLiveJson, "button" + button_number, button_state); - sendSTATUS("button" + button_number, button_state); + jsonWriteStr(configLiveJson, "button" + button_number, button_state); + sendSTATUS("button" + button_number, button_state); } -void buttonChange() -{ - String button_number = sCmd.next(); - String current_state = jsonReadStr(configLiveJson, "button" + button_number); - if (current_state == "1") - { - current_state = "0"; - } - else if (current_state == "0") - { - current_state = "1"; - } - order_loop += "buttonSet " + button_number + " " + current_state + ","; - jsonWriteStr(configLiveJson, "button" + button_number, current_state); - sendSTATUS("button" + button_number, current_state); +void buttonChange() { + String button_number = sCmd.next(); + String current_state = jsonReadStr(configLiveJson, "button" + button_number); + if (current_state == "1") { + current_state = "0"; + } else if (current_state == "0") { + current_state = "1"; + } + order_loop += "buttonSet " + button_number + " " + current_state + ","; + jsonWriteStr(configLiveJson, "button" + button_number, current_state); + sendSTATUS("button" + button_number, current_state); } -void pinSet() -{ - String pin_number = sCmd.next(); - String pin_state = sCmd.next(); - pinMode(pin_number.toInt(), OUTPUT); - digitalWrite(pin_number.toInt(), pin_state.toInt()); +void pinSet() { + String pin_number = sCmd.next(); + String pin_state = sCmd.next(); + pinMode(pin_number.toInt(), OUTPUT); + digitalWrite(pin_number.toInt(), pin_state.toInt()); } -void pinChange() -{ - String pin_number = sCmd.next(); - pinMode(pin_number.toInt(), OUTPUT); - digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt())); +void pinChange() { + String pin_number = sCmd.next(); + pinMode(pin_number.toInt(), OUTPUT); + digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt())); +} +//================================================================================================================== +//==========================================Модуль управления ШИМ=================================================== +void pwm() { + + static boolean flag = true; + String pwm_number = sCmd.next(); + String pwm_pin = sCmd.next(); + String widget_name = sCmd.next(); + widget_name.replace("#", " "); + String page_name = sCmd.next(); + String start_state = sCmd.next(); + String page_number = sCmd.next(); + + + uint8_t pwm_pin_int = pwm_pin.toInt(); + jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin); + pinMode(pwm_pin_int, INPUT); + analogWrite(pwm_pin_int, start_state.toInt()); + //analogWriteFreq(32000); + jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state); + + createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number); } -void pwm() -{ - // TODO Unused - // static boolean flag = true; - String pwm_number = sCmd.next(); - String pwm_pin = sCmd.next(); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - String start_state = sCmd.next(); - String page_number = sCmd.next(); +void pwmSet() { - uint8_t pwm_pin_int = pwm_pin.toInt(); - jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin); - pinMode(pwm_pin_int, INPUT); - analogWrite(pwm_pin_int, start_state.toInt()); - jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number); -} + String pwm_number = sCmd.next(); + String pwm_state = sCmd.next(); + int pwm_state_int = pwm_state.toInt(); -void pwmSet() -{ - String pwm_number = sCmd.next(); - String pwm_state = sCmd.next(); - int pwm_state_int = pwm_state.toInt(); + int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number); + analogWrite(pin, pwm_state_int); - int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number); - analogWrite(pin, pwm_state_int); + eventGen ("pwm", pwm_number); - eventGen("pwm", pwm_number); - - jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); - sendSTATUS("pwm" + pwm_number, pwm_state); + jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state); + sendSTATUS("pwm" + pwm_number, pwm_state); } //================================================================================================================== //==========================================Модуль физической кнопки================================================ -void switch_() -{ - String switch_number = sCmd.next(); - String switch_pin = sCmd.next(); - String switch_delay = sCmd.next(); +void switch_ () { - buttons[switch_number.toInt()].attach(switch_pin.toInt()); - buttons[switch_number.toInt()].interval(switch_delay.toInt()); - but[switch_number.toInt()] = true; + String switch_number = sCmd.next(); + String switch_pin = sCmd.next(); + String switch_delay = sCmd.next(); + + buttons[switch_number.toInt()].attach(switch_pin.toInt()); + buttons[switch_number.toInt()].interval(switch_delay.toInt()); + but[switch_number.toInt()] = true; } -void handleButton() -{ - static uint8_t switch_number = 1; +void handleButton() { - if (but[switch_number]) - { - buttons[switch_number].update(); - if (buttons[switch_number].fell()) - { - eventGen("switch", String(switch_number)); + static uint8_t switch_number = 1; - jsonWriteStr(configLiveJson, "switch" + String(switch_number), "1"); - } - if (buttons[switch_number].rose()) - { - eventGen("switch", String(switch_number)); + if (but[switch_number]) { + buttons[switch_number].update(); + if (buttons[switch_number].fell()) { - jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0"); - } + eventGen ("switch", String(switch_number)); + + jsonWriteStr(configLiveJson, "switch" + String(switch_number), "1"); } - switch_number++; - if (switch_number == NUM_BUTTONS) - switch_number = 0; -} + if (buttons[switch_number].rose()) { -void inputDigit() -{ - String value_name = sCmd.next(); - String number = value_name.substring(5); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - page_name.replace("#", " "); - String start_state = sCmd.next(); - String page_number = sCmd.next(); - jsonWriteStr(configLiveJson, "digit" + number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number); -} + eventGen ("switch", String(switch_number)); -void digitSet() -{ - String number = sCmd.next(); - String value = sCmd.next(); - jsonWriteStr(configLiveJson, "digit" + number, value); - sendSTATUS("digit" + number, value); -} - -void inputTime() -{ - String value_name = sCmd.next(); - String number = value_name.substring(4); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - page_name.replace("#", " "); - String start_state = sCmd.next(); - String page_number = sCmd.next(); - jsonWriteStr(configLiveJson, "time" + number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number); -} - -void timeSet() -{ - String number = sCmd.next(); - String value = sCmd.next(); - jsonWriteStr(configLiveJson, "time" + number, value); - sendSTATUS("time" + number, value); -} - -void handle_time_init() -{ - ts.add( - TIME, 1000, [&](void *) { - String tmp = GetTime(); - jsonWriteStr(configLiveJson, "time", tmp); - tmp.replace(":", "-"); - jsonWriteStr(configLiveJson, "timenow", tmp); - eventGen("timenow", ""); - }, - nullptr, true); -} - -void text() -{ - String number = sCmd.next(); - String widget_name = sCmd.next(); - String page_name = sCmd.next(); - String page_number = sCmd.next(); - - createWidget(widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number); -} - -void textSet() -{ - String number = sCmd.next(); - String text = sCmd.next(); - text.replace("_", " "); - - if (text.indexOf("-time") >= 0) - { - text.replace("-time", ""); - text.replace("#", " "); - String time = GetTime(); - time.replace(":", "."); - text = text + " " + GetDataDigital() + " " + time; + jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0"); } - - jsonWriteStr(configLiveJson, "text" + number, text); - sendSTATUS("text" + number, text); + } + switch_number++; + if (switch_number == 6) switch_number = 0; } +//===================================================================================================================================== +//=========================================Добавление окна ввода цифры================================================================= +void inputDigit() { + String value_name = sCmd.next(); + String number = value_name.substring(5); + String widget_name = sCmd.next(); + widget_name.replace("#", " "); + String page_name = sCmd.next(); + page_name.replace("#", " "); + String start_state = sCmd.next(); + String page_number = sCmd.next(); + jsonWriteStr(configLiveJson, "digit" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number); +} +void digitSet() { + String number = sCmd.next(); + String value = sCmd.next(); + jsonWriteStr(configLiveJson, "digit" + number, value); + sendSTATUS("digit" + number, value); +} +//===================================================================================================================================== +//=========================================Добавление окна ввода времени=============================================================== +void inputTime() { + String value_name = sCmd.next(); + String number = value_name.substring(4); + String widget_name = sCmd.next(); + widget_name.replace("#", " "); + String page_name = sCmd.next(); + page_name.replace("#", " "); + String start_state = sCmd.next(); + String page_number = sCmd.next(); + jsonWriteStr(configLiveJson, "time" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number); +} +void timeSet() { + String number = sCmd.next(); + String value = sCmd.next(); + jsonWriteStr(configLiveJson, "time" + number, value); + sendSTATUS("time" + number, value); +} + +void handle_time_init() { + ts.add(TIME, 1000, [&](void*) { + + String tmp = GetTime(); + jsonWriteStr(configLiveJson, "time", tmp); + tmp.replace(":", "-"); + jsonWriteStr(configLiveJson, "timenow", tmp); + eventGen ("timenow", ""); + + }, nullptr, true); +} + +//===================================================================================================================================== +//=========================================Добавление текстового виджета============================================================ +void text() { + + String number = sCmd.next(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String page_number = sCmd.next(); + + createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number); +} + + +void textSet() { + + String number = sCmd.next(); + String text = sCmd.next(); + text.replace("_", " "); + + if (text.indexOf("-time") >= 0) { + text.replace("-time", ""); + text.replace("#", " "); + String time = GetTime(); + time.replace(":", "."); + text = text + " " + GetDataDigital() + " " + time; + } + + jsonWriteStr(configLiveJson, "text" + number, text); + sendSTATUS("text" + number, text); +} +//===================================================================================================================================== +//=========================================Модуль шагового мотора====================================================================== #ifdef stepper_enable //stepper 1 12 13 -void stepper() -{ - String stepper_number = sCmd.next(); - String pin_step = sCmd.next(); - String pin_dir = sCmd.next(); +void stepper() { + String stepper_number = sCmd.next(); + String pin_step = sCmd.next(); + String pin_dir = sCmd.next(); - jsonWriteStr(configOptionJson, "stepper" + stepper_number, pin_step + " " + pin_dir); - pinMode(pin_step.toInt(), OUTPUT); - pinMode(pin_dir.toInt(), OUTPUT); + jsonWriteStr(configOptionJson, "stepper" + stepper_number, pin_step + " " + pin_dir); + pinMode(pin_step.toInt(), OUTPUT); + pinMode(pin_dir.toInt(), OUTPUT); } //stepperSet 1 100 5 -void stepperSet() -{ - String stepper_number = sCmd.next(); - String steps = sCmd.next(); - jsonWriteStr(configOptionJson, "steps" + stepper_number, steps); - String stepper_speed = sCmd.next(); - String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); - String pin_dir = deleteBeforeDelimiter(jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); - Serial.println(pin_step); - Serial.println(pin_dir); - if (steps.toInt() > 0) - digitalWrite(pin_dir.toInt(), HIGH); - if (steps.toInt() < 0) - digitalWrite(pin_dir.toInt(), LOW); - if (stepper_number == "1") - { - ts.add( - STEPPER1, stepper_speed.toInt(), [&](void *) { - int steps_int = abs(jsonReadInt(configOptionJson, "steps1") * 2); - static int count; - count++; - String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper1"), " "); - digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); - yield(); - if (count > steps_int) - { - digitalWrite(pin_step.toInt(), LOW); - ts.remove(STEPPER1); - count = 0; - } - }, - nullptr, true); - } - if (stepper_number == "2") - { - ts.add( - STEPPER2, stepper_speed.toInt(), [&](void *) { - int steps_int = abs(jsonReadInt(configOptionJson, "steps2") * 2); - static int count; - count++; - String pin_step = selectToMarker(jsonReadStr(configOptionJson, "stepper2"), " "); - digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); - yield(); - if (count > steps_int) - { - digitalWrite(pin_step.toInt(), LOW); - ts.remove(STEPPER2); - count = 0; - } - }, - nullptr, true); - } +void stepperSet() { + String stepper_number = sCmd.next(); + String steps = sCmd.next(); + jsonWriteStr(configOptionJson, "steps" + stepper_number, steps); + String stepper_speed = sCmd.next(); + String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); + String pin_dir = deleteBeforeDelimiter (jsonReadStr(configOptionJson, "stepper" + stepper_number), " "); + Serial.println(pin_step); + Serial.println(pin_dir); + if (steps.toInt() > 0) digitalWrite(pin_dir.toInt(), HIGH); + if (steps.toInt() < 0) digitalWrite(pin_dir.toInt(), LOW); + if (stepper_number == "1") { + ts.add(STEPPER1, stepper_speed.toInt(), [&](void*) { + int steps_int = abs(jsonReadInt(configOptionJson, "steps1") * 2); + static int count; + count++; + String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper1"), " "); + digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); + yield(); + if (count > steps_int) { + digitalWrite(pin_step.toInt(), LOW); + ts.remove(STEPPER1); + count = 0; + } + }, nullptr, true); + } + if (stepper_number == "2") { + ts.add(STEPPER2, stepper_speed.toInt(), [&](void*) { + int steps_int = abs(jsonReadInt(configOptionJson, "steps2") * 2); + static int count; + count++; + String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper2"), " "); + digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt())); + yield(); + if (count > steps_int) { + digitalWrite(pin_step.toInt(), LOW); + ts.remove(STEPPER2); + count = 0; + } + }, nullptr, true); + } } #endif //==================================================================================================================================================== //=================================================================Сервоприводы======================================================================= #ifdef servo_enable //servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2 -void servo_() -{ - String servo_number = sCmd.next(); - String servo_pin = sCmd.next(); - String start_state = sCmd.next(); - int start_state_int = start_state.toInt(); - String widget_name = sCmd.next(); - String page_name = sCmd.next(); +void servo_() { + String servo_number = sCmd.next(); + String servo_pin = sCmd.next(); + String start_state = sCmd.next(); + int start_state_int = start_state.toInt(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); - String min_value = sCmd.next(); - String max_value = sCmd.next(); + String min_value = sCmd.next(); + String max_value = sCmd.next(); - String min_deg = sCmd.next(); - String max_deg = sCmd.next(); + String min_deg = sCmd.next(); + String max_deg = sCmd.next(); - String page_number = sCmd.next(); + String page_number = sCmd.next(); - 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()); + 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()); - if (servo_number == "1") - { + if (servo_number == "1") { #ifdef ESP8266 - myServo1.attach(servo_pin.toInt()); - myServo1.write(start_state_int); + myServo1.attach(servo_pin.toInt()); + myServo1.write(start_state_int); #endif #ifdef ESP32 - myServo1.attach(servo_pin.toInt(), 500, 2400); - myServo1.write(start_state_int); + myServo1.attach(servo_pin.toInt(), 500, 2400); + myServo1.write(start_state_int); #endif - } + } - if (servo_number == "2") - { + if (servo_number == "2") { #ifdef ESP8266 - myServo2.attach(servo_pin.toInt()); - myServo2.write(start_state_int); + myServo2.attach(servo_pin.toInt()); + myServo2.write(start_state_int); #endif #ifdef ESP32 - myServo2.attach(servo_pin.toInt(), 500, 2400); - myServo2.write(start_state_int); + myServo2.attach(servo_pin.toInt(), 500, 2400); + myServo2.write(start_state_int); #endif - } + } - jsonWriteStr(configOptionJson, "s_min_val" + servo_number, min_value); - jsonWriteStr(configOptionJson, "s_max_val" + servo_number, max_value); - jsonWriteStr(configOptionJson, "s_min_deg" + servo_number, min_deg); - jsonWriteStr(configOptionJson, "s_max_deg" + servo_number, max_deg); + jsonWriteStr(configOptionJson, "s_min_val" + servo_number, min_value); + jsonWriteStr(configOptionJson, "s_max_val" + servo_number, max_value); + jsonWriteStr(configOptionJson, "s_min_deg" + servo_number, min_deg); + jsonWriteStr(configOptionJson, "s_max_deg" + servo_number, max_deg); - 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() -{ - String servo_number = sCmd.next(); - String servo_state = sCmd.next(); - int servo_state_int = servo_state.toInt(); +void servoSet() { + String servo_number = sCmd.next(); + String servo_state = sCmd.next(); + 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, - jsonReadInt(configOptionJson, "s_min_val" + servo_number), - jsonReadInt(configOptionJson, "s_max_val" + servo_number), - jsonReadInt(configOptionJson, "s_min_deg" + servo_number), - jsonReadInt(configOptionJson, "s_max_deg" + servo_number)); + servo_state_int = map(servo_state_int, + jsonReadInt(configOptionJson, "s_min_val" + servo_number), + jsonReadInt(configOptionJson, "s_max_val" + servo_number), + jsonReadInt(configOptionJson, "s_min_deg" + servo_number), + jsonReadInt(configOptionJson, "s_max_deg" + servo_number)); - if (servo_number == "1") - { + if (servo_number == "1") { #ifdef ESP8266 - myServo1.write(servo_state_int); + myServo1.write(servo_state_int); #endif #ifdef ESP32 - myServo1.write(servo_state_int); + myServo1.write(servo_state_int); #endif - } + } - if (servo_number == "2") - { + if (servo_number == "2") { #ifdef ESP8266 - myServo2.write(servo_state_int); + myServo2.write(servo_state_int); #endif #ifdef ESP32 - myServo2.write(servo_state_int); + myServo2.write(servo_state_int); #endif - } + } - eventGen("servo", servo_number); + //Serial.println(servo_state_int); - jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); - sendSTATUS("servo" + servo_number, servo_state); + eventGen ("servo", servo_number); + + jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state); + sendSTATUS("servo" + servo_number, servo_state); } #endif //==================================================================================================================================================== //===================================================================================serial=========================================================== #ifdef serial_enable -void serialBegin() -{ - //String s_speed = sCmd.next(); - //String rxPin = sCmd.next(); - //String txPin = sCmd.next(); - //SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt()); - //mySerial.begin(s_speed.toInt()); +void serialBegin() { + //String s_speed = sCmd.next(); + //String rxPin = sCmd.next(); + //String txPin = sCmd.next(); + //SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt()); + //mySerial.begin(s_speed.toInt()); } -void serialWrite() -{ - //String text = sCmd.next(); - //mySerial.println(text); +void serialWrite() { + //String text = sCmd.next(); + //mySerial.println(text); } #endif //==================================================================================================================================================== //=================================================Глобальные команды удаленного управления=========================================================== -void mqttOrderSend() -{ - String id = sCmd.next(); - String order = sCmd.next(); +void mqttOrderSend() { - String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/order"; - client_mqtt.publish(all_line.c_str(), order.c_str(), false); + String id = sCmd.next(); + String order = sCmd.next(); + + String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/order"; + //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() -{ - String ip = sCmd.next(); - String order = sCmd.next(); - order.replace("_", "%20"); - String url = "http://" + ip + "/cmd?command=" + order; - getURL(url); +void httpOrderSend() { + + String ip = sCmd.next(); + String order = sCmd.next(); + order.replace("_", "%20"); + String url = "http://" + ip + "/cmd?command=" + order; + getURL(url); } void firmwareUpdate() { @@ -585,45 +557,47 @@ void firmwareVersion() { //============================================================================================================================== //============================выполнение команд (в лупе) по очереди из строки order============================================= -void handleCMD_loop() -{ - if (order_loop != "") - { - String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1, - sCmd.readStr(tmp); //выполняем первую команду - Serial.println("[ORDER] => " + order_loop); - order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду - } +void handleCMD_loop() { + + if (order_loop != "") { + + String tmp = selectToMarker(order_loop, ","); //выделяем из страки order первую команду rel 5 1, + sCmd.readStr(tmp); //выполняем первую команду + Serial.println("[ORDER] => " + order_loop); + order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем выполненную команду + } } -void txtExecution(String file) -{ - String command_all = readFile(file, 2048) + "\r\n"; +//======================================================================================================================================= +//======================================================================================================================================= +void txtExecution(String file) { - command_all.replace("\r\n", "\n"); - command_all.replace("\r", "\n"); + String command_all = readFile(file, 2048) + "\r\n"; - while (command_all.length() != 0) - { - String tmp = selectToMarker(command_all, "\n"); - sCmd.readStr(tmp); - command_all = deleteBeforeDelimiter(command_all, "\n"); - } - command_all = ""; + command_all.replace("\r\n", "\n"); + command_all.replace("\r", "\n"); + + while (command_all.length() != 0) { + + String tmp = selectToMarker (command_all, "\n"); + sCmd.readStr(tmp); + command_all = deleteBeforeDelimiter(command_all, "\n"); + } + command_all = ""; } -void stringExecution(String str) -{ - str = str + "\r\n"; +void stringExecution(String str) { - str.replace("\r\n", "\n"); - str.replace("\r", "\n"); + str = str + "\r\n"; - while (str.length()) - { - String tmp = selectToMarker(str, "\n"); - sCmd.readStr(tmp); + str.replace("\r\n", "\n"); + str.replace("\r", "\n"); - str = deleteBeforeDelimiter(str, "\n"); - } -} + while (str.length() != 0) { + + String tmp = selectToMarker (str, "\n"); + sCmd.readStr(tmp); + + str = deleteBeforeDelimiter(str, "\n"); + } +} \ No newline at end of file diff --git a/src/FileSystem.cpp b/src/FileSystem.cpp index 82c2ca7a..85aaac54 100644 --- a/src/FileSystem.cpp +++ b/src/FileSystem.cpp @@ -1,35 +1,40 @@ #include "Global.h" void File_system_init() { - Serial.begin(115200); - //Serial.setDebugOutput(true); - Serial.println("--------------started----------------"); - //-------------------------------------------------------------- - SPIFFS.begin(); - configSetupJson = readFile("config.json", 4096); - configSetupJson.replace(" ", ""); - configSetupJson.replace("\r\n", ""); - Serial.println(configSetupJson); - jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name")); - jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang")); + + Serial.begin(115200); + //Serial.setDebugOutput(true); + Serial.println("--------------started----------------"); + //-------------------------------------------------------------- + SPIFFS.begin(); + configSetupJson = readFile("config.json", 4096); + configSetupJson.replace(" ", ""); + configSetupJson.replace("\r\n", ""); + Serial.println(configSetupJson); + //jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name")); + //jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang")); + #ifdef ESP32 - uint32_t chipID_u = ESP.getEfuseMac(); - chipID = String(chipID_u); - jsonWriteStr(configSetupJson, "chipID", chipID); + uint32_t chipID_u = ESP.getEfuseMac(); + chipID = String(chipID_u); + jsonWriteStr(configSetupJson, "chipID", chipID); #endif #ifdef ESP8266 - chipID = String(ESP.getChipId()) + "-" + String(ESP.getFlashChipId()); - jsonWriteStr(configSetupJson, "chipID", chipID); - Serial.setDebugOutput(0); + chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId()); + jsonWriteStr(configSetupJson, "chipID", chipID); + Serial.setDebugOutput(0); #endif - jsonWriteStr(configSetupJson, "firmware_version", firmware_version); + jsonWriteStr(configSetupJson, "firmware_version", firmware_version); - prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID; - Serial.println(chipID); + prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID; + Serial.println(chipID); + } void get_esp_info() { + + } diff --git a/src/Global.cpp b/src/Global.cpp index 337258c6..158c2b27 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -1,23 +1,52 @@ #include "Global.h" - #include "JsonUtils.h" +//==============================Objects.cpp(с данными)================================== + +#ifdef WS_enable +AsyncWebSocket ws; +#endif + +//AsyncEventSource events; + TickerScheduler ts(TEST + 1); WiFiClient espClient; + PubSubClient client_mqtt(espClient); + StringCommand sCmd; -// Web AsyncWebServer server(80); -#ifdef WS_enable -AsyncWebSocket ws("/ws"); -#endif +//AsyncWebSocket ws("/ws"); -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; const char *hostName = "IoT Manager"; @@ -77,13 +106,11 @@ boolean udp_data_parse = false; boolean mqtt_send_settings_to_udp = false; boolean i2c_scanning = false; -// Servo -Servo myServo1; -Servo myServo2; + //Buttons -boolean but[NUM_BUTTONS]; -Bounce *buttons = new Bounce[NUM_BUTTONS]; +//boolean but[6]; + // Udp boolean udp_busy = false; @@ -102,24 +129,6 @@ int udp_period; // i2c 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 diff --git a/src/Init.cpp b/src/Init.cpp index d0a45e8d..84db15e1 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -1,241 +1,103 @@ #include "Global.h" 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(); - Scenario_init(); - Timer_countdown_init(); + Device_init(); + Scenario_init(); + Timer_countdown_init(); } void Device_init() { - logging_value_names_list = ""; - enter_to_logging_counter = LOG1 - 1; - analog_value_names_list = ""; - enter_to_analog_counter = 0; + logging_value_names_list = ""; + enter_to_logging_counter = LOG1 - 1; - levelPr_value_name = ""; + analog_value_names_list = ""; + enter_to_analog_counter = 0; - dhtT_value_name = ""; - dhtH_value_name = ""; + levelPr_value_name = ""; + ultrasonicCm_value_name = ""; - bmp280T_value_name = ""; - bmp280P_value_name = ""; + dhtT_value_name = ""; + dhtH_value_name = ""; - bme280T_value_name = ""; - bme280P_value_name = ""; - bme280H_value_name = ""; - bme280A_value_name = ""; + bmp280T_value_name = ""; + bmp280P_value_name = ""; - int array_sz = sizeof(sensors_reading_map) / sizeof(sensors_reading_map[0]); + bme280T_value_name = ""; + bme280P_value_name = ""; + bme280H_value_name = ""; + bme280A_value_name = ""; - for (int i = 0; i < array_sz; i++) { - sensors_reading_map[i] = 0; - } + int array_sz = sizeof(sensors_reading_map) / sizeof(sensors_reading_map[0]); - for (int i = LOG1; i <= LOG5; i++) { - ts.remove(i); - } + for (int i = 0; i < array_sz; i++) { + sensors_reading_map[i] = 0; + } + + for (int i = LOG1; i <= LOG5; i++) { + ts.remove(i); + } #ifdef layout_in_ram - all_widgets = ""; + all_widgets = ""; #else - SPIFFS.remove("/layout.txt"); + SPIFFS.remove("/layout.txt"); #endif - txtExecution("firmware.c.txt"); - //outcoming_date(); + txtExecution("firmware.c.txt"); + //outcoming_date(); } +//-------------------------------сценарии----------------------------------------------------- void Scenario_init() { - if (jsonReadStr(configSetupJson, "scenario") == "1") { - scenario = readFile("firmware.s.txt", 2048); - } + if (jsonReadStr(configSetupJson, "scen") == "1") { + scenario = readFile("firmware.s.txt", 2048); + } } -void prsets_init() { - server.on("/preset", HTTP_GET, [](AsyncWebServerRequest* request) { - String value; - if (request->hasArg("arg")) { - value = request->getParam("arg")->value(); - } - if (value == "1") { - 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 uptime_init() { + ts.add(UPTIME, 5000, [&](void*) { + handle_uptime(); + }, nullptr, true); + ts.add(STATISTICS, statistics_update, [&](void*) { + handle_statistics(); + }, nullptr, true); } -void up_time() { - uint32_t ss = millis() / 1000; - uint32_t mm = ss / 60; - 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 handle_uptime() { + if (myUpTime.check()) { + jsonWriteStr(configSetupJson, "uptime", uptime_as_string()); + } } -void statistics() { - if (WiFi.status() == WL_CONNECTED) { - String urls = "http://backup.privet.lv/visitors/?"; - //----------------------------------------------------------------- - urls += WiFi.macAddress().c_str(); - urls += "&"; - //----------------------------------------------------------------- +void handle_statistics() { + if (WiFi.status() == WL_CONNECTED) { + String urls = "http://backup.privet.lv/visitors/?"; + //----------------------------------------------------------------- + urls += WiFi.macAddress().c_str(); + urls += "&"; + //----------------------------------------------------------------- #ifdef ESP8266 - urls += "iot-manager_esp8266"; + urls += "iot-manager_esp8266"; #endif #ifdef ESP32 - urls += "iot-manager_esp32"; + urls += "iot-manager_esp32"; #endif - urls += "&"; + urls += "&"; + //----------------------------------------------------------------- #ifdef ESP8266 - urls += ESP.getResetReason(); + urls += ESP.getResetReason(); + //Serial.println(ESP.getResetReason()); #endif #ifdef ESP32 - urls += "Power on"; + urls += "Power on"; #endif - urls += "&"; - urls += "ver: "; - urls += String(firmware_version); - String stat = getURL(urls); - } -} - -void statistics_init() { - ts.add( - STATISTICS, statistics_update, [&](void*) { - statistics(); - }, - nullptr, true); -} + urls += "&"; + //----------------------------------------------------------------- + urls += "ver: "; + urls += String(firmware_version); + //----------------------------------------------------------------- + String stat = getURL(urls); + //Serial.println(stat); + } +} \ No newline at end of file diff --git a/src/Logging.cpp b/src/Logging.cpp index ac8c9d83..cfb6f00d 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -6,141 +6,125 @@ void sendLogData(String file, String topic); //===============================================Логирование============================================================ //logging temp1 1 10 Температура Датчики 2 void logging() { - String value_name = sCmd.next(); - String period_min = sCmd.next(); - String maxCount = sCmd.next(); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - String page_number = sCmd.next(); - logging_value_names_list += value_name + ","; - // считаем количество входов в эту функцию - enter_to_logging_counter++; - //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count - 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) { - ts.add( - LOG1, period_min.toInt() * 1000 * 60, [&](void*) { - 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)); - Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done"); - }, - nullptr, false); - } - if (enter_to_logging_counter == LOG2) { - ts.add( - LOG2, period_min.toInt() * 1000 * 60, [&](void*) { - 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)); - Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done"); - }, - nullptr, false); - } - if (enter_to_logging_counter == LOG3) { - ts.add( - LOG3, period_min.toInt() * 1000 * 60, [&](void*) { - 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)); - Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done"); - }, - nullptr, false); - } - if (enter_to_logging_counter == LOG4) { - ts.add( - LOG4, period_min.toInt() * 1000 * 60, [&](void*) { - 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)); - Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done"); - }, - nullptr, false); - } - if (enter_to_logging_counter == LOG5) { - ts.add( - LOG5, period_min.toInt() * 1000 * 60, [&](void*) { - 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)); - Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done"); - }, - nullptr, false); - } + String value_name = sCmd.next(); + String period_min = sCmd.next(); + String maxCount = sCmd.next(); + String widget_name = sCmd.next(); + widget_name.replace("#", " "); + String page_name = sCmd.next(); + String page_number = sCmd.next(); + logging_value_names_list += value_name + ","; + enter_to_logging_counter++; //считаем количество входов в эту функцию + jsonWriteStr(configOptionJson, value_name + "_c", maxCount); //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count + createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", value_name + "_ch", maxCount); //создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch + if (enter_to_logging_counter == LOG1) { + ts.add(LOG1, period_min.toInt() * 1000 * 60, [&](void*) { + 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)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done"); + }, nullptr, false); + } + if (enter_to_logging_counter == LOG2) { + ts.add(LOG2, period_min.toInt() * 1000 * 60, [&](void*) { + 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)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done"); + }, nullptr, false); + } + if (enter_to_logging_counter == LOG3) { + ts.add(LOG3, period_min.toInt() * 1000 * 60, [&](void*) { + 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)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done"); + }, nullptr, false); + } + if (enter_to_logging_counter == LOG4) { + ts.add(LOG4, period_min.toInt() * 1000 * 60, [&](void*) { + 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)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done"); + }, nullptr, false); + } + if (enter_to_logging_counter == LOG5) { + ts.add(LOG5, period_min.toInt() * 1000 * 60, [&](void*) { + 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)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done"); + }, nullptr, false); + } } //=========================================Удаление стрых данных и запись новых================================================================== void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) { - String log_date = readFile(file, 5000); - int current_number_of_lines = count(log_date, "\r\n"); - Serial.println("=====> [i] in log file " + file + " " + current_number_of_lines + " lines"); + String log_date = readFile(file, 5000); + int current_number_of_lines = count(log_date, "\r\n"); + Serial.println("=====> [i] in log file " + file + " " + current_number_of_lines + " lines"); - if (current_number_of_lines > seted_number_of_lines + 1) { - SPIFFS.remove("/" + file); - current_number_of_lines = 0; + if (current_number_of_lines > seted_number_of_lines + 1) { + SPIFFS.remove("/" + file); + current_number_of_lines = 0; + } + if (current_number_of_lines == 0) { + SPIFFS.remove("/" + file); + current_number_of_lines = 0; + } + if (current_number_of_lines > seted_number_of_lines) { + log_date = deleteBeforeDelimiter(log_date, "\r\n"); + if (GetTimeUnix() != "failed") { + log_date += GetTimeUnix() + " " + date_to_add + "\r\n"; + writeFile(file, log_date); } - if (current_number_of_lines == 0) { - SPIFFS.remove("/" + file); - current_number_of_lines = 0; + } else { + if (GetTimeUnix() != "failed") { + addFile(file, GetTimeUnix() + " " + date_to_add); } - if (current_number_of_lines > seted_number_of_lines) { - log_date = deleteBeforeDelimiter(log_date, "\r\n"); - if (GetTimeUnix() != "failed") { - log_date += GetTimeUnix() + " " + date_to_add + "\r\n"; - writeFile(file, log_date); - } - } else { - if (GetTimeUnix() != "failed") { - addFile(file, GetTimeUnix() + " " + date_to_add); - } - } - log_date = ""; + } + log_date = ""; } //=========================================Выбор какие данные отправлять================================================================== void choose_log_date_and_send() { - String all_line = logging_value_names_list; - while (all_line.length() != 0) { - String tmp = selectToMarker(all_line, ","); - sendLogData("log." + tmp + ".txt", tmp + "_ch" - ); - all_line = deleteBeforeDelimiter(all_line, ","); - } - all_line = ""; + String all_line = logging_value_names_list; + while (all_line.length() != 0) { + String tmp = selectToMarker (all_line, ","); + sendLogData("log." + tmp + ".txt", tmp + "_ch"); + all_line = deleteBeforeDelimiter(all_line, ","); + } + all_line = ""; } - //=========================================Отправка данных=================================================================================== void sendLogData(String file, String topic) { - String log_date = readFile(file, 5000); - if (log_date != "Failed") { - log_date.replace("\r\n", "\n"); - log_date.replace("\r", "\n"); - String buf = "{}"; - String json_array; - String unix_time; - String value; - while (log_date.length() != 0) { - String tmp = selectToMarker(log_date, "\n"); - log_date = deleteBeforeDelimiter(log_date, "\n"); - unix_time = selectToMarker(tmp, " "); - jsonWriteInt(buf, "x", unix_time.toInt()); - value = deleteBeforeDelimiter(tmp, " "); - jsonWriteFloat(buf, "y1", value.toFloat()); - if (log_date.length() < 3) { - json_array += buf; - } else { - json_array += buf + ","; - } - buf = "{}"; - } - unix_time = ""; - value = ""; - log_date = ""; - json_array = "{\"status\":[" + json_array + "]}"; - Serial.println(json_array); - sendCHART(topic, json_array); - json_array = ""; - getMemoryLoad("[i] after send log date"); + String log_date = readFile(file, 5000); + if (log_date != "Failed") { + log_date.replace("\r\n", "\n"); + log_date.replace("\r", "\n"); + String buf = "{}"; + String json_array; + String unix_time; + String value; + while (log_date.length() != 0) { + String tmp = selectToMarker (log_date, "\n"); + log_date = deleteBeforeDelimiter(log_date, "\n"); + unix_time = selectToMarker (tmp, " "); + jsonWriteInt(buf, "x", unix_time.toInt()); + value = deleteBeforeDelimiter(tmp, " "); + jsonWriteFloat(buf, "y1", value.toFloat()); + if (log_date.length() < 3) { + json_array += buf; + } else { + json_array += buf + ","; + } + buf = "{}"; } + unix_time = ""; + value = ""; + log_date = ""; + json_array = "{\"status\":[" + json_array + "]}"; + Serial.println(json_array); + sendCHART(topic, json_array); + json_array = ""; + getMemoryLoad("[i] after send log date"); + } } /* @@ -162,12 +146,12 @@ void sendLogData(String file, String topic) { */ //=========================================Очистка данных=================================================================================== void clean_log_date() { - String all_line = logging_value_names_list; - while (all_line.length() != 0) { - String tmp = selectToMarker(all_line, ","); - SPIFFS.remove("/log." + tmp + ".txt"); - all_line = deleteBeforeDelimiter(all_line, ","); - } - all_line = ""; + String all_line = logging_value_names_list; + while (all_line.length() != 0) { + String tmp = selectToMarker (all_line, ","); + SPIFFS.remove("/log." + tmp + ".txt"); + all_line = deleteBeforeDelimiter(all_line, ","); + } + all_line = ""; } -#endif +#endif \ No newline at end of file diff --git a/src/Mqtt.cpp b/src/Mqtt.cpp index 7acbcf16..bdf03cf3 100644 --- a/src/Mqtt.cpp +++ b/src/Mqtt.cpp @@ -1,6 +1,7 @@ #include "Global.h" void callback(char* topic, byte* payload, unsigned int length); + String stateMQTT(); void sendAllData(); void sendAllWigets(); @@ -9,74 +10,41 @@ void outcoming_date(); //===============================================ИНИЦИАЛИЗАЦИЯ================================================ void MQTT_init() { - ts.add( - WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) { - up_time(); - if (WiFi.status() == WL_CONNECTED) { - Serial.println("[VV] WiFi-ok"); - if (client_mqtt.connected()) { - Serial.println("[VV] MQTT-ok"); - led_blink("off"); - } else { - MQTT_Connecting(); - if (!just_load) mqtt_lost_error++; - } - } else { - Serial.println("[E] Lost WiFi connection"); - wifi_lost_error++; - ts.remove(WIFI_MQTT_CONNECTION_CHECK); - StartAPMode(); - } - }, - 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", "" + stateMQTT()); - jsonWriteStr(tmp, "class", "pop-up"); - request->send(200, "text/text", tmp); - }); + ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) { + if (WiFi.status() == WL_CONNECTED) { + Serial.println("[VV] WiFi-ok"); + if (client_mqtt.connected()) { + Serial.println("[VV] MQTT-ok"); + led_blink("off"); + } else { + MQTT_Connecting(); + if (!just_load) mqtt_lost_error++; + } + } else { + Serial.println("[E] Lost WiFi connection"); + wifi_lost_error++; + ts.remove(WIFI_MQTT_CONNECTION_CHECK); + StartAPMode(); + } + }, nullptr, true); } void do_mqtt_connection() { - if (mqtt_connection) { - mqtt_connection = false; - client_mqtt.disconnect(); - MQTT_Connecting(); - } + if (mqtt_connection) { + mqtt_connection = false; + client_mqtt.disconnect(); + MQTT_Connecting(); + } } -void handleMQTT() { - if (WiFi.status() == WL_CONNECTED) { - if (client_mqtt.connected()) { - client_mqtt.loop(); - } +//================================================ОБНОВЛЕНИЕ==================================================== +void handleMQTT() { + if (WiFi.status() == WL_CONNECTED) { + if (client_mqtt.connected()) { + client_mqtt.loop(); } + } } - boolean MQTT_Connecting() { bool res = false; 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") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control 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"); res = true; } else { @@ -108,145 +79,168 @@ boolean MQTT_Connecting() { return res; } + //=====================================================ВХОДЯЩИЕ ДАННЫЕ======================================================== -void callback(char* topic, byte* payload, unsigned int length) { - Serial.print("[MQTT] "); - Serial.print(topic); - String topic_str = String(topic); +void callback(char* topic, byte * payload, unsigned int length) { + Serial.print("[MQTT] "); + Serial.print(topic); + String topic_str = String(topic); - String str; - for (int i = 0; i < length; i++) { - str += (char)payload[i]; - } - Serial.println(" => " + str); + String str; + for (int i = 0; i < length; i++) { + str += (char)payload[i]; + } + Serial.println(" => " + str); - if (str == "HELLO") outcoming_date(); + if (str == "HELLO") outcoming_date(); - //превращает название топика в команду, а значение в параметр команды - if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/button-sw2/control 1 //IoTmanager/800324-1458415/button99/control 1 - String topic = selectFromMarkerToMarker(topic_str, "/", 3); //button1 //button99 - topic = add_set(topic); //buttonSet1 //buttonSet99 - String number = selectToMarkerLast(topic, "Set"); //1 //99 - topic.replace(number, ""); //buttonSet //buttonSet - String final_line = topic + " " + number + " " + str; //buttonSet 1 1 //buttonSet 99 1 - order_loop += final_line + ","; - } + //превращает название топика в команду, а значение в параметр команды + if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/button-sw2/control 1 //IoTmanager/800324-1458415/button99/control 1 + String topic = selectFromMarkerToMarker(topic_str, "/", 3); //button1 //button99 + topic = add_set(topic); //buttonSet1 //buttonSet99 + String number = selectToMarkerLast(topic, "Set"); //1 //99 + topic.replace(number, ""); //buttonSet //buttonSet + String final_line = topic + " " + number + " " + str; //buttonSet 1 1 //buttonSet 99 1 + order_loop += final_line + ","; + } - if (topic_str.indexOf("order") > 0) { - str.replace("_", " "); - //Serial.println(str); - order_loop += str + ","; - } - if (topic_str.indexOf("update") > 0) { - if (str == "1") { - upgrade = true; - } + if (topic_str.indexOf("order") > 0) { + str.replace("_", " "); + //Serial.println(str); + order_loop += str + ","; + } + if (topic_str.indexOf("update") > 0) { + if (str == "1") { + 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() { - sendAllWigets(); - sendAllData(); + + sendAllWigets(); + sendAllData(); #ifdef logging_enable - choose_log_date_and_send(); + choose_log_date_and_send(); #endif - 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) { - String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; - boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); - client_mqtt.print(data); - client_mqtt.endPublish(); - return send_status; + String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; + boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); + client_mqtt.print(data); + client_mqtt.endPublish(); + return send_status; } boolean sendCHART(String topik, String data) { - topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; - boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); - client_mqtt.print(data); - client_mqtt.endPublish(); - return send_status; + topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; + boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); + client_mqtt.print(data); + client_mqtt.endPublish(); + 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) { - topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; - String json_ = "{}"; - jsonWriteStr(json_, "status", state); - client_mqtt.publish(topik.c_str(), json_.c_str(), false); + topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; + String json_ = "{}"; + jsonWriteStr(json_, "status", state); + int send_status = client_mqtt.publish (topik.c_str(), json_.c_str(), false); } +//======================================CONTROL================================================== void sendCONTROL(String id, String topik, String state) { - String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control"; - client_mqtt.publish(all_line.c_str(), state.c_str(), false); + String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control"; + int send_status = client_mqtt.publish (all_line.c_str(), state.c_str(), false); } //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== #ifdef layout_in_ram void sendAllWigets() { - if (all_widgets != "") { - int counter = 0; - String line; - int psn_1 = 0; - int psn_2; - do { - psn_2 = all_widgets.indexOf("\r\n", psn_1); //\r\n - line = all_widgets.substring(psn_1, psn_2); - line.replace("\n", ""); - line.replace("\r\n", ""); - //jsonWriteStr(line, "id", String(counter)); - //jsonWriteStr(line, "pageId", String(counter)); - counter++; - sendMQTT("config", line); - Serial.println("[V] " + line); - psn_1 = psn_2 + 1; - } while (psn_2 + 2 < all_widgets.length()); - getMemoryLoad("[i] after send all widgets"); - } + if (all_widgets != "") { + int counter = 0; + String line; + int psn_1 = 0; + int psn_2; + do { + psn_2 = all_widgets.indexOf("\r\n", psn_1); //\r\n + line = all_widgets.substring(psn_1, psn_2); + line.replace("\n", ""); + line.replace("\r\n", ""); + //jsonWriteStr(line, "id", String(counter)); + //jsonWriteStr(line, "pageId", String(counter)); + counter++; + sendMQTT("config", line); + Serial.println("[V] " + line); + psn_1 = psn_2 + 1; + } while (psn_2 + 2 < all_widgets.length()); + getMemoryLoad("[i] after send all widgets"); + } } #endif #ifndef layout_in_ram void sendAllWigets() { - File configFile = SPIFFS.open("/layout.txt", "r"); - if (!configFile) { - return; - } - configFile.seek(0, SeekSet); //поставим курсор в начало файла - while (configFile.position() != configFile.size()) { - String widget_to_send = configFile.readStringUntil('\n'); - Serial.println("[V] " + widget_to_send); - sendMQTT("config", widget_to_send); - } + File configFile = SPIFFS.open("/layout.txt", "r"); + if (!configFile) { + return; + } + configFile.seek(0, SeekSet); //поставим курсор в начало файла + while (configFile.position() != configFile.size()) { + String widget_to_send = configFile.readStringUntil('\n'); + Serial.println("[V] " + widget_to_send); + sendMQTT("config", widget_to_send); + } } #endif //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== -void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает +void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает - String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} - getMemoryLoad("[i] after send all date"); - 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", + String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} + getMemoryLoad("[i] after send all date"); + 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, ","); - String topic = selectToMarker(tmp, ":"); - topic.replace("\"", ""); - String state = selectToMarkerLast(tmp, ":"); - state.replace("\"", ""); - if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) { - sendSTATUS(topic, state); - //Serial.println("-->" + topic + " " + state); - } - current_config = deleteBeforeDelimiter(current_config, ","); + while (current_config.length() != 0) { + + String tmp = selectToMarker (current_config, ","); + String topic = selectToMarker (tmp, ":"); + topic.replace("\"", ""); + String state = selectToMarkerLast (tmp, ":"); + state.replace("\"", ""); + if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) { + sendSTATUS(topic, state); + //Serial.println("-->" + topic + " " + state); } + current_config = deleteBeforeDelimiter(current_config, ","); + } } + + String stateMQTT() { int state = client_mqtt.state(); switch (state) { @@ -285,69 +279,3 @@ String stateMQTT() { 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, ","); - } - //------------------------------------------------------------------------------------------------------------------------------------------------- -*/ diff --git a/src/Scenario.cpp b/src/Scenario.cpp index a653dd2b..37dfecb0 100644 --- a/src/Scenario.cpp +++ b/src/Scenario.cpp @@ -1,95 +1,96 @@ #include "Global.h" void handleScenario() { - if (jsonReadStr(configSetupJson, "scenario") == "1") { - if ((jsonReadStr(configOptionJson, "scenario_status") != "")) { - int i = 0; - String str = scenario; //читаем переменную с сценариями (то что из файла на странице) - str += "\n"; - str.replace("\r\n", "\n"); - str.replace("\r", "\n"); - while (str.length() != 0) { - //----------------------------------------------------------------------------------------------------------------------- - String tmp = selectToMarker(str, "end"); //выделяем первый сценарий из файла вместе с командами - if (tmp == "") return; - i++; - if (scenario_line_status[i] == 1) { - //Serial.println(i); - String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) - String param_name = selectFromMarkerToMarker(condition, " ", 0); - String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий - String param = selectToMarker(order, ","); //читаем первое событие из файла событий - if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку + if (jsonReadStr(configSetupJson, "scen") == "1") { + if ((jsonReadStr(configOptionJson, "scenario_status") != "")) { + int i = 0; + String str = scenario; //читаем переменную с сценариями (то что из файла на странице) + str += "\n"; + str.replace("\r\n", "\n"); + str.replace("\r", "\n"); + while (str.length() != 0) { + //----------------------------------------------------------------------------------------------------------------------- + String tmp = selectToMarker (str, "end"); //выделяем первый сценарий из файла вместе с командами + if (tmp == "") return; + i++; - String sign = selectFromMarkerToMarker(condition, " ", 1); //читаем знак (=) - String value = selectFromMarkerToMarker(condition, " ", 2); //читаем значение (1) - if (value.indexOf("digit") != -1) { - // value = add_set(value); - value = jsonReadStr(configLiveJson, value); - } - if (value.indexOf("time") != -1) { - // value = add_set(value); - value = jsonReadStr(configLiveJson, value); - } - boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады - if (sign == "=") { - if (jsonReadStr(configLiveJson, param_name) == value) flag = true; - } - if (sign == "!=") { - if (jsonReadStr(configLiveJson, param_name) != value) flag = true; - } - if (sign == "<") { - if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true; - } - if (sign == ">") { - if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true; - } - if (sign == ">=") { - if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true; - } - if (sign == "<=") { - if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true; - } + if (scenario_line_status[i] == 1) { + //Serial.println(i); + String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) + String param_name = selectFromMarkerToMarker(condition, " " , 0); + String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий + String param = selectToMarker (order, ","); //читаем первое событие из файла событий + if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку - if (flag) { - //удаляем строку самого сценария оставляя только команды - tmp = deleteBeforeDelimiter(tmp, "\n"); - //выполняем все команды - stringExecution(tmp); - Serial.println("[SCENARIO] '" + condition + "'"); - } - } - } - str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий - //----------------------------------------------------------------------------------------------------------------------- + String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=) + String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1) + if (value.indexOf("digit") != -1) { + // value = add_set(value); + value = jsonReadStr(configLiveJson, value); } - String tmp2 = jsonReadStr(configOptionJson, "scenario_status"); //читаем файл событий - tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие - jsonWriteStr(configOptionJson, "scenario_status", tmp2); //записываем обновленный файл событий - i = 0; + if (value.indexOf("time") != -1) { + // value = add_set(value); + value = jsonReadStr(configLiveJson, value); + } + boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады + if (sign == "=") { + if (jsonReadStr(configLiveJson, param_name) == value) flag = true; + } + if (sign == "!=") { + if (jsonReadStr(configLiveJson, param_name) != value) flag = true; + } + if (sign == "<") { + if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true; + } + if (sign == ">") { + if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true; + } + if (sign == ">=") { + if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true; + } + if (sign == "<=") { + if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true; + } + + if (flag) { + tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды + stringExecution(tmp); //выполняем все команды + + Serial.println("[SCENARIO] '" + condition + "'"); + //Serial.println(" " + tmp); + } + } } + str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий + //----------------------------------------------------------------------------------------------------------------------- + } + String tmp2 = jsonReadStr(configOptionJson, "scenario_status"); //читаем файл событий + tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие + jsonWriteStr(configOptionJson, "scenario_status", tmp2); //записываем обновленный файл событий + i = 0; } + } } -//событие выглядит как имя плюс set плюс номер: button+Set+1 -void eventGen(String event_name, String number) { - if (jsonReadStr(configSetupJson, "scenario") == "1") { - String tmp = jsonReadStr(configOptionJson, "scenario_status"); //генерирование события - //Serial.println(event_name); - jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ","); - } +void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1 + + if (jsonReadStr(configSetupJson, "scen") == "1") { + String tmp = jsonReadStr(configOptionJson, "scenario_status") ; //генерирование события + //Serial.println(event_name); + jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ","); + } } String add_set(String param_name) { - String num1 = param_name.substring(param_name.length() - 1); - String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1); - if (isDigitStr(num1) && isDigitStr(num2)) { - param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1; - } else { - if (isDigitStr(num1)) { - param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1; - } + String num1 = param_name.substring(param_name.length() - 1); + String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1); + if (isDigitStr(num1) && isDigitStr(num2)) { + param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1; + } else { + if (isDigitStr(num1)) { + param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1; } - return param_name; -} + } + return param_name; +} \ No newline at end of file diff --git a/src/TimeUtils.cpp b/src/TimeUtils.cpp index b7cda1cc..b16d414e 100644 --- a/src/TimeUtils.cpp +++ b/src/TimeUtils.cpp @@ -1,146 +1,133 @@ #include "Global.h" void Time_Init() { - server.on("/time", HTTP_GET, [](AsyncWebServerRequest* request) { - 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(); - }, - nullptr, true); + ts.add(TIME_SYNC, 30000, [&](void*) { + time_check(); + }, nullptr, true); } void time_check() { - if (GetTimeUnix() == "failed") { - Serial.println("[i] Time is not synchronized, start synchronization"); - reconfigTime(); - } + if (GetTimeUnix() == "failed") { + Serial.println("[i] Time is not synchronized, start synchronization"); + reconfigTime(); + } } void reconfigTime() { - if (WiFi.status() == WL_CONNECTED) { - String ntp = jsonReadStr(configSetupJson, "ntp"); - configTime(0, 0, ntp.c_str()); - int i = 0; - Serial.println("[i] Awaiting for time "); + if (WiFi.status() == WL_CONNECTED) { + String ntp = jsonReadStr(configSetupJson, "ntp"); + configTime(0, 0, ntp.c_str()); + int i = 0; + Serial.println("[i] Awaiting for time "); #ifdef ESP32 - struct tm timeinfo; - while (!getLocalTime(&timeinfo) && i <= 4) { - Serial.print("."); - i++; - delay(1000); - } + struct tm timeinfo; + while (!getLocalTime(&timeinfo) && i <= 4) { + Serial.print("."); + i++; + delay(1000); + } #endif #ifdef ESP8266 - //while (!time(nullptr) && i < 4) { - // Serial.print("."); - // i++; - delay(2000); - //} + //while (!time(nullptr) && i < 4) { + // Serial.print("."); + // i++; + delay(2000); + //} #endif - if (GetTimeUnix() != "failed") { - Serial.print("[V] Time synchronized = "); - Serial.print(GetDataDigital()); - Serial.print(" "); - Serial.println(GetTime()); - } else { - Serial.println("[E] Time server or internet connection error, will try again in 30 sec"); - } + if (GetTimeUnix() != "failed") { + Serial.print("[V] Time synchronized = "); + Serial.print(GetDataDigital()); + Serial.print(" "); + Serial.println(GetTime()); } else { - Serial.println("[E] Get time impossible, no wifi connection"); + Serial.println("[E] Time server or internet connection error, will try again in 30 sec"); } + } else { + Serial.println("[E] Get time impossible, no wifi connection"); + } } //Получаем время в формате linux gmt String GetTimeUnix() { - time_t now = time(nullptr); - if (now < 30000) { - return "failed"; - } else { - return String(now); - } + time_t now = time(nullptr); + if (now < 30000) { + return "failed"; + } else { + return String(now); + } } - // Получение текущего времени String GetTime() { - time_t now = time(nullptr); // получаем время с помощью библиотеки time.h - int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); - now = now + zone; - String Time = ""; // Строка для результатов времени - Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 - int i = Time.indexOf(":"); //Ишем позицию первого символа : - Time = Time.substring(i - 2, i + 6); // Выделяем из строки 2 символа перед символом : и 6 символов после - return Time; // Возврашаем полученное время + time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); + now = now + zone; + String Time = ""; // Строка для результатов времени + Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 + int i = Time.indexOf(":"); //Ишем позицию первого символа : + Time = Time.substring(i - 2, i + 6); // Выделяем из строки 2 символа перед символом : и 6 символов после + return Time; // Возврашаем полученное время } String GetTimeWOsec() { - time_t now = time(nullptr); // получаем время с помощью библиотеки time.h - int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); - now = now + zone; - String Time = ""; // Строка для результатов времени - Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 - int i = Time.indexOf(":"); //Ишем позицию первого символа : - Time = Time.substring(i - 2, i + 3); // Выделяем из строки 2 символа перед символом : и 6 символов после - return Time; // Возврашаем полученное время + time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); + now = now + zone; + String Time = ""; // Строка для результатов времени + Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 + int i = Time.indexOf(":"); //Ишем позицию первого символа : + Time = Time.substring(i - 2, i + 3); // Выделяем из строки 2 символа перед символом : и 6 символов после + return Time; // Возврашаем полученное время } // Получение даты String GetDate() { - time_t now = time(nullptr); // получаем время с помощью библиотеки time.h - int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); - now = now + zone; - String Data = ""; // Строка для результатов времени - Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 - Data.replace("\n", ""); - uint8_t i = Data.lastIndexOf(" "); //Ишем позицию последнего символа пробел - String Time = Data.substring(i - 8, i + 1); // Выделяем время и пробел - Data.replace(Time, ""); // Удаляем из строки 8 символов времени и пробел - return Data; // Возврашаем полученную дату + time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt(); + now = now + zone; + String Data = ""; // Строка для результатов времени + Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 + Data.replace("\n", ""); + uint8_t i = Data.lastIndexOf(" "); //Ишем позицию последнего символа пробел + String Time = Data.substring(i - 8, i + 1); // Выделяем время и пробел + Data.replace(Time, ""); // Удаляем из строки 8 символов времени и пробел + return Data; // Возврашаем полученную дату } String GetDataDigital() { - String date = GetDate(); - date = deleteBeforeDelimiter(date, " "); - date.replace("Jan", "01"); - date.replace("Feb", "02"); - date.replace("Mar", "03"); - date.replace("Apr", "04"); - date.replace("May", "05"); - date.replace("Jun", "06"); - date.replace("Jul", "07"); - date.replace("Aug", "08"); - date.replace("Sep", "09"); - date.replace("Oct", "10"); - date.replace("Nov", "11"); - date.replace("Dec", "12"); + String date = GetDate(); - String month = date.substring(0, 2); - String day = date.substring(3, 5); - String year = date.substring(8, 10); + date = deleteBeforeDelimiter(date, " "); - String out = day; - out += "."; - out += month; - out += "."; - out += year; + date.replace("Jan", "01"); + date.replace("Feb", "02"); + date.replace("Mar", "03"); + date.replace("Apr", "04"); + date.replace("May", "05"); + date.replace("Jun", "06"); + date.replace("Jul", "07"); + date.replace("Aug", "08"); + date.replace("Sep", "09"); + date.replace("Oct", "10"); + date.replace("Nov", "11"); + date.replace("Dec", "12"); - return out; + String month = date.substring(0, 2); + String day = date.substring(3, 5); + String year = date.substring(8, 10); + + String out = day; + out += "."; + out += month; + out += "."; + out += year; + + return out; } int timeToMin(String Time) { - //"00:00:00" время в секунды - long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах - Time = deleteBeforeDelimiter(Time, ":"); // Теперь здесь минуты секунды - min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут - return min; -} + //"00:00:00" время в секунды + long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах + Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды + min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут + return min; +} \ No newline at end of file diff --git a/src/Timers.cpp b/src/Timers.cpp index 73dfe5e9..6cef52ba 100644 --- a/src/Timers.cpp +++ b/src/Timers.cpp @@ -1,89 +1,91 @@ #include "Global.h" +//================================================================================================================ +//=========================================Таймеры================================================================= void Timer_countdown_init() { - ts.add( - TIMER_COUNTDOWN, 1000, [&](void*) { - String old_line = jsonReadStr(configOptionJson, "timers"); - if (old_line != "") { - //Serial.println(old_line); - int i = 0; - do { - String timer = selectFromMarkerToMarker(old_line, ",", i); - Serial.print("timer no " + String(i) + ": "); - Serial.println(timer); - if (timer == "not found" || timer == "") return; - int number = selectToMarker(timer, ":").toInt(); - int time = readTimer(number); - if (time == 0) { - delTimer(String(number)); - jsonWriteStr(configLiveJson, "timer" + String(number), "0"); - eventGen("timer", String(number)); - } else { - time--; - addTimer(String(number), String(time)); - } - i++; - } while (i <= 9); - } - }, - nullptr, true); + + ts.add(TIMER_COUNTDOWN, 1000, [&](void*) { + + String old_line = jsonReadStr(configOptionJson, "timers"); + if (old_line != "") { + //Serial.println(old_line); + int i = 0; + do { + String timer = selectFromMarkerToMarker(old_line, "," , i); + Serial.print("timer no " + String (i) + ": "); + Serial.println(timer); + if (timer == "not found" || timer == "") return; + int number = selectToMarker (timer, ":").toInt(); + int time = readTimer(number); + if (time == 0) { + delTimer (String (number)); + jsonWriteStr(configLiveJson, "timer" + String(number), "0"); + eventGen ("timer", String(number)); + } else { + time--; + addTimer(String (number), String (time)); + } + i++; + } while (i <= 9); + } + }, nullptr, true); } void timerStart_() { - String number = sCmd.next(); - String period_of_time = sCmd.next(); - String type = sCmd.next(); - if (period_of_time.indexOf("digit") != -1) { - period_of_time = jsonReadStr(configLiveJson, period_of_time); - } - if (type == "sec") period_of_time = period_of_time; - if (type == "min") period_of_time = String(period_of_time.toInt() * 60); - if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); - addTimer(number, period_of_time); - jsonWriteStr(configLiveJson, "timer" + number, "1"); + String number = sCmd.next(); + String period_of_time = sCmd.next(); + String type = sCmd.next(); + if (period_of_time.indexOf("digit") != -1) { + //period_of_time = add_set(period_of_time); + period_of_time = jsonReadStr(configLiveJson, period_of_time); + } + if (type == "sec") period_of_time = period_of_time; + if (type == "min") period_of_time = String(period_of_time.toInt() * 60); + if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); + addTimer(number, period_of_time); + jsonWriteStr(configLiveJson, "timer" + number, "1"); } - void addTimer(String number, String time) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - String new_timer = number + ":" + time; - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить - ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) - tmp.replace(timer + ",", ""); - tmp += new_timer + ","; - } else { //если его нет - tmp += new_timer + ","; - } - jsonWriteStr(configOptionJson, "timers", tmp); - //Serial.println("ura"); + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + String new_timer = number + ":" + time; + int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить + ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) + tmp.replace(timer + ",", ""); + tmp += new_timer + ","; + } else { //если его нет + tmp += new_timer + ","; + } + jsonWriteStr(configOptionJson, "timers", tmp); + //Serial.println("ura"); } void timerStop_() { - String number = sCmd.next(); - delTimer(number); + String number = sCmd.next(); + delTimer(number); } -void delTimer(String number) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить - tmp.replace(timer, ""); //удаляем таймер - jsonWriteStr(configOptionJson, "timers", tmp); - } +void delTimer (String number) { + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить + tmp.replace(timer, ""); //удаляем таймер + jsonWriteStr(configOptionJson, "timers", tmp); + } } int readTimer(int number) { - String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать - String timer; - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать - timer = deleteBeforeDelimiter(timer, ":"); - } - return timer.toInt(); -} + String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120, + int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать + String timer; + if (psn1 != -1) { //если он есть + int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой + timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать + timer = deleteBeforeDelimiter(timer, ":"); + } + return timer.toInt(); +} \ No newline at end of file diff --git a/src/Upgrade.cpp b/src/Upgrade.cpp index e8982117..329588fd 100644 --- a/src/Upgrade.cpp +++ b/src/Upgrade.cpp @@ -1,125 +1,89 @@ #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() { - String last_version = WiFi.status() == WL_CONNECTED ? getURL(getVersionUrl()) : ""; - jsonWriteStr(configSetupJson, "last_version", last_version); - - Serial.printf("[i] Last firmware version: %s\n", last_version.c_str()); - - 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", "Последняя версия прошивки уже установлена."); - jsonWriteStr(tmp, "class", "pop-up"); - } else { - jsonWriteStr(tmp, "title", "Имеется новая версия прошивкиИдет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить"); - jsonWriteStr(tmp, "class", "pop-up"); - } - } else { - jsonWriteStr(tmp, "title", "Ошибка... Cервер не найден. Попробуйте позже..."); - jsonWriteStr(tmp, "class", "pop-up"); - } - } else { - jsonWriteStr(tmp, "title", "Нажмите на кнопку \"обновить прошивку\" повторно..."); - jsonWriteStr(tmp, "class", "pop-up"); - } - } else { - jsonWriteStr(tmp, "title", "Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти..."); - jsonWriteStr(tmp, "class", "pop-up"); - } - } else { - jsonWriteStr(tmp, "title", "Устройство не подключен к роутеру..."); - 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"); - }); +#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); + Serial.print("[i] Last firmware version: "); + Serial.println(last_version); } void do_upgrade_url() { - if (upgrade_url) { - upgrade_url = false; - last_version = getURL(getVersionUrl()); - jsonWriteStr(configSetupJson, "last_version", last_version); - } + if (upgrade_url) { + upgrade_url = false; +#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); + } } void upgrade_firmware() { - String scenario_for_update; - String config_for_update; - String configSetupJson_for_update; - scenario_for_update = readFile("firmware.s.txt", 4000); - config_for_update = readFile("firmware.c.txt", 4000); - configSetupJson_for_update = configSetupJson; - Serial.println("Start upgrade SPIFFS, please wait..."); + String scenario_for_update; + String config_for_update; + String configSetup_for_update; + scenario_for_update = readFile("firmware.s.txt", 4000); + config_for_update = readFile("firmware.c.txt", 4000); + configSetup_for_update = configSetupJson; - WiFiClient client_for_upgrade; + Serial.println("Start upgrade SPIFFS, please wait..."); - httpUpdate.rebootOnUpdate(false); - t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, getFirmwareUrl()); + WiFiClient client_for_upgrade; + +#ifdef ESP32 + httpUpdate.rebootOnUpdate(false); + 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) { + + writeFile("firmware.s.txt", scenario_for_update); + writeFile("firmware.c.txt", config_for_update); + writeFile("config.json", configSetup_for_update); + saveConfig(); + + Serial.println("SPIFFS upgrade done!"); + Serial.println("Start upgrade BUILD, please wait..."); + +#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) { - writeFile("firmware.s.txt", scenario_for_update); - writeFile("firmware.c.txt", config_for_update); - writeFile("config.json", configSetupJson_for_update); - saveConfig(); - Serial.println("SPIFFS upgrade done!"); - Serial.println("Start upgrade BUILD, please wait..."); - - t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, getFirmwareUrl()); - - if (ret == HTTP_UPDATE_OK) { - Serial.println("BUILD upgrade done!"); - Serial.println("Restart ESP...."); - ESP.restart(); - } else { - Serial.println("!!!!BUILD upgrade ERROR"); - } + Serial.println("BUILD upgrade done!"); + Serial.println("Restart ESP...."); + ESP.restart(); } else { - Serial.println("!!!!SPIFFS upgrade ERROR"); + Serial.println("!!!!BUILD upgrade ERROR"); } + } else { + Serial.println("!!!!SPIFFS upgrade ERROR"); + } } void do_upgrade() { - if (upgrade) { - upgrade = false; - upgrade_firmware(); - } + if (upgrade) { + upgrade = false; + upgrade_firmware(); + } } /* @@ -128,95 +92,12 @@ void do_upgrade() { case HTTP_UPDATE_FAILED: Serial.printf("UPDATE_FAILED Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); break; - case HTTP_UPDATE_NO_UPDATES: Serial.println("NO_UPDATES"); break; - case HTTP_UPDATE_OK: Serial.println("HTTP_UPDATE_OK"); 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", "_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", "_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", "_UPDATE_OK"); - jsonWriteStr(var, "class", "pop-up"); - //request->send(200, "text/text", var); - break; - } - } -*/ +*/ \ No newline at end of file diff --git a/src/Web.cpp b/src/Web.cpp new file mode 100644 index 00000000..4a3b0756 --- /dev/null +++ b/src/Web.cpp @@ -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", "" + 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", "Последняя версия прошивки уже установлена."); + jsonWriteStr(tmp, "class", "pop-up"); + } + break; + + case 2: { + jsonWriteStr(tmp, "title", "Имеется новая версия прошивкиИдет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить"); + jsonWriteStr(tmp, "class", "pop-up"); + } + break; + + case 3: { + jsonWriteStr(tmp, "title", "Ошибка... Cервер не найден. Попробуйте позже..."); + jsonWriteStr(tmp, "class", "pop-up"); + } + break; + + case 4: { + jsonWriteStr(tmp, "title", "Нажмите на кнопку \"обновить прошивку\" повторно..."); + jsonWriteStr(tmp, "class", "pop-up"); + break; + } + + case 5: { + jsonWriteStr(tmp, "title", "Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти..."); + jsonWriteStr(tmp, "class", "pop-up"); + break; + } + + case 6: { + jsonWriteStr(tmp, "title", "Устройство не подключено к роутеру..."); + jsonWriteStr(tmp, "class", "pop-up"); + break; + } + + case 7: { + jsonWriteStr(tmp, "title", "Обновление на новую версию возможно только через 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"); + }); +} \ No newline at end of file diff --git a/src/Web_server.cpp b/src/Web_server.cpp index a2f8f602..50f83c1c 100644 --- a/src/Web_server.cpp +++ b/src/Web_server.cpp @@ -1,230 +1,234 @@ #include "Global.h" void Web_server_init() { + /********************************************************************************* + ***************************************OTA**************************************** + *********************************************************************************/ #ifdef OTA_enable - ArduinoOTA.onStart([]() { - events.send("Update Start", "ota"); - }); - ArduinoOTA.onEnd([]() { - events.send("Update End", "ota"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - char p[32]; - sprintf(p, "Progress: %u%%\n", (progress / (total / 100))); - events.send(p, "ota"); - }); - ArduinoOTA.onError([](ota_error_t error) { - if (error == OTA_AUTH_ERROR) - events.send("Auth Failed", "ota"); - else if (error == OTA_BEGIN_ERROR) - events.send("Begin Failed", "ota"); - else if (error == OTA_CONNECT_ERROR) - events.send("Connect Failed", "ota"); - else if (error == OTA_RECEIVE_ERROR) - events.send("Recieve Failed", "ota"); - else if (error == OTA_END_ERROR) - events.send("End Failed", "ota"); - }); - ArduinoOTA.setHostname(hostName); - ArduinoOTA.begin(); + ArduinoOTA.onStart([]() { + events.send("Update Start", "ota"); + }); + ArduinoOTA.onEnd([]() { + events.send("Update End", "ota"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + char p[32]; + sprintf(p, "Progress: %u%%\n", (progress / (total / 100))); + events.send(p, "ota"); + }); + ArduinoOTA.onError([](ota_error_t error) { + if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota"); + else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota"); + else if (error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota"); + else if (error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota"); + else if (error == OTA_END_ERROR) events.send("End Failed", "ota"); + }); + ArduinoOTA.setHostname(hostName); + ArduinoOTA.begin(); #endif - /********************************************************************************* + /********************************************************************************* **************************************MDNS**************************************** *********************************************************************************/ #ifdef MDNS_enable - MDNS.addService("http", "tcp", 80); + MDNS.addService("http", "tcp", 80); #endif - //SPIFFS.begin(); - /********************************************************************************* + //SPIFFS.begin(); + /********************************************************************************* **************************************WS****************************************** *********************************************************************************/ #ifdef WS_enable - ws.onEvent(onWsEvent); - server.addHandler(&ws); + ws.onEvent(onWsEvent); + server.addHandler(&ws); - events.onConnect([](AsyncEventSourceClient *client) { - //!!!client->send("hello!", NULL, millis(), 1000); - }); + events.onConnect([](AsyncEventSourceClient * client) { + //!!!client->send("hello!", NULL, millis(), 1000); + }); - server.addHandler(&events); + server.addHandler(&events); #endif - + /********************************************************************************* + **************************************WEB**************************************** + *********************************************************************************/ #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) - 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 - /* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) { + /* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); });*/ - server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000"); - server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000"); - server.serveStatic("/favicon.ico", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000"); + server.serveStatic("/css/", SPIFFS, "/css/").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("/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) { - Serial.printf("NOT_FOUND: "); - if (request->method() == HTTP_GET) - Serial.printf("GET"); - else if (request->method() == HTTP_POST) - Serial.printf("POST"); - else if (request->method() == HTTP_DELETE) - Serial.printf("DELETE"); - else if (request->method() == HTTP_PUT) - Serial.printf("PUT"); - else if (request->method() == HTTP_PATCH) - Serial.printf("PATCH"); - else if (request->method() == HTTP_HEAD) - Serial.printf("HEAD"); - else if (request->method() == HTTP_OPTIONS) - Serial.printf("OPTIONS"); - else - Serial.printf("UNKNOWN"); - Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str()); + server.onNotFound([](AsyncWebServerRequest * request) { + Serial.printf("NOT_FOUND: "); + if (request->method() == HTTP_GET) + Serial.printf("GET"); + else if (request->method() == HTTP_POST) + Serial.printf("POST"); + else if (request->method() == HTTP_DELETE) + Serial.printf("DELETE"); + else if (request->method() == HTTP_PUT) + Serial.printf("PUT"); + else if (request->method() == HTTP_PATCH) + Serial.printf("PATCH"); + else if (request->method() == HTTP_HEAD) + Serial.printf("HEAD"); + else if (request->method() == HTTP_OPTIONS) + Serial.printf("OPTIONS"); + else + Serial.printf("UNKNOWN"); + Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str()); - if (request->contentLength()) { - Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str()); - Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength()); - } + if (request->contentLength()) { + Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str()); + Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength()); + } - int headers = request->headers(); - int i; - for (i = 0; i < headers; i++) { - AsyncWebHeader *h = request->getHeader(i); - Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); - } + int headers = request->headers(); + int i; + for (i = 0; i < headers; i++) { + AsyncWebHeader* h = request->getHeader(i); + Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); + } - int params = request->params(); - for (i = 0; i < params; i++) { - AsyncWebParameter *p = request->getParam(i); - if (p->isFile()) { - Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); - } else if (p->isPost()) { - Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); - } else { - Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); - } - } + int params = request->params(); + for (i = 0; i < params; i++) { + AsyncWebParameter* p = request->getParam(i); + if (p->isFile()) { + Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); + } else if (p->isPost()) { + Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } else { + Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } + } - request->send(404); - }); + request->send(404); + }); - server.onFileUpload([](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) { - if (!index) - Serial.printf("UploadStart: %s\n", filename.c_str()); - Serial.printf("%s", (const char *)data); - if (final) - Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len); - }); - server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { - if (!index) - Serial.printf("BodyStart: %u\n", total); - Serial.printf("%s", (const char *)data); - if (index + len == total) - Serial.printf("BodyEnd: %u\n", total); - }); + server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) { + if (!index) + Serial.printf("UploadStart: %s\n", filename.c_str()); + Serial.printf("%s", (const char*)data); + if (final) + Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len); + }); - server.begin(); - // --------------------Выдаем данные configLiveJson //config.live.json - динамические данные - server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", configLiveJson); - }); - // --------------------Выдаем данные configOptionJson //config.option.json - данные не являющиеся событиями - server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", configOptionJson); - }); - // -------------------Выдаем данные configSetupJson //config.setup.json - для хранения постоянных данных - server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", configSetupJson); - }); + server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) { + if (!index) + Serial.printf("BodyStart: %u\n", total); + Serial.printf("%s", (const char*)data); + if (index + len == total) + Serial.printf("BodyEnd: %u\n", total); + }); - // ------------------Выполнение команды из запроса - //http://192.168.88.45/cmd?command=rel%201%201 - server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest *request) { - String com = request->getParam("command")->value(); - Serial.println(com); - order_loop += com + ","; - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении - }); + server.begin(); + + // --------------------Выдаем данные configJson //config.live.json - динамические данные + server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) { + request->send(200, "application/json", configLiveJson); + }); + // --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями + server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) { + request->send(200, "application/json", configOptionJson); + }); + // -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных + server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) { + request->send(200, "application/json", configSetupJson); + }); + + // ------------------Выполнение команды из запроса + //http://192.168.88.45/cmd?command=rel%201%201 + server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) { + String com = request->getParam("command")->value(); + Serial.println(com); + order_loop += com + ","; + request->send(200, "text/text", "OK"); // отправляем ответ о выполнении + }); } /********************************************************************************************************************************* *********************************************************WS********************************************************************** ********************************************************************************************************************************/ #ifdef WS_enable -void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { - if (type == WS_EVT_CONNECT) { - Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); - client->printf(json.c_str(), client->id()); - //client->ping(); - } else if (type == WS_EVT_DISCONNECT) { - Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); - } else if (type == WS_EVT_ERROR) { - Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t *)arg), (char *)data); - } else if (type == WS_EVT_PONG) { - Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char *)data : ""); - } else if (type == WS_EVT_DATA) { - AwsFrameInfo *info = (AwsFrameInfo *)arg; - String msg = ""; - if (info->final && info->index == 0 && info->len == len) { - //the whole message is in a single frame and we got all of it's data - Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT) ? "text" : "binary", info->len); +void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) { + if (type == WS_EVT_CONNECT) { + Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); + client->printf(json.c_str(), client->id()); + //client->ping(); + } else if (type == WS_EVT_DISCONNECT) { + Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); + } else if (type == WS_EVT_ERROR) { + Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + } else if (type == WS_EVT_PONG) { + Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char*)data : ""); + } else if (type == WS_EVT_DATA) { + AwsFrameInfo * info = (AwsFrameInfo*)arg; + String msg = ""; + if (info->final && info->index == 0 && info->len == len) { + //the whole message is in a single frame and we got all of it's data + Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT) ? "text" : "binary", info->len); - if (info->opcode == WS_TEXT) { - for (size_t i = 0; i < info->len; i++) { - msg += (char)data[i]; - } - } else { - char buff[3]; - for (size_t i = 0; i < info->len; i++) { - sprintf(buff, "%02x ", (uint8_t)data[i]); - msg += buff; - } - } - Serial.printf("%s\n", msg.c_str()); - - if (info->opcode == WS_TEXT) - client->text("{}"); - else - client->binary("{}"); - } else { - //message is comprised of multiple frames or the frame is split into multiple packets - if (info->index == 0) { - if (info->num == 0) - Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary"); - Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); - } - - Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len); - - if (info->opcode == WS_TEXT) { - for (size_t i = 0; i < len; i++) { - msg += (char)data[i]; - } - } else { - char buff[3]; - for (size_t i = 0; i < len; i++) { - sprintf(buff, "%02x ", (uint8_t)data[i]); - msg += buff; - } - } - Serial.printf("%s\n", msg.c_str()); - - if ((info->index + len) == info->len) { - Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); - if (info->final) { - Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary"); - if (info->message_opcode == WS_TEXT) - client->text("I got your text message"); - else - client->binary("I got your binary message"); - } - } + if (info->opcode == WS_TEXT) { + for (size_t i = 0; i < info->len; i++) { + msg += (char) data[i]; } + } else { + char buff[3]; + for (size_t i = 0; i < info->len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n", msg.c_str()); + + if (info->opcode == WS_TEXT) + client->text("{}"); + else + client->binary("{}"); + } else { + //message is comprised of multiple frames or the frame is split into multiple packets + if (info->index == 0) { + if (info->num == 0) + Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary"); + Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); + } + + Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len); + + if (info->opcode == WS_TEXT) { + for (size_t i = 0; i < len; i++) { + msg += (char) data[i]; + } + } else { + char buff[3]; + for (size_t i = 0; i < len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n", msg.c_str()); + + if ((info->index + len) == info->len) { + Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); + if (info->final) { + Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary"); + if (info->message_opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + } + } } + } } -#endif +#endif \ No newline at end of file diff --git a/src/WiFiUtils.cpp b/src/WiFiUtils.cpp index 18b55510..30c33f63 100644 --- a/src/WiFiUtils.cpp +++ b/src/WiFiUtils.cpp @@ -2,146 +2,88 @@ boolean RouterFind(String ssid); -void WIFI_init() -{ - // --------------------Получаем 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"); // отправляем ответ о выполнении - }); +void ROUTER_Connecting() { + + led_blink("slow"); - // --------------------Получаем логин и пароль для 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"); // отправляем ответ о выполнении - }); + WiFi.mode(WIFI_STA); - 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(); + byte tries = 20; + String _ssid = jsonReadStr(configSetupJson, "routerssid"); + String _password = jsonReadStr(configSetupJson, "routerpass"); + //WiFi.persistent(false); + + if (_ssid == "" && _password == "") { + WiFi.begin(); + } + else { + WiFi.begin(_ssid.c_str(), _password.c_str()); + Serial.print("ssid: "); + Serial.println(_ssid); + } + // Делаем проверку подключения до тех пор пока счетчик tries + // не станет равен нулю или не получим подключение + while (--tries && WiFi.status() != WL_CONNECTED) { + if (WiFi.status() == WL_CONNECT_FAILED) { + Serial.println("[E] password is not correct"); + tries = 1; + jsonWriteInt(configOptionJson, "pass_status", 1); + } + Serial.print("."); + delay(1000); + } + + if (WiFi.status() != WL_CONNECTED) + { + // Если не удалось подключиться запускаем в режиме AP + Serial.println(""); + // WiFi.disconnect(true); + StartAPMode(); + + } + else { + // Иначе удалось подключиться отправляем сообщение + // о подключении и выводим адрес IP + Serial.println(""); + Serial.println("[V] WiFi connected"); + Serial.print("[V] IP address: http://"); + Serial.print(WiFi.localIP()); + Serial.println(""); + jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString()); + led_blink("off"); + //add_dev_in_list("dev.txt", chipID, WiFi.localIP().toString()); + MQTT_init(); + } } -void ROUTER_Connecting() -{ - led_blink("slow"); +bool StartAPMode() { + Serial.println("WiFi up AP"); + WiFi.disconnect(); - WiFi.mode(WIFI_STA); + WiFi.mode(WIFI_AP); - byte tries = 20; - String _ssid = jsonReadStr(configSetupJson, "ssid"); - String _password = jsonReadStr(configSetupJson, "password"); - //WiFi.persistent(false); + String _ssidAP = jsonReadStr(configSetupJson, "apssid"); + String _passwordAP = jsonReadStr(configSetupJson, "appass"); + WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); + IPAddress myIP = WiFi.softAPIP(); + led_blink("on"); + Serial.print("AP IP address: "); + Serial.println(myIP); + jsonWriteStr(configSetupJson, "ip", myIP.toString()); - if (_ssid == "" && _password == "") - { - WiFi.begin(); - } - else - { - WiFi.begin(_ssid.c_str(), _password.c_str()); - Serial.print("ssid: "); - Serial.println(_ssid); - } - // Делаем проверку подключения до тех пор пока счетчик tries - // не станет равен нулю или не получим подключение - while (--tries && WiFi.status() != WL_CONNECTED) - { - if (WiFi.status() == WL_CONNECT_FAILED) - { - Serial.println("[E] password is not correct"); - tries = 1; - jsonWriteInt(configOptionJson, "pass_status", 1); - } - Serial.print("."); - delay(1000); - } - - Serial.println(); - if (WiFi.status() != WL_CONNECTED) - { - StartAPMode(); - } - else - { - Serial.println("[V] WiFi connected"); - Serial.print("[V] IP address: http://"); - Serial.print(WiFi.localIP()); - Serial.println(); - - jsonWriteStr(configLiveJson, "ip", WiFi.localIP().toString()); - led_blink("off"); - } + //if (jsonReadInt(configOptionJson, "pass_status") != 1) { + ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) { + Serial.println("->try find router"); + if (RouterFind(jsonReadStr(configSetupJson, "routerssid"))) { + ts.remove(ROUTER_SEARCHING); + WiFi.scanDelete(); + ROUTER_Connecting(); + } + }, nullptr, true); + //} + return true; } -bool StartAPMode() -{ - Serial.println("WiFi up AP"); - WiFi.disconnect(); - - WiFi.mode(WIFI_AP); - - String _ssidAP = jsonReadStr(configSetupJson, "ssidAP"); - String _passwordAP = jsonReadStr(configSetupJson, "passwordAP"); - WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); - IPAddress myIP = WiFi.softAPIP(); - led_blink("on"); - Serial.print("AP IP address: "); - Serial.println(myIP); - jsonWriteStr(configLiveJson, "ip", myIP.toString()); - - if (jsonReadInt(configOptionJson, "pass_status") != 1) - { - ts.add( - ROUTER_SEARCHING, 10 * 1000, [&](void *) { - Serial.println("->try find router"); - if (RouterFind(jsonReadStr(configSetupJson, "ssid"))) - { - ts.remove(ROUTER_SEARCHING); - WiFi.scanDelete(); - ROUTER_Connecting(); - MQTT_init(); - } - }, - nullptr, true); - } - return true; -} boolean RouterFind(String ssid) { @@ -191,4 +133,4 @@ boolean RouterFind(String ssid) WiFi.scanDelete(); } return res; -} +} \ No newline at end of file diff --git a/src/Widgets.cpp b/src/Widgets.cpp index b7d841aa..62ae8edf 100644 --- a/src/Widgets.cpp +++ b/src/Widgets.cpp @@ -1,79 +1,90 @@ #include "Global.h" -void createWidget(String widget_name, String page_name, String page_number, String file, String topic) { - String widget; - widget = readFile(file, 1024); - if (widget == "Failed") return; - if (widget == "Large") return; - widget_name.replace("#", " "); - page_name.replace("#", " "); - jsonWriteStr(widget, "page", page_name); - jsonWriteStr(widget, "order", page_number); - jsonWriteStr(widget, "descr", widget_name); - jsonWriteStr(widget, "topic", prex + "/" + topic); +//====================================================================================================================== +//===============================================Создание виджетов======================================================= +void createWidget (String widget_name, String page_name, String page_number, String file, String topic) { + + String widget; + widget = readFile(file, 1024); + + if (widget == "Failed") return; + if (widget == "Large") return; + + widget_name.replace("#", " "); + page_name.replace("#", " "); + + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "topic", prex + "/" + topic); + #ifdef layout_in_ram - all_widgets += widget + "\r\n"; + all_widgets += widget + "\r\n"; #else - addFile("layout.txt", widget); + addFile("layout.txt", widget); #endif - 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) { - String widget; - widget = readFile(file, 1024); +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) { - if (widget == "Failed") return; - if (widget == "Large") return; + String widget; + widget = readFile(file, 1024); - widget_name.replace("#", " "); - page_name.replace("#", " "); + if (widget == "Failed") return; + if (widget == "Large") return; - jsonWriteStr(widget, "page", page_name); - jsonWriteStr(widget, "order", page_number); - jsonWriteStr(widget, "descr", widget_name); - jsonWriteStr(widget, "topic", prex + "/" + topic); + widget_name.replace("#", " "); + page_name.replace("#", " "); - if (name1 != "") jsonWriteStr(widget, name1, param1); - if (name2 != "") jsonWriteStr(widget, name2, param2); - if (name3 != "") jsonWriteStr(widget, name3, param3); + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "topic", prex + "/" + topic); + + if (name1 != "") jsonWriteStr(widget, name1, param1); + if (name2 != "") jsonWriteStr(widget, name2, param2); + if (name3 != "") jsonWriteStr(widget, name3, param3); #ifdef layout_in_ram - all_widgets += widget + "\r\n"; + all_widgets += widget + "\r\n"; #else - addFile("layout.txt", widget); + addFile("layout.txt", widget); #endif - widget = ""; + widget = ""; } -void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount) { - String widget; - widget = readFile(file, 1024); +void createChart (String widget_name, String page_name, String page_number, String file, String topic, String maxCount) { - if (widget == "Failed") return; - if (widget == "Large") return; + String widget; + widget = readFile(file, 1024); - widget_name.replace("#", " "); - page_name.replace("#", " "); + if (widget == "Failed") return; + if (widget == "Large") return; - jsonWriteStr(widget, "page", page_name); - jsonWriteStr(widget, "order", page_number); - //jsonWriteStr(widget, "descr", widget_name); - jsonWriteStr(widget, "series", widget_name); - jsonWriteStr(widget, "maxCount", maxCount); - jsonWriteStr(widget, "topic", prex + "/" + topic); + widget_name.replace("#", " "); + page_name.replace("#", " "); + + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + //jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "series", widget_name); + jsonWriteStr(widget, "maxCount", maxCount); + jsonWriteStr(widget, "topic", prex + "/" + topic); #ifdef layout_in_ram - all_widgets += widget + "\r\n"; + all_widgets += widget + "\r\n"; #else - addFile("layout.txt", widget); + addFile("layout.txt", widget); #endif - widget = ""; + widget = ""; } 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 == "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); -} + + 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 == "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); + +} \ No newline at end of file diff --git a/src/i2c_bus.cpp b/src/i2c_bus.cpp index abf28a9a..bbcd8b29 100644 --- a/src/i2c_bus.cpp +++ b/src/i2c_bus.cpp @@ -1,35 +1,35 @@ #include "Global.h" void do_i2c_scanning() { - if (i2c_scanning) { - i2c_scanning = false; - String tmp = i2c_scan(); - if (tmp == "error") { - tmp = i2c_scan(); - Serial.println(tmp); - jsonWriteStr(configLiveJson, "i2c", tmp); - } else { - Serial.println(tmp); - jsonWriteStr(configLiveJson, "i2c", tmp); - } + if (i2c_scanning) { + i2c_scanning = false; + String tmp = i2c_scan(); + if (tmp == "error") { + tmp = i2c_scan(); + Serial.println(tmp); + jsonWriteStr(configLiveJson, "i2c", tmp); + } else { + Serial.println(tmp); + jsonWriteStr(configLiveJson, "i2c", tmp); } + } } String i2c_scan() { - String out; - byte count = 0; - Wire.begin(); - for (byte i = 8; i < 120; i++) { - Wire.beginTransmission(i); - if (Wire.endTransmission() == 0) { - count++; - out += String(count) + ". 0x" + String(i, HEX) + "; "; - delay(1); - } + String out; + byte count = 0; + Wire.begin(); + for (byte i = 8; i < 120; i++) { + Wire.beginTransmission(i); + if (Wire.endTransmission() == 0) { + count++; + out += String(count) + ". 0x" + String(i, HEX) + "; "; + delay(1); } - if (count == 0) { - return "error"; - } else { - return out; - } -} + } + if (count == 0) { + return "error"; + } else { + return out; + } +} \ No newline at end of file diff --git a/src/iot_firmware.cpp b/src/iot_firmware.cpp index b13f4b00..84534bda 100644 --- a/src/iot_firmware.cpp +++ b/src/iot_firmware.cpp @@ -1,85 +1,84 @@ #include "Global.h" void setup() { - File_system_init(); - Serial.println("SPIFFS_init"); - - CMD_init(); - Serial.println("[V] CMD_init"); - - sensors_init(); - Serial.println("[V] sensors_init"); - - All_init(); - Serial.println("[V] All_init"); - //-------------------------------------------------------------- - WIFI_init(); - Serial.println("[V] WIFI_init"); - //-------------------------------------------------------------- - statistics_init(); - Serial.println("[V] statistics_init"); - //-------------------------------------------------------------- - initUpgrade(); - Serial.println("[V] initUpgrade"); - //-------------------------------------------------------------- - Web_server_init(); - Serial.println("[V] Web_server_init"); - //-------------------------------------------------------------- - MQTT_init(); - Serial.println("[V] MQTT_init"); - //-------------------------------------------------------------- - Time_Init(); - Serial.println("[V] Time_Init"); - //-------------------------------------------------------------- -#ifdef push_enable - Push_init(); - Serial.println("[V] Push_init"); -#endif - //-------------------------------------------------------------- + //-------------------------------------------------------------- + File_system_init(); + Serial.println("SPIFFS_init"); + //-------------------------------------------------------------- + CMD_init(); + Serial.println("[V] CMD_init"); + //-------------------------------------------------------------- + sensors_init(); + Serial.println("[V] sensors_init"); + //-------------------------------------------------------------- + All_init(); + Serial.println("[V] All_init"); + //-------------------------------------------------------------- + ROUTER_Connecting(); + Serial.println("[V] ROUTER_Connecting"); + //-------------------------------------------------------------- + uptime_init(); + Serial.println("[V] statistics_init"); + //-------------------------------------------------------------- + initUpgrade(); + Serial.println("[V] initUpgrade"); + //-------------------------------------------------------------- + Web_server_init(); + Serial.println("[V] Web_server_init"); + //-------------------------------------------------------------- + web_init(); + Serial.println("[V] web_init"); + //-------------------------------------------------------------- + Time_Init(); + Serial.println("[V] Time_Init"); + //-------------------------------------------------------------- #ifdef UDP_enable - UDP_init(); - Serial.println("[V] UDP_init"); + UDP_init(); + Serial.println("[V] UDP_init"); #endif - //-------------------------------------------------------------- + //-------------------------------------------------------------- - ts.add( - TEST, 10000, [&](void*) { - getMemoryLoad("[i] periodic check of"); - //ws.textAll(json); - }, - nullptr, true); - just_load = false; + + ts.add(TEST, 10000, [&](void*) { + getMemoryLoad("[i] periodic check of"); + //ws.textAll(json); + }, nullptr, true); + + + just_load = false; } + void loop() { + #ifdef OTA_enable - ArduinoOTA.handle(); + ArduinoOTA.handle(); #endif #ifdef WS_enable - ws.cleanupClients(); + ws.cleanupClients(); #endif - not_async_actions(); + not_async_actions(); - handleMQTT(); - handleCMD_loop(); - handleButton(); - handleScenario(); + handleMQTT(); + handleCMD_loop(); + handleButton(); + handleScenario(); #ifdef UDP_enable - handleUdp(); + handleUdp(); #endif - ts.update(); + ts.update(); } void not_async_actions() { - do_mqtt_connection(); - do_upgrade_url(); - do_upgrade(); + do_mqtt_connection(); + do_upgrade_url(); + do_upgrade(); #ifdef UDP_enable - do_udp_data_parse(); - do_mqtt_send_settings_to_udp(); + do_udp_data_parse(); + do_mqtt_send_settings_to_udp(); #endif - do_i2c_scanning(); -} + do_i2c_scanning(); +} \ No newline at end of file diff --git a/src/udp.cpp b/src/udp.cpp index 5832fe22..3f88a099 100644 --- a/src/udp.cpp +++ b/src/udp.cpp @@ -5,41 +5,7 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip); #ifdef UDP_enable 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"); addFile("dev.csv", "device id;device name;ip address"); @@ -180,4 +146,4 @@ void do_mqtt_send_settings_to_udp() { send_mqtt_to_udp(); } } -#endif +#endif \ No newline at end of file