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": "
"
+ },
{
"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": ""
+
+ },
+ {
+ "type": "text",
+ "style": "width:100%;float:left;",
+ "title": ""
+ },
+ {
+ "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": "",
+ "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": ""
+ }
+ ]
+}
\ 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": ""
+ },
+ {
+ "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": ""
+ },
+ {
+ "type": "hr"
+ },
+ {
+ "type": "checkbox",
+ "name": "blink",
+ "title": "Включить светодиод статуса подключения",
+ "action": "/set?blink=[[blink]]",
+ "state": "{{blink}}"
+ },
+ {
+ "type": "text",
+ "title": ""
+ },
+ {
+ "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": ""
+ },
+ {
+ "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": ""
+ },
+ {
+ "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