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/relay.c.txt b/data/configs/1-relay.c.txt similarity index 100% rename from data/configs/relay.c.txt rename to data/configs/1-relay.c.txt diff --git a/data/configs/analog.s.txt b/data/configs/1-relay.s.txt similarity index 100% rename from data/configs/analog.s.txt rename to data/configs/1-relay.s.txt diff --git a/data/configs/dht22.c.txt b/data/configs/10-dht22.c.txt similarity index 100% rename from data/configs/dht22.c.txt rename to data/configs/10-dht22.c.txt diff --git a/data/configs/dallas.s.txt b/data/configs/10-dht22.s.txt similarity index 100% rename from data/configs/dallas.s.txt rename to data/configs/10-dht22.s.txt diff --git a/data/configs/analog.c.txt b/data/configs/11-analog.c.txt similarity index 100% rename from data/configs/analog.c.txt rename to data/configs/11-analog.c.txt diff --git a/data/configs/dht11.s.txt b/data/configs/11-analog.s.txt similarity index 100% rename from data/configs/dht11.s.txt rename to data/configs/11-analog.s.txt 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/dht22.s.txt b/data/configs/12-bmp280.s.txt similarity index 100% rename from data/configs/dht22.s.txt rename to data/configs/12-bmp280.s.txt 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/pwm.s.txt b/data/configs/13-bme280.s.txt similarity index 100% rename from data/configs/pwm.s.txt rename to data/configs/13-bme280.s.txt diff --git a/data/configs/dallas.c.txt b/data/configs/14-dallas.c.txt similarity index 100% rename from data/configs/dallas.c.txt rename to data/configs/14-dallas.c.txt diff --git a/data/configs/relay.s.txt b/data/configs/14-dallas.s.txt similarity index 100% rename from data/configs/relay.s.txt rename to data/configs/14-dallas.s.txt diff --git a/data/configs/termostat.c.txt b/data/configs/15-termostat.c.txt similarity index 100% rename from data/configs/termostat.c.txt rename to data/configs/15-termostat.c.txt diff --git a/data/configs/termostat.s.txt b/data/configs/15-termostat.s.txt similarity index 100% rename from data/configs/termostat.s.txt rename to data/configs/15-termostat.s.txt 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/level.s.txt b/data/configs/16-ultrasonic.s.txt similarity index 52% rename from data/configs/level.s.txt rename to data/configs/16-ultrasonic.s.txt index 12f881be..babd78ab 100644 --- a/data/configs/level.s.txt +++ b/data/configs/16-ultrasonic.s.txt @@ -1,6 +1,6 @@ -lev > digit1 +p > digit1 buttonSet 1 0 end -lev < digit2 +p < digit2 buttonSet 1 1 end \ No newline at end of file diff --git a/data/configs/moution_r.c.txt b/data/configs/17-moution.c.txt similarity index 100% rename from data/configs/moution_r.c.txt rename to data/configs/17-moution.c.txt diff --git a/data/configs/moution_r.s.txt b/data/configs/17-moution.s.txt similarity index 100% rename from data/configs/moution_r.s.txt rename to data/configs/17-moution.s.txt diff --git a/data/configs/moution_s.c.txt b/data/configs/18-moution.c.txt similarity index 100% rename from data/configs/moution_s.c.txt rename to data/configs/18-moution.c.txt diff --git a/data/configs/moution_s.s.txt b/data/configs/18-moution.s.txt similarity index 100% rename from data/configs/moution_s.s.txt rename to data/configs/18-moution.s.txt diff --git a/data/configs/stepper.c.txt b/data/configs/19-stepper.c.txt similarity index 100% rename from data/configs/stepper.c.txt rename to data/configs/19-stepper.c.txt diff --git a/data/configs/stepper.s.txt b/data/configs/19-stepper.s.txt similarity index 100% rename from data/configs/stepper.s.txt rename to data/configs/19-stepper.s.txt diff --git a/data/configs/relay_t.c.txt b/data/configs/2-relay.c.txt similarity index 100% rename from data/configs/relay_t.c.txt rename to data/configs/2-relay.c.txt diff --git a/data/configs/relay_t.s.txt b/data/configs/2-relay.s.txt similarity index 100% rename from data/configs/relay_t.s.txt rename to data/configs/2-relay.s.txt diff --git a/data/configs/servo.c.txt b/data/configs/20-servo.c.txt similarity index 100% rename from data/configs/servo.c.txt rename to data/configs/20-servo.c.txt diff --git a/data/configs/servo.s.txt b/data/configs/20-servo.s.txt similarity index 100% rename from data/configs/servo.s.txt rename to data/configs/20-servo.s.txt diff --git a/data/configs/relay_c.c.txt b/data/configs/3-relay.c.txt similarity index 100% rename from data/configs/relay_c.c.txt rename to data/configs/3-relay.c.txt diff --git a/data/configs/relay_c.s.txt b/data/configs/3-relay.s.txt similarity index 100% rename from data/configs/relay_c.s.txt rename to data/configs/3-relay.s.txt diff --git a/data/configs/relay_s.c.txt b/data/configs/4-relay.c.txt similarity index 100% rename from data/configs/relay_s.c.txt rename to data/configs/4-relay.c.txt diff --git a/data/configs/relay_s.s.txt b/data/configs/4-relay.s.txt similarity index 100% rename from data/configs/relay_s.s.txt rename to data/configs/4-relay.s.txt diff --git a/data/configs/relay_sw.c.txt b/data/configs/5-relay.c.txt similarity index 100% rename from data/configs/relay_sw.c.txt rename to data/configs/5-relay.c.txt diff --git a/data/configs/relay_sw.s.txt b/data/configs/5-relay.s.txt similarity index 100% rename from data/configs/relay_sw.s.txt rename to data/configs/5-relay.s.txt diff --git a/data/configs/relay_br.c.txt b/data/configs/6-relay.c.txt similarity index 100% rename from data/configs/relay_br.c.txt rename to data/configs/6-relay.c.txt diff --git a/data/configs/relay_br.s.txt b/data/configs/6-relay.s.txt similarity index 100% rename from data/configs/relay_br.s.txt rename to data/configs/6-relay.s.txt diff --git a/data/configs/relay_sr.c.txt b/data/configs/7-relay.c.txt similarity index 100% rename from data/configs/relay_sr.c.txt rename to data/configs/7-relay.c.txt diff --git a/data/configs/relay_sr.s.txt b/data/configs/7-relay.s.txt similarity index 100% rename from data/configs/relay_sr.s.txt rename to data/configs/7-relay.s.txt diff --git a/data/configs/pwm.c.txt b/data/configs/8-pwm.c.txt similarity index 100% rename from data/configs/pwm.c.txt rename to data/configs/8-pwm.c.txt 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/dht11.c.txt b/data/configs/9-dht11.c.txt similarity index 100% rename from data/configs/dht11.c.txt rename to data/configs/9-dht11.c.txt 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/level.c.txt b/data/configs/level.c.txt deleted file mode 100644 index 619af218..00000000 --- a/data/configs/level.c.txt +++ /dev/null @@ -1,11 +0,0 @@ -level lev 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1 -inputDigit digit1 При#скольки#выключить? Датчики 95 2 -inputDigit digit2 При#скольки#включить? Датчики 10 3 -button 1 5 Насос Датчики 0 4 -button 2 line1,line2, Автоматический#режим Датчики 1 5 -logging lev 1 100 Вода#в#баке Датчики 6 - -//125 - это расстояние от датчика до дна бака в сантиметрах -//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах -//вывод данных будет в процентах заполнения бака -//варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file diff --git a/data/configs/relay_rm.c.txt b/data/configs/relay_rm.c.txt deleted file mode 100644 index 92abc26d..00000000 --- a/data/configs/relay_rm.c.txt +++ /dev/null @@ -1,3 +0,0 @@ -switch 1 0 10 - -//физическая кнопка номер 1 подключенная к пину 0, задержка от дребезга 10 мс \ No newline at end of file diff --git a/data/configs/relay_rm.s.txt b/data/configs/relay_rm.s.txt deleted file mode 100644 index 827e1495..00000000 --- a/data/configs/relay_rm.s.txt +++ /dev/null @@ -1,3 +0,0 @@ -switch1 = 1 -mqtt 3233662-1589489 buttonChange_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/include/Cmd.h b/include/Cmd.h deleted file mode 100644 index 47577e82..00000000 --- a/include/Cmd.h +++ /dev/null @@ -1,36 +0,0 @@ - -#pragma once - -#include "Arduino.h" - -extern void CMD_init(); -extern void button(); -extern void buttonSet(); -extern void buttonChange(); -extern void pinSet(); -extern void pinChange(); -extern void handle_time_init(); -extern void pwm(); -extern void switch_(); -extern void pwmSet(); -extern void stepper(); -extern void stepperSet(); -extern void servo_(); -extern void servoSet(); -extern void serialBegin(); -extern void serialWrite(); -extern void logging(); -extern void inputDigit(); -extern void digitSet(); -extern void inputTime(); -extern void button(); -extern void timeSet(); -extern void text(); -extern void textSet(); -extern void mqttOrderSend(); -extern void httpOrderSend(); -extern void firmware(); -extern void update_firmware(); -extern void Scenario_init(); -extern void txtExecution(String file); -extern void stringExecution(String str); diff --git a/include/Consts.h b/include/Consts.h new file mode 100644 index 00000000..b5ff4192 --- /dev/null +++ b/include/Consts.h @@ -0,0 +1,46 @@ +#pragma once +//Здесь хранятся все настройки прошивки + +#define firmware_version "2.3.4" + +/* +* Firmware settings +*/ +#define mb_4_of_memory 1 +#define wifi_mqtt_reconnecting 20000 +#define blink_pin 2 +#define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных +#define statistics_update 1000 * 60 * 60 * 2 + +//#define OTA_enable +//#define MDNS_enable +//#define WS_enable +//#define layout_in_ram +#define UDP_enable + +/* +* Sensor +*/ +#define level_enable +#define analog_enable +#define dallas_enable +#define dht_enable +#define bmp_enable +#define bme_enable + +/* +* Logging +*/ +#define logging_enable + +/* +* Gears +*/ +#define stepper_enable +#define servo_enable + +/* +* Other +*/ +#define serial_enable +#define push_enable diff --git a/include/FileSystem.h b/include/FileSystem.h deleted file mode 100644 index ccec5ffb..00000000 --- a/include/FileSystem.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include -#include - -extern void File_system_init(); \ No newline at end of file diff --git a/include/Global.h b/include/Global.h new file mode 100644 index 00000000..c06a84cc --- /dev/null +++ b/include/Global.h @@ -0,0 +1,388 @@ +#pragma once + +//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК=============== +#include +#include +#include +#include +extern AsyncWebServer server; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Consts.h" +#include "GyverFilters.h" +//==============ESP8266 БИБЛИОТЕКИ=============== +#ifdef ESP8266 +#include +#include +#include +#include +ESP8266HTTPUpdateServer httpUpdater; +#include +WiFiUDP Udp; +#include +#ifdef MDNS_enable +#include +#endif +#endif +//==============ESP32 БИБЛИОТЕКИ=============== +#ifdef ESP32 +#include +#include +#include +#include +#include +#include +#include +#include +extern AsyncUDP udp; +#ifdef MDNS_enable +#include +#endif +#endif + +#ifdef OTA_enable +#include +#endif + +extern Servo myServo1; +extern Servo myServo2; + +//==============================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; + +//AsyncWebSocket ws; + +//AsyncEventSource events; + +#define NUM_BUTTONS 6 +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; + +extern 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; + +extern String configSetupJson; //все настройки +extern String configLiveJson; //все данные с датчиков (связан с mqtt) +extern String configOptionJson; //для трансфера + +extern String chipID; +extern String prex; +extern String all_widgets; +extern String scenario; +extern String order_loop; + +extern String analog_value_names_list; +extern int enter_to_analog_counter; + +extern String levelPr_value_name; +extern String ultrasonicCm_value_name; + +extern String dhtT_value_name; +extern String dhtH_value_name; + +extern String bmp280T_value_name; +extern String bmp280P_value_name; + +extern String bme280T_value_name; +extern String bme280P_value_name; +extern String bme280H_value_name; +extern String bme280A_value_name; + +extern String logging_value_names_list; +extern int enter_to_logging_counter; + +extern String current_time; + +extern int scenario_line_status[40]; + +extern int wifi_lost_error; +extern int mqtt_lost_error; + +extern String last_version; + +extern boolean upgrade_url; +extern boolean upgrade; +extern boolean mqtt_connection; +extern boolean udp_data_parse; +extern boolean mqtt_send_settings_to_udp; +extern boolean i2c_scanning; + +extern int sensors_reading_map[15]; + +///////////////////////////////////// Functions//////////////////////////////////////////////////////////////////// + +// StringUtils +extern uint8_t hexStringToUint8(String hex); +extern uint16_t hexStringToUint16(String hex); +extern String selectToMarkerLast(String str, String found); +extern String selectToMarker(String str, String found); +extern String deleteAfterDelimiter(String str, String found); +extern String deleteBeforeDelimiter(String str, String found); +extern String deleteBeforeDelimiterTo(String str, String found); +extern String selectFromMarkerToMarker(String str, String found, int number); + +// JsonUtils +extern String jsonReadStr(String &json, String name); +extern int jsonReadInt(String &json, String name); +extern String jsonWriteInt(String &json, String name, int volume); +extern String jsonWriteStr(String &json, String name, String volume); +extern String jsonWriteFloat(String &json, String name, float volume); + +// Cmd +extern void CMD_init(); +extern void button(); +extern void buttonSet(); +extern void buttonChange(); +extern void pinSet(); +extern void pinChange(); +extern void handle_time_init(); +extern void pwm(); +extern void switch_(); +extern void pwmSet(); +extern void stepper(); +extern void stepperSet(); +extern void servo_(); +extern void servoSet(); +extern void serialBegin(); +extern void serialWrite(); +extern void logging(); +extern void inputDigit(); +extern void digitSet(); +extern void inputTime(); +extern void button(); +extern void timeSet(); +extern void text(); +extern void textSet(); +extern void mqttOrderSend(); +extern void httpOrderSend(); +extern void firmwareVersion(); +extern void firmwareUpdate(); +extern void Scenario_init(); +extern void txtExecution(String file); +extern void stringExecution(String str); + +// FileSystem +extern void File_system_init(); + +// i2c_bu +extern void do_i2c_scanning(); +extern String i2c_scan(); + +// Init +extern void All_init(); +extern void statistics_init(); +extern void Scenario_init(); +extern void Device_init(); +extern void prsets_init(); +extern void up_time(); + +// Logging +extern void logging(); +extern void deleteOldDate(String file, int seted_number_of_lines, String date_to_add); +extern void clean_log_date(); +extern void choose_log_date_and_send(); + +// Main +void getMemoryLoad(String text); +extern void saveConfig(); +extern String getURL(const String &urls); + +extern String writeFile(String fileName, String strings); +extern String readFile(String fileName, size_t len); +extern String addFile(String fileName, String strings); + +extern void servo_(); +extern boolean isDigitStr(String str); +extern String jsonWriteStr(String &json, String name, String volume); +extern void led_blink(String satus); +extern int count(String str, String found); + +// Mqtt +extern void MQTT_init(); +extern boolean MQTT_Connecting(); +extern boolean sendMQTT(String end_of_topik, String data); +extern boolean sendCHART(String topik, String data); +extern void sendSTATUS(String topik, String state); +extern void sendCONTROL(String id, String topik, String state); +extern void do_mqtt_connection(); +extern void handleMQTT(); +extern String selectFromMarkerToMarker(String str, String found, int number); + +// WiFiUtils +extern void WIFI_init(); +extern void All_init(); +extern bool StartAPMode(); +extern void ROUTER_Connecting(); + +//Scenario +extern void eventGen(String event_name, String number); +extern String add_set(String param_name); + +//Sensors +// И как раз тут хорошо просто в Sensors.h это пихать - а не в один здоровенный ФАЙЛ +extern void sensors_init(); + +extern void levelPr(); +extern void ultrasonicCm(); +extern void ultrasonic_reading(); + +extern void analog(); +extern void analog_reading1(); +extern void analog_reading2(); +extern void dallas_reading(); +extern void dhtT_reading(); + +extern void dallas(); + +extern void bmp280T(); +extern void bmp280P(); +extern void bmp280T_reading(); +extern void bmp280P_reading(); + +extern void bme280T(); +extern void bme280P(); +extern void bme280H(); +extern void bme280A(); + +extern void bme280T_reading(); +extern void bme280P_reading(); +extern void bme280H_reading(); +extern void bme280A_reading(); + +extern void dhtT(); +extern void dhtH(); +extern void dhtP(); +extern void dhtC(); +extern void dhtD(); +extern void dhtH_reading(); +extern void dhtP_reading(); +extern void dhtC_reading(); +extern void dhtD_reading(); + +//Timers +extern void Timer_countdown_init(); +extern void timerStart_(); +extern void addTimer(String number, String time); +extern void timerStop_(); +extern void delTimer(String number); +extern int readTimer(int number); + +//TimeUtils +extern void Time_Init(); +extern int timeToMin(String Time); +extern String GetDataDigital(); +extern String GetDate(); +extern String GetTimeWOsec(); +extern String GetTime(); +extern String GetTimeUnix(); +extern void reconfigTime(); +extern void saveConfig(); +extern String GetTimeUnix(); +extern void time_check(); + +//Upgrade +extern void initUpgrade(); + +//widget +extern void createWidget(String widget_name, String page_name, String page_number, String file, String topic); +extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3); +extern void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik); +extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount); + +// Push +extern void Push_init(); + +// UDP +extern void UDP_init(); +extern void do_udp_data_parse(); +extern void do_mqtt_send_settings_to_udp(); +// WebServer +extern void Web_server_init(); + +//iot_firmware +extern void not_async_actions(); +extern void handleCMD_loop(); +extern void handleButton(); +extern void handleScenario(); +extern void handleUdp(); +extern void do_upgrade_url(); +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/include/Init.h b/include/Init.h deleted file mode 100644 index c593153c..00000000 --- a/include/Init.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -extern void Scenario_init(); -extern void Device_init(); -extern void prsets_init(); diff --git a/include/JsonUtils.h b/include/JsonUtils.h new file mode 100644 index 00000000..41f0cd0a --- /dev/null +++ b/include/JsonUtils.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +String jsonReadStr(String& json, String name) { + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.parseObject(json); + return root[name].as(); +} + +int jsonReadInt(String& json, String name) { + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.parseObject(json); + return root[name]; +} + +String jsonWriteStr(String& json, String name, String volume) { + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.parseObject(json); + root[name] = volume; + json = ""; + root.printTo(json); + return json; +} + +String jsonWriteInt(String& json, String name, int volume) { + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.parseObject(json); + root[name] = volume; + json = ""; + root.printTo(json); + return json; +} + +String jsonWriteFloat(String& json, String name, float volume) { + DynamicJsonBuffer jsonBuffer; + JsonObject& root = jsonBuffer.parseObject(json); + root[name] = volume; + json = ""; + root.printTo(json); + return json; +} \ No newline at end of file diff --git a/include/Logging.h b/include/Logging.h deleted file mode 100644 index 5a969e48..00000000 --- a/include/Logging.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include - -extern void logging(); -extern void deleteOldDate(String file, int seted_number_of_lines, String date_to_add); -extern void clean_log_date(); \ No newline at end of file diff --git a/include/Mqtt.h b/include/Mqtt.h deleted file mode 100644 index 21805a4e..00000000 --- a/include/Mqtt.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -extern boolean MQTT_Connecting(); -extern boolean sendMQTT(String end_of_topik, String data); -extern boolean sendCHART(String topik, String data); -extern void sendSTATUS(String topik, String state); -extern void sendCONTROL(String id, String topik, String state); - -extern void do_mqtt_connection(); \ No newline at end of file diff --git a/include/Scenario.h b/include/Scenario.h deleted file mode 100644 index 06875256..00000000 --- a/include/Scenario.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -extern void eventGen(String event_name, String number); \ No newline at end of file diff --git a/include/Sensors.h b/include/Sensors.h deleted file mode 100644 index 84a96345..00000000 --- a/include/Sensors.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void sensors_init(); \ No newline at end of file diff --git a/include/StringUtils.h b/include/StringUtils.h new file mode 100644 index 00000000..5693520e --- /dev/null +++ b/include/StringUtils.h @@ -0,0 +1,64 @@ +#pragma once + +#include "Arduino.h" + +String selectToMarkerLast(String str, String found) { + int p = str.lastIndexOf(found); + return str.substring(p + found.length()); +} + +String selectToMarker(String str, String found) { + int p = str.indexOf(found); + return str.substring(0, p); +} + +String deleteAfterDelimiter(String str, String found) { + int p = str.indexOf(found); + return str.substring(0, p); +} + +String deleteBeforeDelimiter(String str, String found) { + int p = str.indexOf(found) + found.length(); + return str.substring(p); +} + +String deleteBeforeDelimiterTo(String str, String found) { + int p = str.indexOf(found); + return str.substring(p); +} + +String deleteToMarkerLast(String str, String found) { + int p = str.lastIndexOf(found); + return str.substring(0, p); +} + +String selectToMarkerPlus(String str, String found, int plus) { + int p = str.indexOf(found); + return str.substring(0, p + plus); +} + +String selectFromMarkerToMarker(String str, String found, int number) { + if (str.indexOf(found) == -1) return "not found"; // если строки поиск нет сразу выход + str += found; // добавим для корректного поиска + uint8_t i = 0; // Индекс перебора + do { + if (i == number) return selectToMarker(str, found); // если индекс совпал с позицией законцим вернем резултат + str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя + i++; // увеличим индекс + } while (str.length() != 0); // повторим пока строка не пустая + return "not found"; // Достигли пустой строки и ничего не нашли +} + +inline uint8_t hexStringToUint8(String hex) { + uint8_t tmp = strtol(hex.c_str(), NULL, 0); + if (tmp >= 0x00 && tmp <= 0xFF) { + return tmp; + } +} + +inline uint16_t hexStringToUint16(String hex) { + uint16_t tmp = strtol(hex.c_str(), NULL, 0); + if (tmp >= 0x0000 && tmp <= 0xFFFF) { + return tmp; + } +} diff --git a/include/Strings_.h b/include/Strings_.h index 106957e0..21865168 100644 --- a/include/Strings_.h +++ b/include/Strings_.h @@ -1,5 +1,6 @@ #pragma once +//Strings // #include #include @@ -135,4 +136,4 @@ inline void char_array::printinput() { inline void char_array::changedefaultsize() { printf("Input new default input string size: "); scanf("%i", charinput); -} \ No newline at end of file +} diff --git a/include/TimeUtils.h b/include/TimeUtils.h deleted file mode 100644 index 6527d93d..00000000 --- a/include/TimeUtils.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -extern int timeToMin(String Time); -extern String GetDataDigital(); -extern String GetDate(); -extern String GetTimeWOsec(); -extern String GetTime(); -extern String GetTimeUnix(); -extern void reconfigTime(); -extern void saveConfig(); -extern String GetTimeUnix(); -extern void time_check(); diff --git a/include/Timers.h b/include/Timers.h deleted file mode 100644 index 0b74a588..00000000 --- a/include/Timers.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -extern void Timer_countdown_init(); -extern void addTimer(String number, String time); -extern int readTimer(int number); -extern void delTimer(String number); -extern void timerStop(); -extern void delTimer(String number); \ No newline at end of file diff --git a/include/Upgrade.h b/include/Upgrade.h deleted file mode 100644 index 6a399da7..00000000 --- a/include/Upgrade.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -extern void initUpgrade(); diff --git a/include/WiFiUtils.h b/include/WiFiUtils.h deleted file mode 100644 index de80d0e0..00000000 --- a/include/WiFiUtils.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -extern bool StartAPMode(); -extern void ROUTER_Connecting(); \ No newline at end of file diff --git a/include/Widgets.h b/include/Widgets.h deleted file mode 100644 index fdb7e103..00000000 --- a/include/Widgets.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -extern void createWidget(String widget_name, String page_name, String page_number, String file, String topic); -extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3); -extern void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik); -extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount); diff --git a/include/i2c_bus.h b/include/i2c_bus.h deleted file mode 100644 index 68440aae..00000000 --- a/include/i2c_bus.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include - -extern void do_i2c_scanning(); - -extern String i2c_scan(); \ No newline at end of file diff --git a/include/main.h b/include/main.h deleted file mode 100644 index 27d7c0f7..00000000 --- a/include/main.h +++ /dev/null @@ -1,31 +0,0 @@ - -#pragma once - -#include - -void getMemoryLoad(String text); - -extern String jsonReadStr(String& json, String name); -extern int jsonReadInt(String& json, String name); -extern String jsonWriteInt(String& json, String name, int volume); -extern String jsonWriteStr(String& json, String name, String volume); -extern void saveConfig(); -extern String jsonWriteFloat(String& json, String name, float volume); - -extern String getURL(String urls); - -extern String writeFile(String fileName, String strings); -extern String readFile(String fileName, size_t len); -extern String addFile(String fileName, String strings); - -extern String selectFromMarkerToMarker(String str, String found, int number); -extern String selectToMarker(String str, String found); -extern String deleteAfterDelimiter(String str, String found); -extern String deleteBeforeDelimiter(String str, String found); -extern String deleteBeforeDelimiterTo(String str, String found); - -extern void servo_(); -extern boolean isDigitStr(String str); -extern String jsonWriteStr(String& json, String name, String volume); - -extern void led_blink(String satus); \ No newline at end of file diff --git a/include/push_pushingbox.h b/include/push_pushingbox.h index ff3f9cf9..e7b92c34 100644 --- a/include/push_pushingbox.h +++ b/include/push_pushingbox.h @@ -1,12 +1,11 @@ #pragma once -#include "main.h" -#include "set.h" +#include "Global.h" -inline void Push_init() { +void Push_init() { server.on("/pushingboxDate", HTTP_GET, [](AsyncWebServerRequest* request) { if (request->hasArg("pushingbox_id")) { - jsonWriteStr(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value()); + jsonWriteStr(configSetupJson, "pushingbox_id", request->getParam("pushingbox_id")->value()); } saveConfig(); @@ -24,7 +23,7 @@ inline void pushControl() { static String body_old; const char* logServer = "api.pushingbox.com"; - String deviceId = jsonReadStr(configSetup, "pushingbox_id"); + String deviceId = jsonReadStr(configSetupJson, "pushingbox_id"); Serial.println("- starting client"); diff --git a/include/set.h b/include/set.h deleted file mode 100644 index a6d4d9fd..00000000 --- a/include/set.h +++ /dev/null @@ -1,225 +0,0 @@ -#pragma once - -#include - -/******************************************************************* - **********************FIRMWARE SETTINGS**************************** - ******************************************************************/ -String firmware_version = "2.3.3"; -boolean mb_4_of_memory = true; -//#define OTA_enable -//#define MDNS_enable -//#define WS_enable -//#define layout_in_ram -#define UDP_enable -/*==========================SENSORS===============================*/ -//#define level_enable -//#define analog_enable -//#define dallas_enable -//#define dht_enable //подъедает оперативку сука -//#define bmp_enable -//#define bme_enable -/*=========================LOGGING================================*/ -#define logging_enable -/*==========================GEARS=================================*/ -#define stepper_enable -#define servo_enable -/*=========================OTHER==================================*/ -#define serial_enable -#define push_enable -/*================================================================*/ -#define wifi_mqtt_reconnecting 20000 -#define blink_pin 2 -#define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных -#define statistics_update 1000 * 60 * 60 * 2 -/*================================================================*/ - -//===============общие библиотеки и объекты=============================== -#include -#include -#include -#include -#include -#include - -//===============библиотеки и объекты для ESP8266======================= -#ifdef ESP8266 -#include -#include -#include -#include -ESP8266HTTPUpdateServer httpUpdater; -#include -WiFiUDP Udp; -#include -Servo myServo1; -Servo myServo2; -#ifdef MDNS_enable -#include -#endif -#endif - -//===============библиотеки и объекты для ESP32=========================== -#ifdef ESP32 -#include -#include -#include -#include -#include -#include -#include -AsyncUDP udp; -#include -Servo myServo1; -Servo myServo2; -#ifdef MDNS_enable -#include -#endif -#endif - -#ifdef OTA_enable -#include -#endif - -AsyncWebServer server(80); - -#ifdef WS_enable -AsyncWebSocket ws("/ws"); -#endif - -AsyncEventSource events("/events"); -#include -#include -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 }; -TickerScheduler ts(TEST + 1); - -#include -WiFiClient espClient; -PubSubClient client_mqtt(espClient); - -#include -StringCommand sCmd; - -#include -#define NUM_BUTTONS 6 -boolean but[NUM_BUTTONS]; -Bounce *buttons = new Bounce[NUM_BUTTONS]; - -#ifdef level_enable -#include "GyverFilters.h" //настраивается в GyverHacks.h - MEDIAN_FILTER_SIZE -GMedian medianFilter; -#endif - -#ifdef dallas_enable -#include -#include -OneWire *oneWire; -DallasTemperature sensors; -#endif - -#ifdef dht_enable -#include -DHTesp dht; -#endif - -#include - -#ifdef bmp_enable -#include -Adafruit_BMP280 bmp; // use I2C interface -Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor(); -Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor(); -#endif - -#ifdef bme_enable -#include -Adafruit_BME280 bme; // use I2C interface -Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); -Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); -Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); -#endif - -//#include -//SoftwareSerial mySerial(14, 12); - -//===============FIRMWARE VARS======================== -boolean just_load = true; -const char *hostName = "IoT Manager"; -//JSON -String configSetup = "{}"; -String configJson = "{}"; -String optionJson = "{}"; -//MQTT -String chipID = ""; -String prex; -String all_widgets = ""; -String scenario; -String order_loop; -//SENSORS -String analog_value_names_list; -int enter_to_analog_counter; - -String level_value_name; - -String dhtT_value_name; -String dhtH_value_name; - -String bmp280T_value_name; -String bmp280P_value_name; - -String bme280T_value_name; -String bme280P_value_name; -String bme280H_value_name; -String bme280A_value_name; - -int sensors_reading_map[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -//============================0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14 - -//LOGGING -String logging_value_names_list; -int enter_to_logging_counter; -//NTP and TIME -String current_time; -//SCENARIO -int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; -//ERRORS -int wifi_lost_error = 0; -int mqtt_lost_error = 0; -String last_version; -//ASYNC ACTIONS -boolean upgrade_url = false; -boolean upgrade = false; -boolean mqtt_connection = false; -boolean udp_data_parse = false; -boolean mqtt_send_settings_to_udp = false; -boolean i2c_scanning = false; -//UDP -boolean udp_busy = false; -unsigned int udp_port = 4210; -#ifdef ESP8266 -IPAddress udp_multicastIP(255, 255, 255, 255); -#endif -#ifdef ESP32 -IPAddress udp_multicastIP(239, 255, 255, 255); -#endif -String received_ip; -String received_udp_line; -int udp_period; -//i2c -String i2c_list; 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/lib/ESPrelay/.gitattributes b/lib/ESPrelay/.gitattributes deleted file mode 100644 index bdb0cabc..00000000 --- a/lib/ESPrelay/.gitattributes +++ /dev/null @@ -1,17 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/lib/ESPrelay/TheThingsMQTT.cpp b/lib/ESPrelay/TheThingsMQTT.cpp deleted file mode 100644 index 4faf78f3..00000000 --- a/lib/ESPrelay/TheThingsMQTT.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* -Copyright (c) 2016 TheThings. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Original Maker: Mateo Velez - Metavix for TheThings Inc -Modified and Maintened by: Jose Garcia - TheThings Inc - -*/ - -#include "TheThingsMQTT.h" - - -TheThings::TheThings(char* token){ - initialize(token, NULL); -} - - -TheThings::TheThings(char* token, char* clientName) { - initialize(token, clientName); -} - - -void TheThings::begin(void (*callback)(char*,uint8_t*,unsigned int)) { - this->callback = callback; - _client.setServer(_server, MQTT_PORT); - _client.setCallback(callback); -} - - -bool TheThings::add(char* variableLabel, float value) { - return add(variableLabel, value, "NULL", "NULL"); -} - - -bool TheThings::add(char* variableLabel, float value, char *context) { - return add(variableLabel, value, context, "NULL"); -} - - -bool TheThings::add(char* variableLabel, float value, char *context, char *timestamp) { - (val+currentValue)->_variableLabel = variableLabel; - (val+currentValue)->_value = value; - (val+currentValue)->_context = context; - (val+currentValue)->_timestamp = timestamp; - currentValue++; - if (currentValue > MAX_VALUES) { - Serial.println(F("You are sending more than the maximum of consecutive variables")); - currentValue = MAX_VALUES; - } - return true; -} - - -bool TheThings::connected(){ - return _client.connected(); -} - - -char* TheThings::getMac(){ - // Obtains the MAC of the device - Serial.println("entra"); - byte mac[6]; - WiFi.macAddress(mac); - char macAddr[18]; - sprintf(macAddr, "%2X%2X%2X%2X%2X%2X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return macAddr; -} - - -void TheThings::initialize(char* token, char* clientName){ - _server = SERVER; - _token = token; - currentValue = 0; - val = (Value *)malloc(MAX_VALUES*sizeof(Value)); - if(clientName!=NULL){ - _clientName = clientName; - } -} - - -bool TheThings::loop() { - if (!_client.connected()) { - reconnect(); - } - return _client.loop(); -} - - -void TheThings::reconnect() { - while (!_client.connected()) { - Serial.print("Attempting MQTT connection..."); - if (_client.connect(_clientName, _token, NULL)) { - Serial.println("connected"); - break; - } else { - Serial.print("failed, rc="); - Serial.print(_client.state()); - Serial.println(" try again in 3 seconds"); - delay(3000); - } - } -} - - -void TheThings::setDebug(bool debug){ - _debug = debug; -} - - -void TheThings:: setBroker(char* broker){ - if (_debug){ - Serial.println("Broker set for Business Account"); - } - _server = broker; -} - - -bool TheThings::subscribe() { - char topic[150]; - sprintf(topic, "%s%s", FIRST_PART_TOPIC, _token); - if (!_client.connected()) { - reconnect(); - } - if (_debug){ - Serial.println("Subscribed to: "); - Serial.println(topic); - } - return _client.subscribe(topic); -} - - -bool TheThings::publish() { - - char topic[150]; - char payload[500]; - String str; - sprintf(topic, "%s%s", FIRST_PART_TOPIC, _token); - sprintf(payload, "["); - for (int i = 0; i <= currentValue; ) { - str = String((val+i)->_value, 1); - sprintf(payload,"%s{\"key\":\"%s\",\"value\":%s",payload,(val+i)->_variableLabel, str.c_str()); - if ((val+i)->_timestamp != "NULL") { - sprintf(payload, "%s, \"timestamp\": %s", payload, (val+i)->_timestamp); - } - if ((val+i)->_context != "NULL") { - sprintf(payload, "%s, \"context\": {%s}", payload, (val+i)->_context); - } - i++; - if (i >= currentValue) { - sprintf(payload, "%s}]", payload); - break; - } else { - sprintf(payload, "%s},", payload); - } - } - if (_debug){ - Serial.println("publishing to TOPIC: "); - Serial.println(topic); - Serial.print("JSON dict: "); - Serial.println(payload); - } - currentValue = 0; - return _client.publish(topic, payload, 512); -} - - -bool TheThings::wifiConnection(char* ssid, char* pass) { - WiFi.begin(ssid, pass); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(F("WiFi connected")); - Serial.println(F("IP address: ")); - Serial.println(WiFi.localIP()); - if(_clientName==NULL){ - _clientName = getMac(); - } -} - -bool TheThings::wifiConnection2() { - WiFiManager wifiManager; - wifiManager.setTimeout(180); - - //if(!wifiManager.autoConnect("AutoConnectAP")) { - if(!wifiManager.autoConnect()) { - Serial.println("failed to connect and hit timeout"); - delay(3000); - ESP.reset(); - delay(5000); - } -} - -int TheThings::state() { - return _client.state(); -} - diff --git a/lib/ESPrelay/TheThingsMQTT.h b/lib/ESPrelay/TheThingsMQTT.h deleted file mode 100644 index c176003d..00000000 --- a/lib/ESPrelay/TheThingsMQTT.h +++ /dev/null @@ -1,58 +0,0 @@ - -#ifndef TheThingsMQTT_H -#define TheThingsMQTT_H -//#include -#include -#include - -#define MQTT_PORT 1883 -#define SERVER "mqtt.thethings.io" -#define MAX_VALUES 5 -#define FIRST_PART_TOPIC "v2/things/" - -#define META_DEBUG Serial - -typedef struct Value { - char* _variableLabel; - float _value; - char* _context; - char* _timestamp; -} Value; - -class TheThings { - private: - void (*callback)(char*, uint8_t*, unsigned int); - char* getMac(); - void initialize(char* token, char* clientName); - WiFiClient espClient; - PubSubClient _client = PubSubClient(espClient); - WiFiManager wifiManager; - char* _clientName = NULL; - bool _debug = false; - uint8_t currentValue; - char* _password; - char* _server; - char* _ssid; - char* _token; - Value* val; - - public: - TheThings(char* token); - TheThings(char* token, char* clientName); - bool add(char* variableLabel, float value); - bool add(char* variableLabel, float value, char* context); - bool add(char* variableLabel, float value, char* context, char* timestamp); - void begin(void (*callback)(char*, uint8_t*, unsigned int)); - bool connected(); - bool loop(); - bool subscribe(); - bool publish(); - void setBroker(char* broker); - void reconnect(); - void setDebug(bool debug); - bool wifiConnection(char* ssid, char* pass); - bool wifiConnection2(); - int state(); -}; - -#endif diff --git a/lib/ESPrelay/TickerScheduler.h b/lib/ESPrelay/TickerScheduler.h deleted file mode 100644 index 71acb3b0..00000000 --- a/lib/ESPrelay/TickerScheduler.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include -#include - -class Ticker { - typedef void (*ticker_callback_t)(bool *); - - private: - bool is_attached = false; - uint32_t period = 0; - uint32_t last_tick = 0; - ticker_callback_t callback; - bool *callback_argument; - - public: - void Tick() { - if (is_attached && millis() - last_tick >= period) { - callback(callback_argument); - last_tick = millis(); - } - } - - void detach() { - this->is_attached = true; - } - - template - void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) { - this->period = milliseconds; - this->callback = callback; - this->callback_argument = arg; - this->is_attached = true; - } -}; - -#ifdef ARDUINO_ARCH_ESP8266 -#include - -#include -#endif - -void tickerFlagHandle(volatile bool *flag); - -#ifdef _GLIBCXX_FUNCTIONAL -typedef std::function tscallback_t; -#else -typedef void (*tscallback_t)(void *); -#endif - -struct TickerSchedulerItem { - Ticker t; - volatile bool flag = false; - tscallback_t cb; - void *cb_arg; - uint32_t period; - volatile bool is_used = false; -}; - -class TickerScheduler { - private: - uint8_t size; - TickerSchedulerItem *items = NULL; - - void handleTicker(tscallback_t, void *, volatile bool *flag); - static void handleTickerFlag(volatile bool *flag); - - public: - TickerScheduler(uint8_t size); - ~TickerScheduler(); - - bool add(uint8_t i, uint32_t period, tscallback_t, void *, boolean shouldFireNow = false); - bool remove(uint8_t i); - bool enable(uint8_t i); - bool disable(uint8_t i); - void enableAll(); - void disableAll(); - void update(); -}; diff --git a/lib/ESPrelay/subscribe_and_publish.ino b/lib/ESPrelay/subscribe_and_publish.ino deleted file mode 100644 index 3148ccd4..00000000 --- a/lib/ESPrelay/subscribe_and_publish.ino +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************** - * Include Libraries - ****************************************/ -#include "TheThingsMQTT.h" -#include "TickerScheduler.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -/**************************************** - * Define Constants - ****************************************/ -#define TOKEN "" // Your TheThings TOKEN -#define WIFINAME "" //Your SSID -#define WIFIPASS "" // Your Wifi Pass - -TheThings client(TOKEN); - -#define DHTPIN 14 // Pin which is cosnnected to the DHT sensor. -// Uncomment the type of sensor in use: -//#define DHTTYPE DHT11 // DHT 11 -#define DHTTYPE DHT22 // DHT 22 (AM2302) -//#define DHTTYPE DHT21 // DHT 21 (AM2301) - -DHT_Unified dht(DHTPIN, DHTTYPE); - -uint32_t delayMS; -#define TRIGGER_PIN 0 -#define FRECUENCY 2000 -char *AP="TEST_BQ"; -String prefix="rel"; -const char WiFiAPPSK[] = "prueba"; - -WiFiManager wifiManager; - -#define RELAY1 12 -#define RELAY2 13 - -#define MEASUREMENT_TIME 30000 // Time in milisecons - -float Temperature,Humidity; -TickerScheduler ts(1); - -/**************************************** - * Auxiliar Functions - ****************************************/ - -//void configWiFi(){ -// wifiManager.resetSettings(); -// if(!wifiManager.autoConnect(AP,WiFiAPPSK)) { -// Serial.println("Reconfiguration called"); -// delay(3000); -// //reset and try again, or maybe put it to deep sleep -// ESP.reset(); -// delay(15000); -// } -//} - -void callback(char* topic, byte* payload, unsigned int length) { - Serial.print("Message arrived"); - // handle message arrived - String text = ""; - for (int i = 0; i < length; i++) - text.concat((char)payload[i]); - Serial.println(text); - text.replace(" ", ""); - text.toUpperCase(); - if (text.indexOf("\"KEY\":\"REL1\"") >= 0) { - if (text.indexOf("\"VALUE\":\"ON\"") >= 0) digitalWrite(RELAY1,HIGH); - else if (text.indexOf("\"VALUE\":\"OFF\"") >= 0) digitalWrite(RELAY1,LOW); - } - else if (text.indexOf("\"KEY\":\"REL2\"") >= 0) { - if (text.indexOf("\"VALUE\":\"ON\"") >= 0) digitalWrite(RELAY2,HIGH); - else if (text.indexOf("\"VALUE\":\"OFF\"") >= 0) digitalWrite(RELAY2,LOW); - } -} - -float temperatureMeasurement(sensors_event_t event, DHT_Unified dht){ - // Get temperature event and print its value. - dht.temperature().getEvent(&event); - if (isnan(event.temperature)) { - Serial.println("Error reading temperature!"); - } - else { - Serial.print("Temperature: "); - Serial.print(event.temperature); - Serial.println(" *C"); - return event.temperature; - } -} - -float humidityMeasurement(sensors_event_t event, DHT_Unified dht){ - // Get humidity event and print its value. - dht.humidity().getEvent(&event); - if (isnan(event.relative_humidity)) { - Serial.println("Error reading humidity!"); - } - else { - Serial.print("Humidity: "); - Serial.print(event.relative_humidity); - Serial.println("%"); - return event.relative_humidity; - } -} - -void measureAndSend(){ - sensors_event_t event; - Temperature=temperatureMeasurement(event,dht); - Humidity=humidityMeasurement(event,dht); - client.add("Temperature", Temperature); - client.add("Humidity", Humidity); - client.publish(); -} - -/**************************************** - * Main Functions - ****************************************/ - - -void setup() { - // put your setup code here, to run once: - Serial.begin(115200); - delay(100); - pinMode(RELAY1,OUTPUT); - pinMode(RELAY2,OUTPUT); - - dht.begin(); - sensor_t sensor; - - - -// pinMode(TRIGGER_PIN, INPUT); -// attachInterrupt(digitalPinToInterrupt(TRIGGER_PIN), configWiFi, RISING); -// -// //sets timeout until configuration portal gets turned off -// //useful to make it all retry or go to sleep -// //in seconds -// wifiManager.setTimeout(280); -// -// //fetches ssid and pass and tries to connect -// //if it does not connect it starts an access point with the specified name -// //here "AutoConnectAP" -// //and goes into a blocking loop awaiting configuration -// if(!wifiManager.autoConnect(AP,WiFiAPPSK)) { -// Serial.println("failed to connect and hit timeout"); -// delay(3000); -// //reset and try again, or maybe put it to deep sleep -// //ESP.reset(); -// delay(FRECUENCY); -// } -// //if you get here you have connected to the WiFi -// Serial.println("connected...yeey :)"); - - client.wifiConnection(WIFINAME, WIFIPASS); - - //client.wifiConnection2(); - client.begin(callback); - client.subscribe(); //Insert the dataSource and Variable's Labels - - ts.add(0, MEASUREMENT_TIME, [&](void*) { measureAndSend(); }, nullptr, false); - ts.enableAll(); - - } - -void loop() { - // put your main code here, to run repeatedly: - ts.update(); - - if(!client.connected()){ - client.reconnect(); - client.subscribe(); //Insert the dataSource and Variable's Labels - } - client.loop(); - -} diff --git a/lib/GyverFilters/examples/GFilterRA/GFilterRA.ino b/lib/GyverFilters/examples/GFilterRA/GFilterRA.ino new file mode 100644 index 00000000..c6db1517 --- /dev/null +++ b/lib/GyverFilters/examples/GFilterRA/GFilterRA.ino @@ -0,0 +1,16 @@ +#include "GyverFilters.h" +GFilterRA analog0; // фильтр назовём analog0 + +void setup() { + Serial.begin(9600); + + // установка коэффициента фильтрации (0.0... 1.0). Чем меньше, тем плавнее фильтр + analog0.setCoef(0.01); + + // установка шага фильтрации (мс). Чем меньше, тем резче фильтр + analog0.setStep(10); +} + +void loop() { + Serial.println(analog0.filteredTime(analogRead(0))); +} diff --git a/lib/GyverFilters/examples/GLinear_arrays/GLinear_arrays.ino b/lib/GyverFilters/examples/GLinear_arrays/GLinear_arrays.ino new file mode 100644 index 00000000..6c407ec4 --- /dev/null +++ b/lib/GyverFilters/examples/GLinear_arrays/GLinear_arrays.ino @@ -0,0 +1,32 @@ +/* + Пример линейной аппроксимации методом наименьших квадратов + Два массива: по оси Х и по оси У + Линейная аппроксимация повозоляет получить уравнение прямой, + равноудалённой от точек на плоскости ХУ. Удобно для расчёта + роста изменяющейся шумящей величины. Уравнение вида у = A*x + B + В папке с данным примером есть скриншот из excel, + иллюстрирующий работу аппроксимации с такими же исходными +*/ + +// два массива с данными (одинаковой размероности и размера) +int x_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +int y_array[] = {1, 5, 2, 8, 3, 9, 10, 5, 15, 12}; + +#include +GLinear test; // указываем тип данных в <> + +void setup() { + Serial.begin(9600); + + // передаём массивы и размер одного из них + test.compute((int*)x_array, (int*)y_array, sizeof(x_array)); + + // Уравнение вида у = A*x + B + Serial.println(test.getA()); // получить коэффициент А + Serial.println(test.getB()); // получить коэффициент В + Serial.println(test.getDelta()); // получить изменение (аппроксимированное) +} + +void loop() { + +} \ No newline at end of file diff --git a/lib/GyverFilters/examples/GLinear_arrays/excel.jpg b/lib/GyverFilters/examples/GLinear_arrays/excel.jpg new file mode 100644 index 00000000..9cd71117 Binary files /dev/null and b/lib/GyverFilters/examples/GLinear_arrays/excel.jpg differ diff --git a/lib/GyverFilters/examples/GLinear_running/GLinear_running.ino b/lib/GyverFilters/examples/GLinear_running/GLinear_running.ino new file mode 100644 index 00000000..575c50dc --- /dev/null +++ b/lib/GyverFilters/examples/GLinear_running/GLinear_running.ino @@ -0,0 +1,34 @@ +/* + Пример линейной аппроксимации методом наименьших квадратов + Два массива: по оси Х и по оси У + Наполнение массивов осуществляется динамически: сдвигом и записью в крайнюю ячейку, + то есть аппроксимация по последним ARRAY_SIZE изменениям!! +*/ +#define ARRAY_SIZE 10 // размер пространства для аппроксимации + +// два массива с данными (одинаковой размероности и размера) +int x_array[ARRAY_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // ось x от 1 до 10, допустим СЕКУНД +int y_array[ARRAY_SIZE]; // значения по оси У будем брать с датчика + +#include +GLinear test; // указываем тип данных в <> + +void setup() { + Serial.begin(9600); +} + +void loop() { + for (byte i = 0; i < ARRAY_SIZE - 1; i++) { // счётчик от 0 до ARRAY_SIZE + y_array[i] = y_array[i + 1]; // сдвинуть массив давлений КРОМЕ ПОСЛЕДНЕЙ ЯЧЕЙКИ на шаг назад + } + // последний элемент массива теперь - новое значение (просто с аналог. датчика) + y_array[ARRAY_SIZE - 1] = analogRead(0); + + // передаём массивы и размер одного из них + test.compute((int*)x_array, (int*)y_array, sizeof(x_array)); + + // по нашим исходным данным это будет производная, т.е. "изменение единиц в секунду" + Serial.println(test.getDelta()); // получить изменение (аппроксимированное) + + delay(1000); // секундная задержка +} diff --git a/lib/GyverFilters/examples/alphabeta_example/alphabeta_example.ino b/lib/GyverFilters/examples/alphabeta_example/alphabeta_example.ino new file mode 100644 index 00000000..8f43b77a --- /dev/null +++ b/lib/GyverFilters/examples/alphabeta_example/alphabeta_example.ino @@ -0,0 +1,24 @@ +/* + Пример альфа-бета фильтра +*/ + +#include "GyverFilters.h" + +// параметры: период дискретизации (измерений), process variation, noise variation +GABfilter testFilter(0.08, 40, 1); + +void setup() { + Serial.begin(9600); +} + +void loop() { + delay(80); + int value = analogRead(0); + value += random(2) * random(-1, 2) * random(10, 70); + Serial.print("$"); + Serial.print(value); + Serial.print(" "); + value = testFilter.filtered((int)value); + Serial.print(value); + Serial.println(";"); +} diff --git a/lib/GyverFilters/examples/filters_comparsion/filters_comparsion.ino b/lib/GyverFilters/examples/filters_comparsion/filters_comparsion.ino new file mode 100644 index 00000000..b981993a --- /dev/null +++ b/lib/GyverFilters/examples/filters_comparsion/filters_comparsion.ino @@ -0,0 +1,30 @@ +/* + Сравнение калмана и бегущего среднего +*/ +#include "GyverFilters.h" + +// параметры: разброс измерения, разброс оценки, скорость изменения значений +// разброс измерения: шум измерений +// разброс оценки: подстраивается сам, можно поставить таким же как разброс измерения +// скорость изменения значений: 0.001-1, варьировать самому + +GKalman kalman(90, 90, 0.5); +GFilterRA average(0.5, 80); + +void setup() { + Serial.begin(9600); +} + +void loop() { + int value = analogRead(0); + value += random(2) * random(-1, 2) * random(50, 100); + Serial.print("$"); + Serial.print(value); + Serial.print(" "); + + Serial.print((int)kalman.filtered(value)); + Serial.print(" "); + Serial.print((int)average.filtered(value)); + Serial.println(";"); + delay(80); +} diff --git a/lib/GyverFilters/examples/kalman_example/kalman_example.ino b/lib/GyverFilters/examples/kalman_example/kalman_example.ino new file mode 100644 index 00000000..802307af --- /dev/null +++ b/lib/GyverFilters/examples/kalman_example/kalman_example.ino @@ -0,0 +1,31 @@ +/* + Пример простого одномерного фильтра +*/ + +#include "GyverFilters.h" + +// параметры: разброс измерения, разброс оценки, скорость изменения значений +// разброс измерения: шум измерений +// разброс оценки: подстраивается сам, можно поставить таким же как разброс измерения +// скорость изменения значений: 0.001-1, варьировать самому + +GKalman testFilter(40, 40, 0.5); + +// также может быть объявлен как (разброс измерения, скорость изменения значений) +// GKalman testFilter(40, 0.5); + +void setup() { + Serial.begin(9600); +} + +void loop() { + delay(80); + int value = analogRead(0); + value += random(2) * random(-1, 2) * random(10, 70); + Serial.print("$"); + Serial.print(value); + Serial.print(" "); + value = testFilter.filtered((int)value); + Serial.print(value); + Serial.println(";"); +} diff --git a/lib/GyverFilters/examples/median3_example/median3_example.ino b/lib/GyverFilters/examples/median3_example/median3_example.ino new file mode 100644 index 00000000..c99176bc --- /dev/null +++ b/lib/GyverFilters/examples/median3_example/median3_example.ino @@ -0,0 +1,21 @@ +/* + Пример использования быстрого медианного фильтра 3 порядка +*/ + +#include "GyverFilters.h" +GMedian3 testFilter; // указываем тип данных в <> + +void setup() { + Serial.begin(9600); +} + +void loop() { + int value = analogRead(0); + // добавляем шум "выбросы" + value += random(2) * random(2) * random(-1, 2) * random(50, 250); + Serial.print(value); + Serial.print(','); + value = testFilter.filtered(value); + Serial.println(value); + delay(80); +} diff --git a/lib/GyverFilters/examples/median_example/median_example.ino b/lib/GyverFilters/examples/median_example/median_example.ino new file mode 100644 index 00000000..c3fb0067 --- /dev/null +++ b/lib/GyverFilters/examples/median_example/median_example.ino @@ -0,0 +1,23 @@ +/* + Пример использования медианного фильтра. +*/ + +#include "GyverFilters.h" + +// указываем размер окна и тип данных в <> +GMedian<10, int> testFilter; + +void setup() { + Serial.begin(9600); +} + +void loop() { + delay(80); + int value = analogRead(0); + // добавляем шум "выбросы" + value += random(2) * random(2) * random(-1, 2) * random(50, 250); + Serial.print(value); + Serial.print(','); + value = testFilter.filtered(value); + Serial.println(value); +} \ No newline at end of file diff --git a/lib/GyverFilters/keywords.txt b/lib/GyverFilters/keywords.txt new file mode 100644 index 00000000..57f38dbc --- /dev/null +++ b/lib/GyverFilters/keywords.txt @@ -0,0 +1,28 @@ +####################################### +# Syntax Coloring Map For GyverFilters +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +GyverFilters KEYWORD1 +GFilterRA KEYWORD1 +GMedian3 KEYWORD1 +GMedian KEYWORD1 +GABfilter KEYWORD1 +GKalman KEYWORD1 +GLinear KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +setCoef KEYWORD2 +setStep KEYWORD2 +filteredTime KEYWORD2 +filtered KEYWORD2 +setParameters KEYWORD2 +getA KEYWORD2 +getB KEYWORD2 +getDelta KEYWORD2 \ No newline at end of file diff --git a/lib/GyverFilters/library.properties b/lib/GyverFilters/library.properties new file mode 100644 index 00000000..7c211d3d --- /dev/null +++ b/lib/GyverFilters/library.properties @@ -0,0 +1,9 @@ +name=GyverFilters +version=2.0 +author=AlexGyver +maintainer=AlexGyver +sentence=Library with few filters for data. +paragraph=Includes median, running average, AB, simplified Kalman and linear approximation filtering algorithms. +category=Data Processing +url=https://github.com/AlexGyver/GyverLibs +architectures=* \ No newline at end of file diff --git a/lib/GyverFilters/src/GyverFilters.h b/lib/GyverFilters/src/GyverFilters.h new file mode 100644 index 00000000..e03e4bf5 --- /dev/null +++ b/lib/GyverFilters/src/GyverFilters.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +/* + GyverFilters - библиотека с некоторыми удобными фильтрами: + - GFilterRA - компактная альтернатива фильтра экспоненциальное бегущее среднее (Running Average) + - GMedian3 - быстрый медианный фильтр 3-го порядка (отсекает выбросы) + - GMedian - медианный фильтр N-го порядка. Порядок настраивается в GyverFilters.h - MEDIAN_FILTER_SIZE + - GABfilter - альфа-бета фильтр (разновидность Калмана для одномерного случая) + - GKalman - упрощённый Калман для одномерного случая (на мой взгляд лучший из фильтров) + - GLinear - линейная аппроксимация методом наименьших квадратов для двух массивов + + Версии + - 1.6 от 12.11.2019 + - 1.7: исправлен GLinear + - 1.8: небольшие улучшения + - 2.0: + - Улучшен и исправлен median и median3 + - Улучшен linear + - Смотрите примеры! Использование этих фильтров чуть изменилось +*/ \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/alfaBeta.h b/lib/GyverFilters/src/filters/alfaBeta.h new file mode 100644 index 00000000..51b09726 --- /dev/null +++ b/lib/GyverFilters/src/filters/alfaBeta.h @@ -0,0 +1,37 @@ +#pragma once +#include + +// альфа-бета фильтр +class GABfilter { +public: + // период дискретизации (измерений), process variation, noise variation + GABfilter(float delta, float sigma_process, float sigma_noise) {setParameters(delta, sigma_process, sigma_noise);} + + // период дискретизации (измерений), process variation, noise variation + void setParameters(float delta, float sigma_process, float sigma_noise) { + dt = delta; + float lambda = (float)sigma_process * dt * dt / sigma_noise; + float r = (4 + lambda - (float)sqrt(8 * lambda + lambda * lambda)) / 4; + a = (float)1 - r * r; + b = (float)2 * (2 - a) - 4 * (float)sqrt(1 - a); + } + + // возвращает фильтрованное значение + float filtered(float value) { + xm = value; + xk = xk_1 + ((float) vk_1 * dt ); + vk = vk_1; + rk = xm - xk; + xk += (float)a * rk; + vk += (float)( b * rk ) / dt; + xk_1 = xk; + vk_1 = vk; + return xk_1; + } + +private: + float dt; + float xk_1, vk_1, a, b; + float xk, vk, rk; + float xm; +}; \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/kalman.h b/lib/GyverFilters/src/filters/kalman.h new file mode 100644 index 00000000..10458090 --- /dev/null +++ b/lib/GyverFilters/src/filters/kalman.h @@ -0,0 +1,38 @@ +#pragma once +#include + +// упрощённый Калман для одномерного случая +class GKalman { +public: + // разброс измерения, разброс оценки, скорость изменения значений + GKalman(float mea_e, float est_e, float q) { setParameters(mea_e, est_e, q); } + + // разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки) + GKalman(float mea_e, float q) {GKalman::setParameters(mea_e, mea_e, q);} + + // разброс измерения, разброс оценки, скорость изменения значений + void setParameters(float mea_e, float est_e, float q) { + _err_measure = mea_e; + _err_estimate = est_e; + _q = q; + } + + // разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки) + void setParameters(float mea_e, float q) {setParameters(mea_e, mea_e, q);} + + // возвращает фильтрованное значение + float filtered(float value) { + float _kalman_gain, _current_estimate; + _kalman_gain = _err_estimate / (_err_estimate + _err_measure); + _current_estimate = _last_estimate + _kalman_gain * (value - _last_estimate); + _err_estimate = (1.0 - _kalman_gain)*_err_estimate + fabs(_last_estimate-_current_estimate)*_q; + _last_estimate=_current_estimate; + return _current_estimate; + } + +private: + float _err_measure = 0.0; + float _err_estimate = 0.0; + float _q = 0.0; + float _last_estimate = 0.0; +}; \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/linear.h b/lib/GyverFilters/src/filters/linear.h new file mode 100644 index 00000000..65a134f3 --- /dev/null +++ b/lib/GyverFilters/src/filters/linear.h @@ -0,0 +1,30 @@ +#pragma once +#include + +// линейная аппроксимация методом наименьших квадратов +template < typename TYPE > +class GLinear { +public: + GLinear(){}; + void compute(TYPE *x_array, TYPE *y_array, int arrSize) { // аппроксимировать + int32_t sumX = 0, sumY = 0, sumX2 = 0, sumXY = 0; + arrSize /= sizeof(int); + for (int i = 0; i < arrSize; i++) { // для всех элементов массива + sumX += x_array[i]; + sumY += (long)y_array[i]; + sumX2 += x_array[i] * x_array[i]; + sumXY += (long)y_array[i] * x_array[i]; + } + a = (long)arrSize * sumXY; // расчёт коэффициента наклона приямой + a = a - (long)sumX * sumY; + a = (float)a / (arrSize * sumX2 - sumX * sumX); + b = (float)(sumY - (float)a * sumX) / arrSize; + delta = a * arrSize; // расчёт изменения + } + float getA() {return a;} // получить коэффициент А + float getB() {return b;} // получить коэффициент В + float getDelta() {return delta;} // получить аппроксимированное изменение + +private: + float a, b, delta; +}; \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/median.h b/lib/GyverFilters/src/filters/median.h new file mode 100644 index 00000000..f7580806 --- /dev/null +++ b/lib/GyverFilters/src/filters/median.h @@ -0,0 +1,35 @@ +#pragma once + +// медианный фильтр N-го порядка +template < int SIZE, typename TYPE > +class GMedian { +public: + TYPE filtered(TYPE newVal) { + buffer[_count] = newVal; + if ((_count < _numRead - 1) && (buffer[_count] > buffer[_count + 1])) { + for (int i = _count; i < _numRead - 1; i++) { + if (buffer[i] > buffer[i + 1]) { + float buff = buffer[i]; + buffer[i] = buffer[i + 1]; + buffer[i + 1] = buff; + } + } + } else { + if ((_count > 0) and (buffer[_count - 1] > buffer[_count])) { + for (int i = _count; i > 0; i--) { + if (buffer[i] < buffer[i - 1]) { + float buff = buffer[i]; + buffer[i] = buffer[i - 1]; + buffer[i - 1] = buff; + } + } + } + } + if (++_count >= _numRead) _count = 0; + return buffer[(int)_numRead / 2]; + } +private: + TYPE buffer[SIZE]; + byte _count = 0; + byte _numRead = SIZE; +}; \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/median3.h b/lib/GyverFilters/src/filters/median3.h new file mode 100644 index 00000000..8b99cc1e --- /dev/null +++ b/lib/GyverFilters/src/filters/median3.h @@ -0,0 +1,30 @@ +#pragma once + +// быстрый медианный фильтр 3-го порядка +template < typename TYPE > +class GMedian3 { +public: + TYPE filtered(TYPE value) { // возвращает фильтрованное значение + buffer[_counter] = value; + if (++_counter > 2) _counter = 0; + + TYPE middle; + + if ((buffer[0] <= buffer[1]) && (buffer[0] <= buffer[2])) { + middle = (buffer[1] <= buffer[2]) ? buffer[1] : buffer[2]; + } + else { + if ((buffer[1] <= buffer[0]) && (buffer[1] <= buffer[2])) { + middle = (buffer[0] <= buffer[2]) ? buffer[0] : buffer[2]; + } + else { + middle = (buffer[0] <= buffer[1]) ? buffer[0] : buffer[1]; + } + } + return middle; + } + +private: + TYPE buffer[3]; + uint8_t _counter = 0; +}; \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/runningAverage.cpp b/lib/GyverFilters/src/filters/runningAverage.cpp new file mode 100644 index 00000000..9a1b2b03 --- /dev/null +++ b/lib/GyverFilters/src/filters/runningAverage.cpp @@ -0,0 +1,43 @@ +#include + +GFilterRA::GFilterRA() {} + +GFilterRA::GFilterRA(float coef, uint16_t interval) { + _coef = coef; + _filterInterval = interval; +} + +GFilterRA::GFilterRA(float coef) { + _coef = coef; +} + +void GFilterRA::setCoef(float coef) { + _coef = coef; +} +void GFilterRA::setStep(uint16_t interval) { + _filterInterval = interval; +} + +float GFilterRA::filteredTime(int16_t value) { + if (millis() - _filterTimer >= _filterInterval) { + _filterTimer = millis(); + return GFilterRA::filtered(value); + } +} + +float GFilterRA::filteredTime(float value) { + if (millis() - _filterTimer >= _filterInterval) { + _filterTimer = millis(); + return GFilterRA::filtered(value); + } +} + +float GFilterRA::filtered(int16_t value) { + _lastValue += (float)(value - _lastValue) * _coef; + return _lastValue; +} + +float GFilterRA::filtered(float value) { + _lastValue += (float)(value - _lastValue) * _coef; + return _lastValue; +} \ No newline at end of file diff --git a/lib/GyverFilters/src/filters/runningAverage.h b/lib/GyverFilters/src/filters/runningAverage.h new file mode 100644 index 00000000..7910a0fe --- /dev/null +++ b/lib/GyverFilters/src/filters/runningAverage.h @@ -0,0 +1,24 @@ +#pragma once +#include + +// экспоненциальное бегущее среднее +class GFilterRA +{ +public: + GFilterRA(); // инициализация фильтра + GFilterRA(float coef); // расширенная инициализация фильтра (коэффициент) + GFilterRA(float coef, uint16_t interval); // расширенная инициализация фильтра (коэффициент, шаг фильтрации) + void setCoef(float coef); // настройка коэффициента фильтрации (0.00 - 1.00). Чем меньше, тем плавнее + void setStep(uint16_t interval); // установка шага фильтрации (мс). Чем меньше, тем резче фильтр + + float filteredTime(int16_t value); // возвращает фильтрованное значение с опорой на встроенный таймер + float filtered(int16_t value); // возвращает фильтрованное значение + + float filteredTime(float value); // возвращает фильтрованное значение с опорой на встроенный таймер + float filtered(float value); // возвращает фильтрованное значение + +private: + float _coef = 0.0, _lastValue = 0.0; + uint32_t _filterTimer = 0; + uint16_t _filterInterval = 0; +}; \ No newline at end of file diff --git a/lib/TickerScheduler/README.md b/lib/TickerScheduler/README.md new file mode 100644 index 00000000..33f0182e --- /dev/null +++ b/lib/TickerScheduler/README.md @@ -0,0 +1,81 @@ +# TickerScheduler +Simple scheduler for ESP8266 Arduino based on Ticker + +### Initialization + +`TickerScheduler(uint size);` + +| Param | Description | +| --- | --- | +| size | Amount of task Tickers to initialize | + +**Example**: + +`TickerScheduler ts(5)` + + +### Add task + +`boolean add(uint i, uint32_t period, tscallback_t f, boolean shouldFireNow = false); ` + +| Param | Description | +| --- | --- | +| i | Task ID | +| period | Task execution period in ms | +| f | Task callback | +| shouldFireNow| `true` if you want to execute task right after first scheduler update or wait next scheduled start | + +**Returns**: + +`true` - task added sucessfully + +`false` - task was not added + +**Example**: + +`ts.add(0, 3000, sendData)` + +### Execute scheduler in `loop()` + +`ts.update()` + +### Remove task + +`boolean remove(uint i)` + +**Returns**: + +`true` - task removed sucessfully + +`false` - task was not removed + +| Param | Description | +| --- | --- | +| i | Task ID | + +### Enable/Disable task + +`boolean enable(uint i)` + +`boolean disable(uint i)` + +**Returns**: + +`true` - task enabled/disabled sucessfully + +`false` - task was not enabled/disabled + +| Param | Description | +| --- | --- | +| i | Task ID | + +### Enable / disable all tasks + +`void enableAll()` + +`void disableAll()` + +### TODO + +* Task callback parameters support +* ... diff --git a/lib/ESPrelay/TickerScheduler.cpp b/lib/TickerScheduler/TickerScheduler.cpp similarity index 91% rename from lib/ESPrelay/TickerScheduler.cpp rename to lib/TickerScheduler/TickerScheduler.cpp index b3badc25..af47ffa1 100644 --- a/lib/ESPrelay/TickerScheduler.cpp +++ b/lib/TickerScheduler/TickerScheduler.cpp @@ -19,13 +19,13 @@ TickerScheduler::~TickerScheduler() this->size = 0; } -void TickerScheduler::handleTickerFlag(volatile bool * flag) +void TickerScheduler::handleTickerFlag(bool * flag) { if (!*flag) *flag = true; } -void TickerScheduler::handleTicker(tscallback_t f, void * arg, volatile bool * flag) +void TickerScheduler::handleTicker(tscallback_t f, void * arg, bool * flag) { if (*flag) { @@ -81,7 +81,7 @@ bool TickerScheduler::enable(uint8_t i) if (i >= this->size || !this->items[i].is_used) return false; - volatile bool * flag = &this->items[i].flag; + bool * flag = &this->items[i].flag; this->items[i].t.attach_ms(this->items[i].period, TickerScheduler::handleTickerFlag, flag); return true; diff --git a/lib/TickerScheduler/TickerScheduler.h b/lib/TickerScheduler/TickerScheduler.h new file mode 100644 index 00000000..98ae1f05 --- /dev/null +++ b/lib/TickerScheduler/TickerScheduler.h @@ -0,0 +1,91 @@ +#ifndef TICKERSCHEDULER_H +#define TICKERSCHEDULER_H + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#endif +#include + + +#ifdef ARDUINO_ARCH_AVR +class Ticker +{ + typedef void(*ticker_callback_t)(bool*); + +private: + bool is_attached = false; + uint32_t period = 0; + uint32_t last_tick = 0; + ticker_callback_t callback; + bool *callback_argument; +public: + void Tick() + { + if (is_attached && millis() - last_tick >= period) + { + callback(callback_argument); + last_tick = millis(); + } + } + + void detach() + { + this->is_attached = true; + } + + template void attach_ms(uint32_t milliseconds, void(*callback)(TArg), TArg arg) + { + this->period = milliseconds; + this->callback = callback; + this->callback_argument = arg; + this->is_attached = true; + } +}; +#endif + +//#ifdef ARDUINO_ARCH_ESP8266 +#include +#include +//#endif + +void tickerFlagHandle(volatile bool * flag); + +#ifdef _GLIBCXX_FUNCTIONAL +typedef std::function tscallback_t; +#else +typedef void(*tscallback_t)(void*); +#endif + +struct TickerSchedulerItem +{ + Ticker t; + bool flag = false; + tscallback_t cb; + void * cb_arg; + uint32_t period; + volatile bool is_used = false; +}; + +class TickerScheduler +{ +private: + uint8_t size; + TickerSchedulerItem *items = NULL; + + void handleTicker(tscallback_t, void *, bool * flag); + static void handleTickerFlag(bool * flag); + +public: + TickerScheduler(uint8_t size); + ~TickerScheduler(); + + bool add(uint8_t i, uint32_t period, tscallback_t, void *, boolean shouldFireNow = false); + bool remove(uint8_t i); + bool enable(uint8_t i); + bool disable(uint8_t i); + void enableAll(); + void disableAll(); + void update(); +}; + +#endif diff --git a/lib/TickerScheduler/example/blink/blink/blink.ino b/lib/TickerScheduler/example/blink/blink/blink.ino new file mode 100644 index 00000000..49afc470 --- /dev/null +++ b/lib/TickerScheduler/example/blink/blink/blink.ino @@ -0,0 +1,29 @@ +#include + +#define LED1 4 +#define LED2 5 + +TickerScheduler ts(2); + +void blink1() { + digitalWrite(LED1, !digitalRead(LED1)); +} + +void blink2() { + digitalWrite(LED2, !digitalRead(LED2)); +} + +void setup() { + pinMode(LED1, OUTPUT); + digitalWrite(LED1, LOW); + + pinMode(LED2, OUTPUT); + digitalWrite(LED2, LOW); + + ts.add(0, 1000, [&](void *) { blink1(); }, nullptr, true); + ts.add(1, 3000, [&](void *) { blink2(); }, nullptr, true); +} + +void loop() { + ts.update(); +} diff --git a/partitions_custom.csv b/partitions_custom.csv new file mode 100644 index 00000000..86202b53 --- /dev/null +++ b/partitions_custom.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +ota_0, app, ota_0, 0x10000, 0x1A0000 +ota_1, app, ota_1, , 0x1A0000 +otadata, data, ota, 0x350000, 0x2000 +nvs, data, nvs, , 0x6000 +data, data, spiffs, , 0xA8000 \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index edffafe0..df62c63c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,11 +17,17 @@ lib_deps= ESP32Servo Bounce2 PubSubClient - iothubclientlonghaultests_bld ESP8266-StringCommand - + DallasTemperature + DHT sensor library for ESPx + Adafruit BMP280 Library + Adafruit BME280 Library + +board_build.partitions = partitions_custom.csv + [env:esp32dev] platform = espressif32 board = esp32dev framework = arduino +monitor_speed = 115200 diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 8708d58f..13bee85e 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -1,397 +1,412 @@ -#include "Cmd.h" +#include "Global.h" -#include "Scenario.h" -#include "TimeUtils.h" -#include "Widgets.h" -#include "main.h" #include "push_pushingbox.h" -#include "set.h" void CMD_init() { - sCmd.addCommand("button", button); - sCmd.addCommand("buttonSet", buttonSet); - sCmd.addCommand("buttonChange", buttonChange); - 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("level", level); + 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("update", update_firmware); - sCmd.addCommand("firmware", firmware); + 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(optionJson, "button_param" + button_number, button_param); - jsonWriteStr(configJson, "button" + button_number, start_state); + 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(); - if (isDigitStr(button_param)) { - pinMode(button_param.toInt(), OUTPUT); - digitalWrite(button_param.toInt(), start_state.toInt()); + 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(configSetup, "scenario", start_state); - Scenario_init(); - saveConfig(); - } - - if (button_param.indexOf("line") != -1) { - String str = button_param; - while (str.length() != 0) { - if (str == "") return; - String tmp = selectToMarker(str, ","); //line1, - String number = deleteBeforeDelimiter(tmp, "e"); //1, - number.replace(",", ""); - Serial.println(number); - int number_int = number.toInt(); - scenario_line_status[number_int] = start_state.toInt(); - str = deleteBeforeDelimiter(str, ","); - } - } - 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(optionJson, "button_param" + button_number); - 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(configSetup, "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(configJson, "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(configJson, "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(configJson, "button" + button_number, current_state); - sendSTATUS("button" + button_number, current_state); + 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()); + 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())); + String pin_number = sCmd.next(); + pinMode(pin_number.toInt(), OUTPUT); + digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt())); } - +//================================================================================================================== +//==========================================Модуль управления ШИМ=================================================== 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(); - uint8_t pwm_pin_int = pwm_pin.toInt(); - jsonWriteStr(optionJson, "pwm_pin" + pwm_number, pwm_pin); - pinMode(pwm_pin_int, INPUT); - analogWrite(pwm_pin_int, start_state.toInt()); - jsonWriteStr(configJson, "pwm" + pwm_number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number); + //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 pwmSet() { - String pwm_number = sCmd.next(); - String pwm_state = sCmd.next(); - int pwm_state_int = pwm_state.toInt(); - int pin = jsonReadInt(optionJson, "pwm_pin" + pwm_number); - analogWrite(pin, pwm_state_int); + String pwm_number = sCmd.next(); + String pwm_state = sCmd.next(); + int pwm_state_int = pwm_state.toInt(); - eventGen("pwm", pwm_number); + int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number); + analogWrite(pin, pwm_state_int); - jsonWriteStr(configJson, "pwm" + pwm_number, pwm_state); - sendSTATUS("pwm" + pwm_number, pwm_state); + eventGen ("pwm", pwm_number); + + 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(configJson, "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(configJson, "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()) { + + eventGen ("switch", String(switch_number)); + + jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0"); + } + } + 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(configJson, "digit" + number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number); + 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(configJson, "digit" + number, value); - sendSTATUS("digit" + number, value); + 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(configJson, "time" + number, start_state); - createWidget(widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number); + 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(configJson, "time" + number, value); - sendSTATUS("time" + number, value); + 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(configJson, "time", tmp); - tmp.replace(":", "-"); - jsonWriteStr(configJson, "timenow", tmp); - eventGen("timenow", ""); - }, - nullptr, true); + 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); + 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; - } + String number = sCmd.next(); + String text = sCmd.next(); + text.replace("_", " "); - jsonWriteStr(configJson, "text" + number, text); - sendSTATUS("text" + number, text); + 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(); + String stepper_number = sCmd.next(); + String pin_step = sCmd.next(); + String pin_dir = sCmd.next(); - jsonWriteStr(optionJson, "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(optionJson, "steps" + stepper_number, steps); - String stepper_speed = sCmd.next(); - String pin_step = selectToMarker(jsonReadStr(optionJson, "stepper" + stepper_number), " "); - String pin_dir = deleteBeforeDelimiter(jsonReadStr(optionJson, "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(optionJson, "steps1") * 2); - static int count; - count++; - String pin_step = selectToMarker(jsonReadStr(optionJson, "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(optionJson, "steps2") * 2); - static int count; - count++; - String pin_step = selectToMarker(jsonReadStr(optionJson, "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); - } + 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 //==================================================================================================================================================== @@ -399,176 +414,190 @@ void stepperSet() { #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(); + 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(optionJson, "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(optionJson, "s_min_val" + servo_number, min_value); - jsonWriteStr(optionJson, "s_max_val" + servo_number, max_value); - jsonWriteStr(optionJson, "s_min_deg" + servo_number, min_deg); - jsonWriteStr(optionJson, "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(configJson, "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(); + String servo_number = sCmd.next(); + String servo_state = sCmd.next(); + int servo_state_int = servo_state.toInt(); - // TODO Unused - //int pin = jsonReadInt(optionJson, "servo_pin" + servo_number); + //int pin = jsonReadInt(configOptionJson, "servo_pin" + servo_number); - servo_state_int = map(servo_state_int, - jsonReadInt(optionJson, "s_min_val" + servo_number), - jsonReadInt(optionJson, "s_max_val" + servo_number), - jsonReadInt(optionJson, "s_min_deg" + servo_number), - jsonReadInt(optionJson, "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(configJson, "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()); + //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); + //String text = sCmd.next(); + //mySerial.println(text); } #endif //==================================================================================================================================================== //=================================================Глобальные команды удаленного управления=========================================================== void mqttOrderSend() { - String id = sCmd.next(); - String order = sCmd.next(); - String all_line = jsonReadStr(configSetup, "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); + 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); + + String ip = sCmd.next(); + String order = sCmd.next(); + order.replace("_", "%20"); + String url = "http://" + ip + "/cmd?command=" + order; + getURL(url); } -void update_firmware() { - upgrade = true; +void firmwareUpdate() { + upgrade = true; } -void firmware() { - String widget_name = sCmd.next(); - String page_name = sCmd.next(); - String page_number = sCmd.next(); - jsonWriteStr(configJson, "firm1", firmware_version); - choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firm1"); +void firmwareVersion() { + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String page_number = sCmd.next(); + jsonWriteStr(configLiveJson, "firmver", firmware_version); + choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firmver"); } //============================================================================================================================== //============================выполнение команд (в лупе) по очереди из строки 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, ","); //осекаем выполненную команду - } + + 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"; - 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"; - 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 2f2a8f61..85aaac54 100644 --- a/src/FileSystem.cpp +++ b/src/FileSystem.cpp @@ -1,40 +1,40 @@ - -#include -#include - -#include "main.h" -#include "set.h" +#include "Global.h" void File_system_init() { - Serial.begin(115200); - //Serial.setDebugOutput(true); - Serial.println("--------------started----------------"); - //-------------------------------------------------------------- - SPIFFS.begin(); - configSetup = readFile("config.json", 4096); - configSetup.replace(" ", ""); - configSetup.replace("\r\n", ""); - Serial.println(configSetup); - jsonWriteStr(configJson, "name", jsonReadStr(configSetup, "name")); - jsonWriteStr(configJson, "lang", jsonReadStr(configSetup, "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(configSetup, "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(configSetup, "chipID", chipID); - Serial.setDebugOutput(0); + chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId()); + jsonWriteStr(configSetupJson, "chipID", chipID); + Serial.setDebugOutput(0); #endif - jsonWriteStr(configSetup, "firmware_version", firmware_version); + jsonWriteStr(configSetupJson, "firmware_version", firmware_version); - prex = jsonReadStr(configSetup, "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 new file mode 100644 index 00000000..0df8a01a --- /dev/null +++ b/src/Global.cpp @@ -0,0 +1,130 @@ +#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; + +AsyncWebServer server(80); + +//AsyncWebSocket ws("/ws"); + +//AsyncEventSource events("/events"); + +boolean but[NUM_BUTTONS]; +Bounce *buttons = new Bounce[NUM_BUTTONS]; + +GMedian<10, int> medianFilter; + +OneWire *oneWire; +DallasTemperature sensors; + +DHTesp dht; + +Servo myServo1; +Servo myServo2; + +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 //////////////////////////////////////////////////////////////////// + +boolean just_load = true; +const char *hostName = "IoT Manager"; + +// Json +String configSetupJson = "{}"; +String configLiveJson = "{}"; +String configOptionJson = "{}"; + +// Mqtt +String chipID = ""; +String prex; +String all_widgets = ""; +String scenario; +String order_loop; + +// Sensors +String analog_value_names_list; +int enter_to_analog_counter; + +String levelPr_value_name; +String ultrasonicCm_value_name; + +String dhtT_value_name; +String dhtH_value_name; + +String bmp280T_value_name; +String bmp280P_value_name; + +String bme280T_value_name; +String bme280P_value_name; +String bme280H_value_name; +String bme280A_value_name; + +int sensors_reading_map[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Logging +String logging_value_names_list; +int enter_to_logging_counter; + +// Ntp and time +String current_time; + +// Scenario +int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + +// Errors +int wifi_lost_error = 0; +int mqtt_lost_error = 0; + +String last_version; + +// Async actions +boolean upgrade_url = false; +boolean upgrade = false; +boolean mqtt_connection = false; +boolean udp_data_parse = false; +boolean mqtt_send_settings_to_udp = false; +boolean i2c_scanning = false; + +//Buttons +//boolean but[6]; + +// Udp +boolean udp_busy = false; +unsigned int udp_port = 4210; +#ifdef ESP8266 +IPAddress udp_multicastIP(255, 255, 255, 255); +#endif +#ifdef ESP32 +IPAddress udp_multicastIP(239, 255, 255, 255); +AsyncUDP udp; +#endif +String received_ip; +String received_udp_line; +int udp_period; + +// i2c +String i2c_list; diff --git a/src/Init.cpp b/src/Init.cpp index 7d507425..84db15e1 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -1,252 +1,103 @@ -#include "Init.h" - -#include "Logging.h" -#include "Scenario.h" -#include "Timers.h" -#include "Widgets.h" -#include "main.h" -#include "set.h" +#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(configSetup, "scenario", value); - saveConfig(); - Scenario_init(); - request->send(200, "text/text", "OK"); - } - if (value == "1") { //вкл сценариев - jsonWriteStr(configSetup, "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; - level_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(configSetup, "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(configJson, "uptime", String(ss) + " sec"); - } - if (mm != 0) { - out = "[i] uptime = " + String(mm) + " min"; - jsonWriteStr(configJson, "uptime", String(mm) + " min"); - } - if (hh != 0) { - out = "[i] uptime = " + String(hh) + " hours"; - jsonWriteStr(configJson, "uptime", String(hh) + " hours"); - } - if (dd != 0) { - out = "[i] uptime = " + String(dd) + " days"; - jsonWriteStr(configJson, "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(); - //Serial.println(ESP.getResetReason()); + urls += ESP.getResetReason(); + //Serial.println(ESP.getResetReason()); #endif #ifdef ESP32 - urls += "Power on"; + urls += "Power on"; #endif - urls += "&"; - //----------------------------------------------------------------- - urls += "ver: " + firmware_version; - //----------------------------------------------------------------- - String stat = getURL(urls); - //Serial.println(stat); - } -} - -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 b23028ce..cfb6f00d 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -1,149 +1,130 @@ -#include "Logging.h" +#include "Global.h" -#include "Mqtt.h" -#include "TimeUtils.h" -#include "Widgets.h" -#include "main.h" -#include "set.h" +void sendLogData(String file, String topic); #ifdef logging_enable //===============================================Логирование============================================================ //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(optionJson, 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(optionJson, tmp_buf_1 + "_c"), jsonReadStr(configJson, 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(optionJson, tmp_buf_2 + "_c"), jsonReadStr(configJson, 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(optionJson, tmp_buf_3 + "_c"), jsonReadStr(configJson, 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(optionJson, tmp_buf_4 + "_c"), jsonReadStr(configJson, 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(optionJson, tmp_buf_5 + "_c"), jsonReadStr(configJson, 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"); + } } /* @@ -165,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 6a947ae8..f16c0a89 100644 --- a/src/Mqtt.cpp +++ b/src/Mqtt.cpp @@ -1,98 +1,70 @@ -#include "Mqtt.h" +#include "Global.h" -#include +void callback(char* topic, byte* payload, unsigned int length); -#include "WiFi.h" -#include "main.h" -#include "set.h" +String stateMQTT(); +void sendAllData(); +void sendAllWigets(); +void sendSTATUS(String topik, String state); +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(configSetup, "mqttServer", request->getParam("mqttServer")->value()); - } - if (request->hasArg("mqttPort")) { - int port = (request->getParam("mqttPort")->value()).toInt(); - jsonWriteInt(configSetup, "mqttPort", port); - } - if (request->hasArg("mqttPrefix")) { - jsonWriteStr(configSetup, "mqttPrefix", request->getParam("mqttPrefix")->value()); - } - if (request->hasArg("mqttUser")) { - jsonWriteStr(configSetup, "mqttUser", request->getParam("mqttUser")->value()); - } - if (request->hasArg("mqttPass")) { - jsonWriteStr(configSetup, "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(configSetup, "mqttServer"); + String mqtt_server = jsonReadStr(configSetupJson, "mqttServer"); if ((mqtt_server != "")) { Serial.println("[E] Lost MQTT connection, start reconnecting"); led_blink("fast"); - client_mqtt.setServer(mqtt_server.c_str(), jsonReadInt(configSetup, "mqttPort")); + client_mqtt.setServer(mqtt_server.c_str(), jsonReadInt(configSetupJson, "mqttPort")); if (WiFi.status() == WL_CONNECTED) { if (!client_mqtt.connected()) { Serial.println("[V] Connecting to MQTT server commenced"); - if (client_mqtt.connect(chipID.c_str(), jsonReadStr(configSetup, "mqttUser").c_str(), jsonReadStr(configSetup, "mqttPass").c_str())) { + if (client_mqtt.connect(chipID.c_str(), jsonReadStr(configSetupJson, "mqttUser").c_str(), jsonReadStr(configSetupJson, "mqttPass").c_str())) { Serial.println("[VV] MQTT connected"); led_blink("off"); client_mqtt.setCallback(callback); - client_mqtt.subscribe(jsonReadStr(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи - client_mqtt.subscribe((jsonReadStr(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control - client_mqtt.subscribe((jsonReadStr(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order + 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 { @@ -107,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(configSetup, "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(configSetup, "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(configSetup, "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); + client_mqtt.publish (topik.c_str(), json_.c_str(), false); } +//======================================CONTROL================================================== void sendCONTROL(String id, String topik, String state) { - String all_line = jsonReadStr(configSetup, "mqttPrefix") + "/" + id + "/" + topik + "/control"; - client_mqtt.publish(all_line.c_str(), state.c_str(), false); + String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control"; + 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("\r\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 = configJson; //{"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) { @@ -284,69 +279,3 @@ String stateMQTT() { break; } } - -/*void scenario_devices_topiks_subscribe() { - - //SCENARIO ANALOG > 5 800324-1458415 rel1 0 - if (jsonReadStr(configSetup, "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(configSetup, "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(configSetup, "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(configSetup, "mqttPrefix") + "/" + id).c_str(), "CHECK", true)); - - } - all_text = deleteBeforeDelimiter(all_text, "\n"); - } - } - }*/ - -/* - //----------------------------------------------------------------------------------------------------------------------------------------------- - //jsonWriteStr(tmp, "status", "1"); - - String current_config = configJson; //{"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 85c023c6..37dfecb0 100644 --- a/src/Scenario.cpp +++ b/src/Scenario.cpp @@ -1,98 +1,96 @@ -#include "Scenario.h" - -#include "main.h" -#include "set.h" +#include "Global.h" void handleScenario() { - if (jsonReadStr(configSetup, "scenario") == "1") { - if ((jsonReadStr(optionJson, "scenario_status") != "")) { - int i = 0; - String str = scenario; //читаем переменную с сценариями (то что из файла на странице) - str += "\n"; - str.replace("\r\n", "\n"); - str.replace("\r", "\n"); - while (str.length() != 0) { - //----------------------------------------------------------------------------------------------------------------------- - String tmp = selectToMarker(str, "end"); //выделяем первый сценарий из файла вместе с командами - if (tmp == "") return; - i++; - if (scenario_line_status[i] == 1) { - //Serial.println(i); - String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) - String param_name = selectFromMarkerToMarker(condition, " ", 0); - String order = jsonReadStr(optionJson, "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(configJson, value); - } - if (value.indexOf("time") != -1) { - // value = add_set(value); - value = jsonReadStr(configJson, value); - } - boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады - if (sign == "=") { - if (jsonReadStr(configJson, param_name) == value) flag = true; - } - if (sign == "!=") { - if (jsonReadStr(configJson, param_name) != value) flag = true; - } - if (sign == "<") { - if (jsonReadStr(configJson, param_name).toInt() < value.toInt()) flag = true; - } - if (sign == ">") { - if (jsonReadStr(configJson, param_name).toInt() > value.toInt()) flag = true; - } - if (sign == ">=") { - if (jsonReadStr(configJson, param_name).toInt() >= value.toInt()) flag = true; - } - if (sign == "<=") { - if (jsonReadStr(configJson, 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(optionJson, "scenario_status"); //читаем файл событий - tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие - jsonWriteStr(optionJson, "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(configSetup, "scenario") == "1") { - String tmp = jsonReadStr(optionJson, "scenario_status"); //генерирование события - //Serial.println(event_name); - jsonWriteStr(optionJson, "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/Sensors.cpp b/src/Sensors.cpp index d5cc2319..8e7deaf5 100644 --- a/src/Sensors.cpp +++ b/src/Sensors.cpp @@ -1,47 +1,65 @@ -#include "Sensors.h" +#include "Global.h" +#include "StringUtils.h" -#include "set.h" +String perception(byte value); +void bmp280T_reading(); +String get_comfort_status(ComfortState cf); void sensors_init() { ts.add( - SENSORS, 1000, [&](void*) { + SENSORS, 1000, [&](void *) { static int counter; counter++; #ifdef level_enable - if (sensors_reading_map[0] == 1) level_reading(); + if (sensors_reading_map[0] == 1) + ultrasonic_reading(); #endif if (counter > 10) { counter = 0; #ifdef analog_enable - if (sensors_reading_map[1] == 1) analog_reading1(); - if (sensors_reading_map[2] == 1) analog_reading2(); + if (sensors_reading_map[1] == 1) + analog_reading1(); + if (sensors_reading_map[2] == 1) + analog_reading2(); #endif #ifdef dallas_enable - if (sensors_reading_map[3] == 1) dallas_reading(); + if (sensors_reading_map[3] == 1) + dallas_reading(); #endif #ifdef dht_enable - if (sensors_reading_map[4] == 1) dhtT_reading(); - if (sensors_reading_map[5] == 1) dhtH_reading(); - if (sensors_reading_map[6] == 1) dhtP_reading(); - if (sensors_reading_map[7] == 1) dhtC_reading(); - if (sensors_reading_map[8] == 1) dhtD_reading(); + if (sensors_reading_map[4] == 1) + dhtT_reading(); + if (sensors_reading_map[5] == 1) + dhtH_reading(); + if (sensors_reading_map[6] == 1) + dhtP_reading(); + if (sensors_reading_map[7] == 1) + dhtC_reading(); + if (sensors_reading_map[8] == 1) + dhtD_reading(); #endif #ifdef bmp_enable - if (sensors_reading_map[9] == 1) bmp280T_rading(); - if (sensors_reading_map[10] == 1) bmp280P_reading(); + if (sensors_reading_map[9] == 1) + bmp280T_reading(); + if (sensors_reading_map[10] == 1) + bmp280P_reading(); #endif #ifdef bme_enable - if (sensors_reading_map[11] == 1) bme280T_reading(); - if (sensors_reading_map[12] == 1) bme280P_reading(); - if (sensors_reading_map[13] == 1) bme280H_reading(); - if (sensors_reading_map[14] == 1) bme280A_reading(); + if (sensors_reading_map[11] == 1) + bme280T_reading(); + if (sensors_reading_map[12] == 1) + bme280P_reading(); + if (sensors_reading_map[13] == 1) + bme280H_reading(); + if (sensors_reading_map[14] == 1) + bme280A_reading(); #endif } }, @@ -51,54 +69,79 @@ void sensors_init() { //========================================================================================================================================= //=========================================Модуль измерения уровня в баке================================================================== #ifdef level_enable -//level L 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1 -void level() { - String value_name = sCmd.next(); - String trig = sCmd.next(); - String echo = sCmd.next(); - String widget_name = sCmd.next(); - String page_name = sCmd.next(); - String type = sCmd.next(); - String empty_level = sCmd.next(); - String full_level = sCmd.next(); - String page_number = sCmd.next(); - level_value_name = value_name; - jsonWriteStr(optionJson, "e_lev", empty_level); - jsonWriteStr(optionJson, "f_lev", full_level); - jsonWriteStr(optionJson, "trig", trig); - jsonWriteStr(optionJson, "echo", echo); - pinMode(trig.toInt(), OUTPUT); - pinMode(echo.toInt(), INPUT); - choose_widget_and_create(widget_name, page_name, page_number, type, value_name); - sensors_reading_map[0] = 1; +//levelPr p 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1 +void levelPr() { + String value_name = sCmd.next(); + String trig = sCmd.next(); + String echo = sCmd.next(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String type = sCmd.next(); + String empty_level = sCmd.next(); + String full_level = sCmd.next(); + String page_number = sCmd.next(); + levelPr_value_name = value_name; + jsonWriteStr(configOptionJson, "e_lev", empty_level); + jsonWriteStr(configOptionJson, "f_lev", full_level); + jsonWriteStr(configOptionJson, "trig", trig); + jsonWriteStr(configOptionJson, "echo", echo); + pinMode(trig.toInt(), OUTPUT); + pinMode(echo.toInt(), INPUT); + choose_widget_and_create(widget_name, page_name, page_number, type, value_name); + sensors_reading_map[0] = 1; +} +//ultrasonicCm cm 14 12 Дистанция,#см Датчики fill-gauge 1 +void ultrasonicCm() { + String value_name = sCmd.next(); + String trig = sCmd.next(); + String echo = sCmd.next(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String type = sCmd.next(); + String empty_level = sCmd.next(); + String full_level = sCmd.next(); + String page_number = sCmd.next(); + ultrasonicCm_value_name = value_name; + jsonWriteStr(configOptionJson, "trig", trig); + jsonWriteStr(configOptionJson, "echo", echo); + pinMode(trig.toInt(), OUTPUT); + pinMode(echo.toInt(), INPUT); + choose_widget_and_create(widget_name, page_name, page_number, type, value_name); + sensors_reading_map[0] = 1; } -void level_reading() { - long duration_; - int distance_cm; - int level; - static int counter; - int trig = jsonReadInt(optionJson, "trig"); - int echo = jsonReadInt(optionJson, "echo"); - digitalWrite(trig, LOW); - delayMicroseconds(2); - digitalWrite(trig, HIGH); - delayMicroseconds(10); - digitalWrite(trig, LOW); - duration_ = pulseIn(echo, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m - distance_cm = duration_ / 29 / 2; - distance_cm = medianFilter.filtered(distance_cm); //отсечение промахов медианным фильтром - counter++; - if (counter > tank_level_times_to_send) { - counter = 0; - level = map(distance_cm, - jsonReadInt(optionJson, "e_lev"), - jsonReadInt(optionJson, "f_lev"), 0, 100); - jsonWriteInt(configJson, level_value_name, level); - eventGen(level_value_name, ""); - sendSTATUS(level_value_name, String(level)); - Serial.println("[i] sensor '" + level_value_name + "' data: " + String(level)); - } +void ultrasonic_reading() { + long duration_; + int distance_cm; + int level; + static int counter; + int trig = jsonReadInt(configOptionJson, "trig"); + int echo = jsonReadInt(configOptionJson, "echo"); + digitalWrite(trig, LOW); + delayMicroseconds(2); + digitalWrite(trig, HIGH); + delayMicroseconds(10); + digitalWrite(trig, LOW); + duration_ = pulseIn(echo, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m + distance_cm = duration_ / 29 / 2; + distance_cm = medianFilter.filtered(distance_cm);//отсечение промахов медианным фильтром + counter++; + if (counter > tank_level_times_to_send) { + counter = 0; + level = map(distance_cm, + jsonReadInt(configOptionJson, "e_lev"), + jsonReadInt(configOptionJson, "f_lev"), 0, 100); + + jsonWriteInt(configLiveJson, levelPr_value_name, level); + eventGen (levelPr_value_name, ""); + sendSTATUS(levelPr_value_name, String(level)); + Serial.println("[i] sensor '" + levelPr_value_name + "' data: " + String(level)); + + jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm); + eventGen (ultrasonicCm_value_name, ""); + sendSTATUS(ultrasonicCm_value_name, String(distance_cm)); + Serial.println("[i] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm)); + } } #endif //========================================================================================================================================= @@ -118,10 +161,10 @@ void analog() { String page_number = sCmd.next(); analog_value_names_list += value_name + ","; enter_to_analog_counter++; - jsonWriteStr(optionJson, value_name + "_st", analog_start); - jsonWriteStr(optionJson, value_name + "_end", analog_end); - jsonWriteStr(optionJson, value_name + "_st_out", analog_start_out); - jsonWriteStr(optionJson, value_name + "_end_out", analog_end_out); + jsonWriteStr(configOptionJson, value_name + "_st", analog_start); + jsonWriteStr(configOptionJson, value_name + "_end", analog_end); + jsonWriteStr(configOptionJson, value_name + "_st_out", analog_start_out); + jsonWriteStr(configOptionJson, value_name + "_end_out", analog_end_out); choose_widget_and_create(widget_name, page_name, page_number, type, value_name); if (enter_to_analog_counter == 1) { sensors_reading_map[1] = 1; @@ -140,11 +183,11 @@ void analog_reading1() { int analog_in = analogRead(A0); #endif int analog = map(analog_in, - jsonReadInt(optionJson, value_name + "_st"), - jsonReadInt(optionJson, value_name + "_end"), - jsonReadInt(optionJson, value_name + "_st_out"), - jsonReadInt(optionJson, value_name + "_end_out")); - jsonWriteInt(configJson, value_name, analog); + jsonReadInt(configOptionJson, value_name + "_st"), + jsonReadInt(configOptionJson, value_name + "_end"), + jsonReadInt(configOptionJson, value_name + "_st_out"), + jsonReadInt(configOptionJson, value_name + "_end_out")); + jsonWriteInt(configLiveJson, value_name, analog); eventGen(value_name, ""); sendSTATUS(value_name, String(analog)); Serial.println("[i] sensor '" + value_name + "' data: " + String(analog)); @@ -159,11 +202,11 @@ void analog_reading2() { int analog_in = analogRead(A0); #endif int analog = map(analog_in, - jsonReadInt(optionJson, value_name + "_st"), - jsonReadInt(optionJson, value_name + "_end"), - jsonReadInt(optionJson, value_name + "_st_out"), - jsonReadInt(optionJson, value_name + "_end_out")); - jsonWriteInt(configJson, value_name, analog); + jsonReadInt(configOptionJson, value_name + "_st"), + jsonReadInt(configOptionJson, value_name + "_end"), + jsonReadInt(configOptionJson, value_name + "_st_out"), + jsonReadInt(configOptionJson, value_name + "_end_out")); + jsonWriteInt(configLiveJson, value_name, analog); eventGen(value_name, ""); sendSTATUS(value_name, String(analog)); Serial.println("[i] sensor '" + value_name + "' data: " + String(analog)); @@ -173,9 +216,9 @@ void analog_reading2() { //=========================================Модуль температурного сенсора ds18b20=========================================================== #ifdef dallas_enable void dallas() { - String value_name = sCmd.next(); + //String value_name = sCmd.next(); String pin = sCmd.next(); - String address = sCmd.next(); + //String address = sCmd.next(); String widget_name = sCmd.next(); String page_name = sCmd.next(); String type = sCmd.next(); @@ -192,7 +235,7 @@ void dallas_reading() { float temp = 0; sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); - jsonWriteStr(configJson, "dallas", String(temp)); + jsonWriteStr(configLiveJson, "dallas", String(temp)); eventGen("dallas", ""); sendSTATUS("dallas", String(temp)); Serial.println("[i] sensor 'dallas' send date " + String(temp)); @@ -232,7 +275,7 @@ void dhtT_reading() { value = dht.getTemperature(); if (String(value) != "nan") { eventGen(dhtT_value_name, ""); - jsonWriteStr(configJson, dhtT_value_name, String(value)); + jsonWriteStr(configLiveJson, dhtT_value_name, String(value)); sendSTATUS(dhtT_value_name, String(value)); Serial.println("[i] sensor '" + dhtT_value_name + "' data: " + String(value)); } @@ -270,7 +313,7 @@ void dhtH_reading() { value = dht.getHumidity(); if (String(value) != "nan") { eventGen(dhtH_value_name, ""); - jsonWriteStr(configJson, dhtH_value_name, String(value)); + jsonWriteStr(configLiveJson, dhtH_value_name, String(value)); sendSTATUS(dhtH_value_name, String(value)); Serial.println("[i] sensor '" + dhtH_value_name + "' data: " + String(value)); } @@ -291,9 +334,9 @@ void dhtP_reading() { if (dht.getStatus() != 0) { sendSTATUS("dhtPerception", String(dht.getStatusString())); } else { - value = dht.computePerception(jsonReadStr(configJson, dhtT_value_name).toFloat(), jsonReadStr(configJson, dhtH_value_name).toFloat(), false); + value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); String final_line = perception(value); - jsonWriteStr(configJson, "dhtPerception", final_line); + jsonWriteStr(configLiveJson, "dhtPerception", final_line); eventGen("dhtPerception", ""); sendSTATUS("dhtPerception", final_line); if (client_mqtt.connected()) { @@ -303,14 +346,36 @@ void dhtP_reading() { } String perception(byte value) { - if (value == 0) return "Сухой воздух"; - if (value == 1) return "Комфортно"; - if (value == 2) return "Уютно"; - if (value == 3) return "Хорошо"; - if (value == 4) return "Неудобно"; - if (value == 5) return "Довольно неудобно"; - if (value == 6) return "Очень неудобно"; - if (value == 7) return "Сильно неудобно, полный звиздец"; + String res; + switch (value) { + case 0: + res = F("Сухой воздух"); + break; + case 1: + res = F("Комфортно"); + break; + case 2: + res = F("Уютно"); + break; + case 3: + res = F("Хорошо"); + break; + case 4: + res = F("Неудобно"); + break; + case 5: + res = F("Довольно неудобно"); + break; + case 6: + res = F("Очень неудобно"); + break; + case 7: + res = F("Сильно неудобно, полный звиздец"); + default: + res = F("Unknown"); + break; + } + return res; } //dhtComfort Степень#комфорта: Датчики 3 @@ -322,15 +387,14 @@ void dhtC() { sensors_reading_map[7] = 1; } -void dhtC_reading() { - float value; +void dhtC_reading() { ComfortState cf; if (dht.getStatus() != 0) { sendSTATUS("dhtComfort", String(dht.getStatusString())); } else { - value = dht.getComfortRatio(cf, jsonReadStr(configJson, dhtT_value_name).toFloat(), jsonReadStr(configJson, dhtH_value_name).toFloat(), false); + dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); String final_line = get_comfort_status(cf); - jsonWriteStr(configJson, "dhtComfort", final_line); + jsonWriteStr(configLiveJson, "dhtComfort", final_line); eventGen("dhtComfort", ""); sendSTATUS("dhtComfort", final_line); Serial.println("[i] sensor 'dhtComfort' send date " + final_line); @@ -388,8 +452,8 @@ void dhtD_reading() { if (dht.getStatus() != 0) { sendSTATUS("dhtDewpoint", String(dht.getStatusString())); } else { - value = dht.computeDewPoint(jsonReadStr(configJson, dhtT_value_name).toFloat(), jsonReadStr(configJson, dhtH_value_name).toFloat(), false); - jsonWriteInt(configJson, "dhtDewpoint", value); + value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); + jsonWriteInt(configLiveJson, "dhtDewpoint", value); eventGen("dhtDewpoint", ""); sendSTATUS("dhtDewpoint", String(value)); Serial.println("[i] sensor 'dhtDewpoint' data: " + String(value)); @@ -399,7 +463,7 @@ void dhtD_reading() { //=========================================i2c bus esp8266 scl-4 sda-5 ==================================================================== //========================================================================================================================================= //=========================================Модуль сенсоров bmp280========================================================================== -#ifdef bmp_enable + //bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1 void bmp280T() { String value_name = sCmd.next(); @@ -420,12 +484,12 @@ void bmp280T() { sensors_reading_map[9] = 1; } -void bmp280T_rading() { +void bmp280T_reading() { float value = 0; - sensors_event_t temp_event, pressure_event; + sensors_event_t temp_event; bmp_temp->getEvent(&temp_event); value = temp_event.temperature; - jsonWriteStr(configJson, bmp280T_value_name, String(value)); + jsonWriteStr(configLiveJson, bmp280T_value_name, String(value)); eventGen(bmp280T_value_name, ""); sendSTATUS(bmp280T_value_name, String(value)); Serial.println("[i] sensor '" + bmp280T_value_name + "' data: " + String(value)); @@ -453,19 +517,18 @@ void bmp280P() { void bmp280P_reading() { float value = 0; - sensors_event_t temp_event, pressure_event; + sensors_event_t pressure_event; bmp_pressure->getEvent(&pressure_event); value = pressure_event.pressure; value = value / 1.333224; - jsonWriteStr(configJson, bmp280P_value_name, String(value)); + jsonWriteStr(configLiveJson, bmp280P_value_name, String(value)); eventGen(bmp280P_value_name, ""); sendSTATUS(bmp280P_value_name, String(value)); Serial.println("[i] sensor '" + bmp280P_value_name + "' data: " + String(value)); } -#endif + //========================================================================================================================================= //=============================================Модуль сенсоров bme280====================================================================== -#ifdef bme_enable //bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1 void bme280T() { String value_name = sCmd.next(); @@ -483,7 +546,7 @@ void bme280T() { void bme280T_reading() { float value = 0; value = bme.readTemperature(); - jsonWriteStr(configJson, bme280T_value_name, String(value)); + jsonWriteStr(configLiveJson, bme280T_value_name, String(value)); eventGen(bme280T_value_name, ""); sendSTATUS(bme280T_value_name, String(value)); Serial.println("[i] sensor '" + bme280T_value_name + "' data: " + String(value)); @@ -507,7 +570,7 @@ void bme280P_reading() { float value = 0; value = bme.readPressure(); value = value / 1.333224; - jsonWriteStr(configJson, bme280P_value_name, String(value)); + jsonWriteStr(configLiveJson, bme280P_value_name, String(value)); eventGen(bme280P_value_name, ""); sendSTATUS(bme280P_value_name, String(value)); Serial.println("[i] sensor '" + bme280P_value_name + "' data: " + String(value)); @@ -530,7 +593,7 @@ void bme280H() { void bme280H_reading() { float value = 0; value = bme.readHumidity(); - jsonWriteStr(configJson, bme280H_value_name, String(value)); + jsonWriteStr(configLiveJson, bme280H_value_name, String(value)); eventGen(bme280H_value_name, ""); sendSTATUS(bme280H_value_name, String(value)); Serial.println("[i] sensor '" + bme280H_value_name + "' data: " + String(value)); @@ -553,9 +616,8 @@ void bme280A() { void bme280A_reading() { float value = 0; value = bme.readAltitude(1013.25); - jsonWriteStr(configJson, bme280A_value_name, String(value)); + jsonWriteStr(configLiveJson, bme280A_value_name, String(value)); eventGen(bme280A_value_name, ""); sendSTATUS(bme280A_value_name, String(value)); Serial.println("[i] sensor '" + bme280A_value_name + "' data: " + String(value)); } -#endif diff --git a/src/TimeUtils.cpp b/src/TimeUtils.cpp index b64a5a3f..b16d414e 100644 --- a/src/TimeUtils.cpp +++ b/src/TimeUtils.cpp @@ -1,149 +1,133 @@ -#include "TimeUtils.h" - -#include "main.h" -#include "set.h" +#include "Global.h" void Time_Init() { - server.on("/time", HTTP_GET, [](AsyncWebServerRequest* request) { - if (request->hasArg("timezone")) { - jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value()); - } - if (request->hasArg("ntp")) { - jsonWriteStr(configSetup, "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(configSetup, "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(configSetup, "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(configSetup, "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(configSetup, "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 c2ff61b4..6cef52ba 100644 --- a/src/Timers.cpp +++ b/src/Timers.cpp @@ -1,93 +1,91 @@ -#include "Timers.h" - -#include "Scenario.h" -#include "main.h" -#include "set.h" +#include "Global.h" +//================================================================================================================ +//=========================================Таймеры================================================================= void Timer_countdown_init() { - ts.add( - TIMER_COUNTDOWN, 1000, [&](void*) { - String old_line = jsonReadStr(optionJson, "timers"); - if (old_line != "") { - //Serial.println(old_line); - int i = 0; - do { - String timer = selectFromMarkerToMarker(old_line, ",", i); - Serial.print("timer no " + String(i) + ": "); - Serial.println(timer); - if (timer == "not found" || timer == "") return; - int number = selectToMarker(timer, ":").toInt(); - int time = readTimer(number); - if (time == 0) { - delTimer(String(number)); - jsonWriteStr(configJson, "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(configJson, period_of_time); + + 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); } - 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(configJson, "timer" + number, "1"); + }, nullptr, true); } +void timerStart_() { + String number = sCmd.next(); + String period_of_time = sCmd.next(); + String type = sCmd.next(); + if (period_of_time.indexOf("digit") != -1) { + //period_of_time = add_set(period_of_time); + period_of_time = 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(optionJson, "timers"); //1:60,2:120, - String new_timer = number + ":" + time; - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить - ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) - tmp.replace(timer + ",", ""); - tmp += new_timer + ","; - } else { //если его нет - tmp += new_timer + ","; - } - jsonWriteStr(optionJson, "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); +void timerStop_() { + String number = sCmd.next(); + delTimer(number); } -void delTimer(String number) { - String tmp = jsonReadStr(optionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить - tmp.replace(timer, ""); //удаляем таймер - jsonWriteStr(optionJson, "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(optionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать - String timer; - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать - timer = deleteBeforeDelimiter(timer, ":"); - } - return timer.toInt(); -} + 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 5a815aee..39183cb4 100644 --- a/src/Upgrade.cpp +++ b/src/Upgrade.cpp @@ -1,138 +1,88 @@ -#include "Upgrade.h" - -#include "main.h" -#include "set.h" - -static const char* UPGRADE_URL PROGMEM = "http://91.204.228.124:1100/update/"; - -const String getUpgradeUrl() { - String url = FPSTR(UPGRADE_URL); -#ifdef ESP32 - url += "esp32"; -#else - url += "esp8266"; -#endif - url += "/version.txt"; - return url; -} - +#include "Global.h" void initUpgrade() { - String last_version = WiFi.status() == WL_CONNECTED ? getURL(getUpgradeUrl()) : ""; - jsonWriteStr(configSetup, "last_version", last_version); - - Serial.printf("[i] Last firmware version: %s\n", last_version); - - server.on("/check", HTTP_GET, [last_version](AsyncWebServerRequest* request) { - upgrade_url = true; - Serial.printf("[i] Last firmware version: %s\n", last_version); - 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; + if (upgrade_url) { + upgrade_url = false; #ifdef ESP32 - last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt"); - jsonWriteStr(configSetup, "last_version", last_version); + 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"); - jsonWriteStr(configSetup, "last_version", last_version); + 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 configSetup_for_update; - scenario_for_update = readFile("firmware.s.txt", 4000); - config_for_update = readFile("firmware.c.txt", 4000); - configSetup_for_update = configSetup; - 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..."); + + 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"); + 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"); + 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", 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) { - 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(); + } } /* @@ -141,95 +91,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 configSetup_for_update; - Serial.println(spiffsData); - scenario_for_update = readFile("firmware.s.txt", 2048); - config_for_update = readFile("config.all.txt", 2048); - configSetup_for_update = configSetup; - ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления - updateHTTP(spiffsData, true); - writeFile("firmware.s.txt", scenario_for_update); - writeFile("config.all.txt", config_for_update); - writeFile("config.json", configSetup_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 98a6b2b5..50f83c1c 100644 --- a/src/Web_server.cpp +++ b/src/Web_server.cpp @@ -1,231 +1,234 @@ -#include "main.h" -#include "set.h" +#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(configSetup, "web_login").c_str(), jsonReadStr(configSetup, "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(configSetup, "web_login").c_str(), jsonReadStr(configSetup, "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(configSetup, "web_login").c_str(), jsonReadStr(configSetup, "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(); - // --------------------Выдаем данные configJson //config.live.json - динамические данные - server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", configJson); - }); - // --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями - server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", optionJson); - }); - // -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных - server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "application/json", configSetup); - }); + 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 15ebc535..30c33f63 100644 --- a/src/WiFiUtils.cpp +++ b/src/WiFiUtils.cpp @@ -1,163 +1,136 @@ -#include "main.h" -#include "set.h" +#include "Global.h" -void WIFI_init() { - // --------------------Получаем ssid password со страницы - server.on("/ssid", HTTP_GET, [](AsyncWebServerRequest* request) { - if (request->hasArg("ssid")) { - jsonWriteStr(configSetup, "ssid", request->getParam("ssid")->value()); - } - if (request->hasArg("password")) { - jsonWriteStr(configSetup, "password", request->getParam("password")->value()); - } - saveConfig(); // Функция сохранения данных во Flash - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении - }); - // --------------------Получаем ssidAP passwordAP со страницы - server.on("/ssidap", HTTP_GET, [](AsyncWebServerRequest* request) { - if (request->hasArg("ssidAP")) { - jsonWriteStr(configSetup, "ssidAP", request->getParam("ssidAP")->value()); - } - if (request->hasArg("passwordAP")) { - jsonWriteStr(configSetup, "passwordAP", request->getParam("passwordAP")->value()); - } - saveConfig(); // Функция сохранения данных во Flash - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении - }); - - // --------------------Получаем логин и пароль для web со страницы - server.on("/web", HTTP_GET, [](AsyncWebServerRequest* request) { - if (request->hasArg("web_login")) { - jsonWriteStr(configSetup, "web_login", request->getParam("web_login")->value()); - } - if (request->hasArg("web_pass")) { - jsonWriteStr(configSetup, "web_pass", request->getParam("web_pass")->value()); - } - saveConfig(); // Функция сохранения данных во Flash - //Web_server_init(); - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении - }); - - server.on("/restart", HTTP_GET, [](AsyncWebServerRequest* request) { - if (request->hasArg("device")) { - if (request->getParam("device")->value() == "ok") ESP.restart(); - } - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении - }); - ROUTER_Connecting(); -} +boolean RouterFind(String ssid); void ROUTER_Connecting() { - led_blink("slow"); + + led_blink("slow"); - WiFi.mode(WIFI_STA); + WiFi.mode(WIFI_STA); - byte tries = 20; - String _ssid = jsonReadStr(configSetup, "ssid"); - String _password = jsonReadStr(configSetup, "password"); - //WiFi.persistent(false); + 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(optionJson, "pass_status", 1); - } - Serial.print("."); - delay(1000); + 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(); + if (WiFi.status() != WL_CONNECTED) + { + // Если не удалось подключиться запускаем в режиме AP + Serial.println(""); + // WiFi.disconnect(true); + StartAPMode(); - jsonWriteStr(configJson, "ip", WiFi.localIP().toString()); - led_blink("off"); - } + } + 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(); + } } bool StartAPMode() { - Serial.println("WiFi up AP"); - WiFi.disconnect(); + Serial.println("WiFi up AP"); + WiFi.disconnect(); - WiFi.mode(WIFI_AP); + WiFi.mode(WIFI_AP); - String _ssidAP = jsonReadStr(configSetup, "ssidAP"); - String _passwordAP = jsonReadStr(configSetup, "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(configJson, "ip", myIP.toString()); + 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 (jsonReadInt(optionJson, "pass_status") != 1) { - ts.add( - ROUTER_SEARCHING, 10 * 1000, [&](void*) { - Serial.println("->try find router"); - if (RouterFind(jsonReadStr(configSetup, "ssid"))) { - ts.remove(ROUTER_SEARCHING); - WiFi.scanDelete(); - ROUTER_Connecting(); - MQTT_init(); - } - }, - nullptr, true); - } - return true; + //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; } -boolean RouterFind(String ssid) { + +boolean RouterFind(String ssid) +{ + bool res = false; + int n = WiFi.scanComplete(); Serial.println("n = " + String(n)); - if (n == -2) { //Сканирование не было запущено, запускаем + if (n == -2) + { //Сканирование не было запущено, запускаем Serial.println("[WIFI][i] scanning has not been triggered, starting scanning"); - WiFi.scanNetworks(true, false); //async, show_hidden - return false; + WiFi.scanNetworks(true, false); //async, show_hidde } - if (n == -1) { //Сканирование все еще выполняется + else if (n == -1) + { //Сканирование все еще выполняется Serial.println("[WIFI][i] scanning still in progress"); - return false; } - if (n == 0) { //ни одна сеть не найдена + else if (n == 0) + { //ни одна сеть не найдена Serial.println("[WIFI][i] no any wifi sations, starting scanning"); WiFi.scanNetworks(true, false); - return false; } - if (n > 0) { - for (int i = 0; i <= n; i++) { - if (WiFi.SSID(i) == ssid) { + else if (n > 0) + { + for (int i = 0; i <= n; i++) + { + if (WiFi.SSID(i) == ssid) + { WiFi.scanDelete(); - return true; - } else { + res = true; + } + else + { Serial.print(i); Serial.print(")"); - //Serial.print(ssid); - //Serial.print("<=>"); - if (i == n) { + if (i == n) + { Serial.print(WiFi.SSID(i)); Serial.println("; "); - } else { + } + else + { Serial.print(WiFi.SSID(i)); Serial.println("; "); } } } WiFi.scanDelete(); - return false; } -} + return res; +} \ No newline at end of file diff --git a/src/Widgets.cpp b/src/Widgets.cpp index b9de8aa5..62ae8edf 100644 --- a/src/Widgets.cpp +++ b/src/Widgets.cpp @@ -1,82 +1,90 @@ -#include "Widgets.h" +#include "Global.h" -#include "main.h" -#include "set.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 e44155c8..bbcd8b29 100644 --- a/src/i2c_bus.cpp +++ b/src/i2c_bus.cpp @@ -1,38 +1,35 @@ -#include "i2c_bus.h" - -#include "main.h" -#include "set.h" +#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(configJson, "i2c", tmp); - } else { - Serial.println(tmp); - jsonWriteStr(configJson, "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 f265ebcd..84534bda 100644 --- a/src/iot_firmware.cpp +++ b/src/iot_firmware.cpp @@ -1,88 +1,84 @@ -#include "Cmd.h" -#include "FileSystem.h" -#include "Sensors.h" -#include "set.h" +#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/main.cpp b/src/main.cpp index 7b923734..a66ac527 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,114 +1,9 @@ -#include "main.h" - -#include "set.h" - -String jsonReadStr(String& json, String name) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject(json); - return root[name].as(); -} - -int jsonReadInt(String& json, String name) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject(json); - return root[name]; -} - -String jsonWriteStr(String& json, String name, String volume) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject(json); - root[name] = volume; - json = ""; - root.printTo(json); - return json; -} - -String jsonWriteInt(String& json, String name, int volume) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject(json); - root[name] = volume; - json = ""; - root.printTo(json); - return json; -} - -String jsonWriteFloat(String& json, String name, float volume) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject(json); - root[name] = volume; - json = ""; - root.printTo(json); - return json; -} - -//============================================================================================================ -//=============================================BIT AND BYTE=================================================== -uint8_t hexStringToUint8(String hex) { - uint8_t tmp = strtol(hex.c_str(), NULL, 0); - if (tmp >= 0x00 && tmp <= 0xFF) { - return tmp; - } -} - -uint16_t hexStringToUint16(String hex) { - uint16_t tmp = strtol(hex.c_str(), NULL, 0); - if (tmp >= 0x0000 && tmp <= 0xFFFF) { - return tmp; - } -} +#include "Global.h" void saveConfig() { - writeFile("config.json", configSetup); + writeFile("config.json", configSetupJson); } -// --------Выделяем строку от конца строки до маркера----------------------------------------------------------- -String selectToMarkerLast(String str, String found) { - int p = str.lastIndexOf(found); - return str.substring(p + found.length()); -} - -String selectToMarker(String str, String found) { - int p = str.indexOf(found); - return str.substring(0, p); -} - -String deleteAfterDelimiter(String str, String found) { - int p = str.indexOf(found); - return str.substring(0, p); -} - -String deleteBeforeDelimiter(String str, String found) { - int p = str.indexOf(found) + found.length(); - return str.substring(p); -} - -String deleteBeforeDelimiterTo(String str, String found) { - int p = str.indexOf(found); - return str.substring(p); -} - -// -------------------Выделяем строку от конца строки до маркера ------------------------------------------------ -String deleteToMarkerLast(String str, String found) { - int p = str.lastIndexOf(found); - return str.substring(0, p); -} -// -------------------Выделяем строку от конца строки до маркера + ---------------------------------------------- -String selectToMarkerPlus(String str, String found, int plus) { - int p = str.indexOf(found); - return str.substring(0, p + plus); -} -//--------------------Выделяем строку от маркера до маркера ----------------------------------------------------- -String selectFromMarkerToMarker(String str, String found, int number) { - if (str.indexOf(found) == -1) return "not found"; // если строки поиск нет сразу выход - str += found; // добавим для корректного поиска - uint8_t i = 0; // Индекс перебора - do { - if (i == number) return selectToMarker(str, found); // если индекс совпал с позицией законцим вернем резултат - str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя - i++; // увеличим индекс - } while (str.length() != 0); // повторим пока строка не пустая - return "not found"; // Достигли пустой строки и ничего не нашли -} //--------------------Посчитать ----------------------------------------------------------------------------------- int count(String str, String found) { if (str.indexOf(found) == -1) return 0; // если строки поиск нет сразу выход @@ -122,41 +17,29 @@ int count(String str, String found) { } boolean isDigitStr(String str) { - if (str.length() == 1) { - return Digit(str); - } - if (str.length() > 1) { - for (int i = 0; i < str.length(); i++) { - if (!Digit(String(str.charAt(i)))) return false; + for (int i = 0; i < str.length(); i++) { + if (!isDigit(str.charAt(i))) { + return false; } - return true; - } -} -boolean Digit(String str) { - if (str == "0" || str == "1" || str == "2" || str == "3" || str == "4" || str == "5" || str == "6" || str == "7" || str == "8" || str == "9") { - return true; - } else { - return false; } + return str.length(); } -String getURL(String urls) { - String answer = ""; +String getURL(const String& urls) { + String res = ""; HTTPClient http; - http.begin(urls); //HTTP + http.begin(urls); int httpCode = http.GET(); if (httpCode == HTTP_CODE_OK) { - answer = http.getString(); + res = http.getString(); } else { - answer = "error"; + res = "error"; } http.end(); - return answer; + return res; } -//=================================================================================================================== -//===========================================FILES=================================================================== -// ------------- Добавление файла ----------------------------------------------------------------------------------- -String safeDataToFile(String data, String Folder) { + +void safeDataToFile(String data, String Folder) { //String fileName = GetDate(); String fileName; fileName.toLowerCase(); @@ -166,8 +49,9 @@ String safeDataToFile(String data, String Folder) { fileName = Folder + "/" + fileName + ".txt"; // addFile(fileName, GetTime() + "/" + data); Serial.println(fileName); - jsonWriteStr(configJson, "test", fileName); + jsonWriteStr(configLiveJson, "test", fileName); } + // ------------- Чтение файла в строку ------------------------------------------------------------------------------- String readFile(String fileName, size_t len) { File configFile = SPIFFS.open("/" + fileName, "r"); @@ -229,7 +113,7 @@ String readFileString(const String& filename, const String& str_to_found) { void sendCONFIG(String topik, String widgetConfig, String key, String date) { yield(); - topik = jsonReadStr(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/status"; + topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/status"; String outer = "{\"widgetConfig\":"; String inner = "{\""; inner = inner + key; @@ -260,8 +144,7 @@ void led_blink(String satus) { #endif #endif } -//========================================================================================================================= -//=========================================ОСТАВШАЯСЯ ОПЕРАТИВНАЯ ПАМЯТЬ=================================================== + void getMemoryLoad(String text) { #ifdef ESP8266 int all_memory = 52864; @@ -272,7 +155,9 @@ void getMemoryLoad(String text) { int memory_remain = ESP.getFreeHeap(); int memory_used = all_memory - memory_remain; int memory_load = (memory_used * 100) / all_memory; - if (memory_load > 65) Serial.print("Attention!!! too match memory used!!!"); + if (memory_load > 65) { + Serial.println("Memory low!"); + } Serial.print(text + " memory used:"); Serial.print(String(memory_load) + "%; "); Serial.print("memory remain: "); diff --git a/src/udp.cpp b/src/udp.cpp index 7b5d6928..3f88a099 100644 --- a/src/udp.cpp +++ b/src/udp.cpp @@ -1,40 +1,11 @@ +#include "Global.h" + +void handleUdp_esp32(); +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(configSetup, "udponoff", value); - request->send(200, "text/text", "ok"); - } - if (value == "1") { - jsonWriteStr(configSetup, "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(configSetup, "name", request->getParam("arg")->value()); - jsonWriteStr(configJson, "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"); @@ -48,10 +19,10 @@ void UDP_init() { udp_period = random(50000, 60000); ts.add(UDP, udp_period, [&](void*) { - if (jsonReadStr(configSetup, "udponoff") == "1") { + if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (WiFi.status() == WL_CONNECTED) { if (!udp_busy) { - String line_to_send = "iotm;" + chipID + ";" + jsonReadStr(configSetup, "name"); + String line_to_send = "iotm;" + chipID + ";" + jsonReadStr(configSetupJson, "name"); #ifdef ESP8266 Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); Udp.write(line_to_send.c_str()); @@ -69,7 +40,7 @@ void UDP_init() { void handleUdp() { #ifdef ESP8266 - if (jsonReadStr(configSetup, "udponoff") == "1") { + if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (WiFi.status() == WL_CONNECTED) { int packetSize = Udp.parsePacket(); if (packetSize) { @@ -100,7 +71,7 @@ void handleUdp_esp32() { udp.onPacket([](AsyncUDPPacket packet) { received_udp_line = (char*)packet.data(); received_ip = packet.remoteIP().toString(); - if (jsonReadStr(configSetup, "udponoff") == "1") { + if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (received_udp_line.indexOf("iotm;") >= 0) { udp_data_parse = true; @@ -122,11 +93,11 @@ void do_udp_data_parse() { Serial.print(" "); Serial.println(received_udp_line); if (received_udp_line.indexOf("mqttServer") >= 0) { - jsonWriteStr(configSetup, "mqttServer", jsonReadStr(received_udp_line, "mqttServer")); - jsonWriteInt(configSetup, "mqttPort", jsonReadInt(received_udp_line, "mqttPort")); - jsonWriteStr(configSetup, "mqttPrefix", jsonReadStr(received_udp_line, "mqttPrefix")); - jsonWriteStr(configSetup, "mqttUser", jsonReadStr(received_udp_line, "mqttUser")); - jsonWriteStr(configSetup, "mqttPass", jsonReadStr(received_udp_line, "mqttPass")); + jsonWriteStr(configSetupJson, "mqttServer", jsonReadStr(received_udp_line, "mqttServer")); + jsonWriteInt(configSetupJson, "mqttPort", jsonReadInt(received_udp_line, "mqttPort")); + jsonWriteStr(configSetupJson, "mqttPrefix", jsonReadStr(received_udp_line, "mqttPrefix")); + jsonWriteStr(configSetupJson, "mqttUser", jsonReadStr(received_udp_line, "mqttUser")); + jsonWriteStr(configSetupJson, "mqttPass", jsonReadStr(received_udp_line, "mqttPass")); saveConfig(); Serial.println("[V] new mqtt setting received from udp and saved"); mqtt_connection = true; @@ -145,15 +116,15 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip) { } void send_mqtt_to_udp() { - if (jsonReadStr(configSetup, "udponoff") == "1") { + if (jsonReadStr(configSetupJson, "udponoff") == "1") { if (WiFi.status() == WL_CONNECTED) { udp_busy = true; String mqtt_data = "{}"; - jsonWriteStr(mqtt_data, "mqttServer", jsonReadStr(configSetup, "mqttServer")); - jsonWriteInt(mqtt_data, "mqttPort", jsonReadInt(configSetup, "mqttPort")); - jsonWriteStr(mqtt_data, "mqttPrefix", jsonReadStr(configSetup, "mqttPrefix")); - jsonWriteStr(mqtt_data, "mqttUser", jsonReadStr(configSetup, "mqttUser")); - jsonWriteStr(mqtt_data, "mqttPass", jsonReadStr(configSetup, "mqttPass")); + jsonWriteStr(mqtt_data, "mqttServer", jsonReadStr(configSetupJson, "mqttServer")); + jsonWriteInt(mqtt_data, "mqttPort", jsonReadInt(configSetupJson, "mqttPort")); + jsonWriteStr(mqtt_data, "mqttPrefix", jsonReadStr(configSetupJson, "mqttPrefix")); + jsonWriteStr(mqtt_data, "mqttUser", jsonReadStr(configSetupJson, "mqttUser")); + jsonWriteStr(mqtt_data, "mqttPass", jsonReadStr(configSetupJson, "mqttPass")); Serial.println(mqtt_data); #ifdef ESP8266 Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); @@ -175,4 +146,4 @@ void do_mqtt_send_settings_to_udp() { send_mqtt_to_udp(); } } -#endif +#endif \ No newline at end of file