diff --git a/Cmd.ino b/Cmd.ino index 65285039..38f0f3c0 100644 --- a/Cmd.ino +++ b/Cmd.ino @@ -46,7 +46,6 @@ void CMD_init() { handle_time_init(); - } diff --git a/Init.ino b/Init.ino index 74b8a6be..44c68d88 100644 --- a/Init.ino +++ b/Init.ino @@ -4,7 +4,6 @@ void All_init() { Device_init(); request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); - server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("status")) { jsonWriteStr(configSetup, "scenario", request->getParam("status")->value()); @@ -13,11 +12,8 @@ void All_init() { Scenario_init(); request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); - server.on("/cleanlog", HTTP_GET, [](AsyncWebServerRequest * request) { - clean_log_date(); - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); @@ -41,171 +37,101 @@ void Device_init() { ts.remove(STEPPER1); ts.remove(STEPPER2); - #ifdef layout_in_ram +#ifdef layout_in_ram all_widgets = ""; - #else +#else SPIFFS.remove("/layout.txt"); - #endif - - txtExecution("firmware.config.txt"); +#endif + + txtExecution("firmware.c.txt"); //outcoming_date(); } //-------------------------------сценарии----------------------------------------------------- void Scenario_init() { if (jsonRead(configSetup, "scenario") == "1") { - scenario = readFile("firmware.scenario.txt", 2048); + scenario = readFile("firmware.s.txt", 2048); } } void prsets_init() { - - //part 1=============================================================================== - - server.on("/relay", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - String tmp = ""; - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_timer", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_t.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_t.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_countdown", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_c.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_c.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_several", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_s.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_s.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_switch", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_sw.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_sw.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_button_remote", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_br.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_br.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/relay_switch_remote", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/relay_sr.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/relay_sr.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/pwm", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/pwm.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/pwm.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - //part 2=============================================================================== - - server.on("/dht11", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/dht11.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/dht11.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/dht22.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/dht22.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/analog", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/analog.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/analog.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/dallas", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/dallas.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/dallas.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/termostat", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/termostat.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/termostat.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/level", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/level.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/level.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/moution_relay", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/moution_r.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/moution_r.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/moution_security", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/moution_s.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/moution_s.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - server.on("/stepper", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/stepper.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/stepper.scenario.txt", 2048)); - Device_init(); - Scenario_init(); - request->redirect("/page.htm?configuration"); - }); - - //default=============================================================================== - - server.on("/default", HTTP_GET, [](AsyncWebServerRequest * request) { - writeFile("firmware.config.txt", readFile("configs/firmware.config.txt", 2048)); - writeFile("firmware.scenario.txt", readFile("configs/firmware.scenario.txt", 2048)); + 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/firmware.c.txt", 2048)); + writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048)); + } Device_init(); Scenario_init(); request->redirect("/page.htm?configuration"); diff --git a/Logging.ino b/Logging.ino index a0329b24..5c537d16 100644 --- a/Logging.ino +++ b/Logging.ino @@ -7,11 +7,16 @@ void logging() { String period_min = sCmd.next(); String maxCount = sCmd.next(); + String optimozation = sCmd.next(); + String widget_name = sCmd.next(); widget_name.replace("#", " "); String page_name = sCmd.next(); String page_number = sCmd.next(); + if (optimozation == "fast") chart_data_in_solid_array = true; + if (optimozation == "slow") chart_data_in_solid_array = false; + if (sensor_name == "analog") jsonWriteStr(optionJson, "analog_logging_count", maxCount); if (sensor_name == "level") jsonWriteStr(optionJson, "level_logging_count", maxCount); if (sensor_name == "dallas") jsonWriteStr(optionJson, "dallas_logging_count", maxCount); @@ -68,7 +73,7 @@ void logging() { //=========================================Удаление стрых данных и запись новых================================================================== 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, "\n"); + 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) { @@ -80,9 +85,9 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) { current_number_of_lines = 0; } if (current_number_of_lines > seted_number_of_lines) { - log_date = deleteBeforeDelimiter(log_date, "\n"); + log_date = deleteBeforeDelimiter(log_date, "\r\n"); if (GetTimeUnix() != "failed") { - log_date += GetTimeUnix() + " " + date_to_add + "\n"; + log_date += GetTimeUnix() + " " + date_to_add + "\r\n"; writeFile(file, log_date); } } else { @@ -95,62 +100,66 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) { //=========================================Выбор какие данные отправлять================================================================== void choose_log_date_and_send() { - if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog"); - if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel"); - if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas"); - if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT"); - if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH"); + + if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog", chart_data_in_solid_array); + if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel", chart_data_in_solid_array); + if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas", chart_data_in_solid_array); + if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT", chart_data_in_solid_array); + if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH", chart_data_in_solid_array); } //=========================================Отправка данных=================================================================================== -//прямое выкидывание данных из файла в файловой системе в mqtt, без загрузки оперативной памяти -void sendLogData(String file, String topic) { - File configFile = SPIFFS.open("/" + file, "r"); - if (!configFile) { - return; - } - configFile.seek(0, SeekSet); //поставим курсор в начало файла - while (configFile.position() != configFile.size()) { - String tmp = configFile.readStringUntil('\r\n'); - String unix_time = selectToMarker (tmp, " "); - String value = deleteBeforeDelimiter(tmp, " "); - String final_line = "{\"status\":{\"x\":" + unix_time + ",\"y1\":" + value + "}}"; - //Serial.println(final_line); - sendCHART(topic, final_line); - } - getMemoryLoad("[i] after send log date"); -} -//старый метод выкидывания данных с использованием оперативной памяти -void sendLogData2(String file, String topic) { - String log_date = readFile(file, 5000); - 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 + ","; +void sendLogData(String file, String topic, boolean type) { + if (type) { + //---------------------------------------------- + String log_date = readFile(file, 5000); + 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 = "{}"; } - 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"); + //---------------------------------------------- + } else { + //---------------------------------------------- + File configFile = SPIFFS.open("/" + file, "r"); + if (!configFile) { + return; + } + configFile.seek(0, SeekSet); //поставим курсор в начало файла + while (configFile.position() != configFile.size()) { + String tmp = configFile.readStringUntil('\r\n'); + String unix_time = selectToMarker (tmp, " "); + String value = deleteBeforeDelimiter(tmp, " "); + String final_line = "{\"status\":{\"x\":" + unix_time + ",\"y1\":" + value + "}}"; + //Serial.println(final_line); + sendCHART(topic, final_line); + } + getMemoryLoad("[i] after send log date"); } - 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"); + //---------------------------------------------- } //=========================================Очистка данных=================================================================================== void clean_log_date() { diff --git a/Sensors.ino b/Sensors.ino index a1da758c..8e50a288 100644 --- a/Sensors.ino +++ b/Sensors.ino @@ -187,7 +187,7 @@ void dhtH() { } else { counter = 0; value = dht.getHumidity(); - if (String(value) != "nan") { + if (String(value) != "nan" || value <= 100 || value >= 0) { //if (value_old != value) { eventGen ("dhtH", ""); jsonWriteStr(configJson, "dhtH", String(value)); diff --git a/Time.ino b/Time.ino index 28880429..75e23c88 100644 --- a/Time.ino +++ b/Time.ino @@ -125,3 +125,11 @@ String GetDataDigital() { return out; } + +int timeToMin(String Time) { + //"00:00:00" время в секунды + long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах + Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды + min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут + return min; +} diff --git a/Upgrade.ino b/Upgrade.ino index f8b19d1b..90094ddf 100644 --- a/Upgrade.ino +++ b/Upgrade.ino @@ -74,8 +74,8 @@ void upgrade_firmware() { String scenario_for_update; String config_for_update; String configSetup_for_update; - scenario_for_update = readFile("firmware.scenario.txt", 3072); - config_for_update = readFile("firmware.config.txt", 3072); + scenario_for_update = readFile("firmware.s.txt", 3072); + config_for_update = readFile("firmware.c.txt", 3072); configSetup_for_update = configSetup; Serial.println("Start upgrade SPIFFS, please wait..."); @@ -93,8 +93,8 @@ void upgrade_firmware() { if (ret == HTTP_UPDATE_OK) { - writeFile("firmware.scenario.txt", scenario_for_update); - writeFile("firmware.config.txt", config_for_update); + writeFile("firmware.s.txt", scenario_for_update); + writeFile("firmware.c.txt", config_for_update); writeFile("config.json", configSetup_for_update); saveConfig(); @@ -212,12 +212,12 @@ void handle_upgrade() { String config_for_update; String configSetup_for_update; Serial.println(spiffsData); - scenario_for_update = readFile("firmware.scenario.txt", 2048); + 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.scenario.txt", scenario_for_update); + writeFile("firmware.s.txt", scenario_for_update); writeFile("config.all.txt", config_for_update); writeFile("config.json", configSetup_for_update); saveConfig(); diff --git a/Web_server.ino b/Web_server.ino index f1e67126..fef0bd70 100644 --- a/Web_server.ino +++ b/Web_server.ino @@ -113,6 +113,7 @@ void Web_server_init() { 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()); @@ -120,6 +121,7 @@ void Web_server_init() { 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); diff --git a/data/config.json b/data/config.json index 531271e5..345fd0cc 100644 --- a/data/config.json +++ b/data/config.json @@ -5,12 +5,12 @@ "passwordAP": "", "ssid": "rise", "password": "hostel3333", - "timezone": 3, - "mqttServer": "m12.cloudmqtt.com", - "mqttPort": 14053, - "mqttPrefix": "/IoTmanager", - "mqttUser": "lbscvzuj", - "mqttPass": "bLxlveOgaF8F", + "timezone": 2, + "mqttServer": "mqtt.ioty.ru", + "mqttPort": 1883, + "mqttPrefix": "/rise", + "mqttUser": "test", + "mqttPass": "test", "scenario": "1", "pushingbox_id": "", "web_login": "admin", diff --git a/data/configs/analog.config.txt b/data/configs/analog.c.txt similarity index 90% rename from data/configs/analog.config.txt rename to data/configs/analog.c.txt index 37689c74..36cacea3 100644 --- a/data/configs/analog.config.txt +++ b/data/configs/analog.c.txt @@ -1,4 +1,5 @@ analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1 +logging analog 5 100 slow Аналоговый#вход Датчики 2 //если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит //значение чтения аналогового входа будут примерно равным diff --git a/data/configs/analog.scenario.txt b/data/configs/analog.s.txt similarity index 100% rename from data/configs/analog.scenario.txt rename to data/configs/analog.s.txt diff --git a/data/configs/dallas.config.txt b/data/configs/dallas.c.txt similarity index 64% rename from data/configs/dallas.config.txt rename to data/configs/dallas.c.txt index 9570e0d9..99906390 100644 --- a/data/configs/dallas.config.txt +++ b/data/configs/dallas.c.txt @@ -1,4 +1,5 @@ dallas 2 Водонагреватель,#t°C Датчики any-data 1 +logging dallas 1 100 slow Температура Датчики 2 //2 - номер пина датчика //варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file diff --git a/data/configs/dallas.scenario.txt b/data/configs/dallas.s.txt similarity index 100% rename from data/configs/dallas.scenario.txt rename to data/configs/dallas.s.txt diff --git a/data/configs/dht11.config.txt b/data/configs/dht11.c.txt similarity index 72% rename from data/configs/dht11.config.txt rename to data/configs/dht11.c.txt index 721a98c0..f23ed6e0 100644 --- a/data/configs/dht11.config.txt +++ b/data/configs/dht11.c.txt @@ -3,8 +3,8 @@ dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2 dhtComfort Степень#комфорта: Датчики 3 dhtPerception Восприятие: Датчики 4 dhtDewpoint Точка#росы: Датчики 5 -logging dhtT 1 10 Температура Датчики 6 -logging dhtH 1 10 Влажность Датчики 7 +logging dhtT 5 50 slow Температура Датчики 6 +logging dhtH 5 50 slow Влажность Датчики 7 //2 - номер пина датчика //варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file diff --git a/data/configs/dht11.scenario.txt b/data/configs/dht11.s.txt similarity index 100% rename from data/configs/dht11.scenario.txt rename to data/configs/dht11.s.txt diff --git a/data/configs/dht22.config.txt b/data/configs/dht22.c.txt similarity index 72% rename from data/configs/dht22.config.txt rename to data/configs/dht22.c.txt index 00441d8e..f239ae0f 100644 --- a/data/configs/dht22.config.txt +++ b/data/configs/dht22.c.txt @@ -3,8 +3,8 @@ dhtH DHT22 2 Влажность#DHT,#% Датчики any-data 2 dhtComfort Степень#комфорта: Датчики 3 dhtPerception Восприятие: Датчики 4 dhtDewpoint Точка#росы: Датчики 5 -logging dhtT 1 10 Температура Датчики 6 -logging dhtH 1 10 Влажность Датчики 7 +logging dhtT 5 50 slow Температура Датчики 6 +logging dhtH 5 50 slow Влажность Датчики 7 //2 - номер пина датчика //варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file diff --git a/data/configs/dht22.scenario.txt b/data/configs/dht22.s.txt similarity index 100% rename from data/configs/dht22.scenario.txt rename to data/configs/dht22.s.txt diff --git a/data/configs/firmware.c.txt b/data/configs/firmware.c.txt new file mode 100644 index 00000000..d473d648 --- /dev/null +++ b/data/configs/firmware.c.txt @@ -0,0 +1,14 @@ +button 1 na Включить#все Реле 0 1 +button 2 13 Прихожая Реле 0 2 +button 3 14 Кухня Реле 0 3 +pwm 1 3 Яркость#коредор: Реле 1023 4 +pwm 2 4 Яркость#ванная: Реле 510 5 +analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 +logging analog 1 100 slow Аналоговый#вход Датчики 7 + +//Это демо конфигурация. В ней показано как связать кнопки c мощью сценариев +//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 +//Так же продемонстрированна система логгирования данных строкой logging +//1 - это интервал между точками в минутах, 100 это количество точек +//slow или fast это два варианта выгрузки графика, slow более экономичный режим +//больше подходит для esp8266 \ No newline at end of file diff --git a/data/configs/firmware.config.txt b/data/configs/firmware.config.txt deleted file mode 100644 index 4f9dc5c4..00000000 --- a/data/configs/firmware.config.txt +++ /dev/null @@ -1,9 +0,0 @@ -button 1 na Включить#все Реле 0 1 -button 2 13 Прихожая Реле 0 2 -button 3 14 Кухня Реле 0 3 -pwm 1 3 Яркость#коредор: Реле 1023 4 -pwm 2 4 Яркость#ванная: Реле 510 5 -analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 - -//Это демо конфигурация. В ней показано как связать сценариями кнопки. -//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 \ No newline at end of file diff --git a/data/configs/firmware.scenario.txt b/data/configs/firmware.s.txt similarity index 100% rename from data/configs/firmware.scenario.txt rename to data/configs/firmware.s.txt diff --git a/data/configs/level.config.txt b/data/configs/level.c.txt similarity index 88% rename from data/configs/level.config.txt rename to data/configs/level.c.txt index ef75420d..28f10296 100644 --- a/data/configs/level.config.txt +++ b/data/configs/level.c.txt @@ -3,6 +3,7 @@ inputDigit digit1 При#скольки#выключить? Датчики 95 2 inputDigit digit2 При#скольки#включить? Датчики 10 3 button 1 5 Насос Датчики 0 4 button 2 line1,line2, Автоматический#режим Датчики 1 5 +logging level 1 100 slow Вода#в#баке Датчики 6 //125 - это расстояние от датчика до дна бака в сантиметрах //20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах diff --git a/data/configs/level.scenario.txt b/data/configs/level.s.txt similarity index 100% rename from data/configs/level.scenario.txt rename to data/configs/level.s.txt diff --git a/data/configs/moution_r.config.txt b/data/configs/moution_r.c.txt similarity index 100% rename from data/configs/moution_r.config.txt rename to data/configs/moution_r.c.txt diff --git a/data/configs/moution_r.scenario.txt b/data/configs/moution_r.s.txt similarity index 100% rename from data/configs/moution_r.scenario.txt rename to data/configs/moution_r.s.txt diff --git a/data/configs/moution_s.config.txt b/data/configs/moution_s.c.txt similarity index 55% rename from data/configs/moution_s.config.txt rename to data/configs/moution_s.c.txt index 1b0395e3..bc7d8192 100644 --- a/data/configs/moution_s.config.txt +++ b/data/configs/moution_s.c.txt @@ -2,9 +2,11 @@ switch 1 0 20 text 1 Вход: Охрана 1 textSet 1 не#обнаружено-time button 1 na Сбросить Охрана 0 2 +button 2 line3, Включить#push Охрана 1 3 //0 - номер пина датчика //при срабатывании датчика движения устройство пошлет пуш и в приложении будет -//написано в текстовом поле, что движение было обнаружено, так же будет зафиксирован -//момент времени срабатывания датчика +//написано в текстовом поле, что движение было обнаружено +//так же будет зафиксирован момент времени срабатывания датчика +//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин //перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении \ No newline at end of file diff --git a/data/configs/moution_s.scenario.txt b/data/configs/moution_s.s.txt similarity index 91% rename from data/configs/moution_s.scenario.txt rename to data/configs/moution_s.s.txt index 8a99cb60..f764dc9d 100644 --- a/data/configs/moution_s.scenario.txt +++ b/data/configs/moution_s.s.txt @@ -1,8 +1,10 @@ switch1 = 1 textSet 1 обнаружено#движение-time -push Внимание обнаружено#движение! end button1 = 1 textSet 1 не#обнаружено-time buttonSet 1 0 +end +switch1 = 1 +push Внимание обнаружено#движение! end \ No newline at end of file diff --git a/data/configs/pwm.config.txt b/data/configs/pwm.c.txt similarity index 100% rename from data/configs/pwm.config.txt rename to data/configs/pwm.c.txt diff --git a/data/configs/pwm.scenario.txt b/data/configs/pwm.s.txt similarity index 100% rename from data/configs/pwm.scenario.txt rename to data/configs/pwm.s.txt diff --git a/data/configs/relay.config.txt b/data/configs/relay.c.txt similarity index 100% rename from data/configs/relay.config.txt rename to data/configs/relay.c.txt diff --git a/data/configs/relay.scenario.txt b/data/configs/relay.s.txt similarity index 100% rename from data/configs/relay.scenario.txt rename to data/configs/relay.s.txt diff --git a/data/configs/relay_br.config.txt b/data/configs/relay_br.c.txt similarity index 100% rename from data/configs/relay_br.config.txt rename to data/configs/relay_br.c.txt diff --git a/data/configs/relay_br.scenario.txt b/data/configs/relay_br.s.txt similarity index 100% rename from data/configs/relay_br.scenario.txt rename to data/configs/relay_br.s.txt diff --git a/data/configs/relay_c.config.txt b/data/configs/relay_c.c.txt similarity index 100% rename from data/configs/relay_c.config.txt rename to data/configs/relay_c.c.txt diff --git a/data/configs/relay_c.scenario.txt b/data/configs/relay_c.s.txt similarity index 100% rename from data/configs/relay_c.scenario.txt rename to data/configs/relay_c.s.txt diff --git a/data/configs/relay_rm.config.txt b/data/configs/relay_rm.c.txt similarity index 100% rename from data/configs/relay_rm.config.txt rename to data/configs/relay_rm.c.txt diff --git a/data/configs/relay_rm.scenario.txt b/data/configs/relay_rm.s.txt similarity index 100% rename from data/configs/relay_rm.scenario.txt rename to data/configs/relay_rm.s.txt diff --git a/data/configs/relay_s.config.txt b/data/configs/relay_s.c.txt similarity index 100% rename from data/configs/relay_s.config.txt rename to data/configs/relay_s.c.txt diff --git a/data/configs/relay_s.scenario.txt b/data/configs/relay_s.s.txt similarity index 100% rename from data/configs/relay_s.scenario.txt rename to data/configs/relay_s.s.txt diff --git a/data/configs/relay_sr.config.txt b/data/configs/relay_sr.c.txt similarity index 100% rename from data/configs/relay_sr.config.txt rename to data/configs/relay_sr.c.txt diff --git a/data/configs/relay_sr.scenario.txt b/data/configs/relay_sr.s.txt similarity index 100% rename from data/configs/relay_sr.scenario.txt rename to data/configs/relay_sr.s.txt diff --git a/data/configs/relay_sw.config.txt b/data/configs/relay_sw.c.txt similarity index 100% rename from data/configs/relay_sw.config.txt rename to data/configs/relay_sw.c.txt diff --git a/data/configs/relay_sw.scenario.txt b/data/configs/relay_sw.s.txt similarity index 100% rename from data/configs/relay_sw.scenario.txt rename to data/configs/relay_sw.s.txt diff --git a/data/configs/relay_t.config.txt b/data/configs/relay_t.c.txt similarity index 100% rename from data/configs/relay_t.config.txt rename to data/configs/relay_t.c.txt diff --git a/data/configs/relay_t.scenario.txt b/data/configs/relay_t.s.txt similarity index 100% rename from data/configs/relay_t.scenario.txt rename to data/configs/relay_t.s.txt diff --git a/data/configs/stepper.config.txt b/data/configs/stepper.c.txt similarity index 100% rename from data/configs/stepper.config.txt rename to data/configs/stepper.c.txt diff --git a/data/configs/stepper.scenario.txt b/data/configs/stepper.s.txt similarity index 100% rename from data/configs/stepper.scenario.txt rename to data/configs/stepper.s.txt diff --git a/data/configs/termostat.config.txt b/data/configs/termostat.c.txt similarity index 79% rename from data/configs/termostat.config.txt rename to data/configs/termostat.c.txt index 70de213c..0ab8525d 100644 --- a/data/configs/termostat.config.txt +++ b/data/configs/termostat.c.txt @@ -1,9 +1,9 @@ dallas 2 Водонагреватель,#t°C Термостат any-data 1 -inputDigit digit1 При#скольки#выключить? Термостат 40 2 -inputDigit digit2 При#скольки#включить? Термостат 20 3 -button 1 5 Нагреватель Термостат 0 4 -button 2 line1,line2, Автоматический#режим Термостат 1 5 - +logging dallas 5 100 slow Температура Термостат 2 +inputDigit digit1 При#скольки#выключить? Термостат 40 3 +inputDigit digit2 При#скольки#включить? Термостат 20 4 +button 1 5 Нагреватель Термостат 0 5 +button 2 line1,line2, Автоматический#режим Термостат 1 6 //2 - номер пина датчика //5 - номер пина реле diff --git a/data/configs/termostat.scenario.txt b/data/configs/termostat.s.txt similarity index 100% rename from data/configs/termostat.scenario.txt rename to data/configs/termostat.s.txt diff --git a/data/configuration.json b/data/configuration.json index e4445487..5cd91f1e 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -33,24 +33,24 @@ "style": "display:inline", "title": { "#": "Выбирите то, во что Вы хотите превратить ESP ", - "/relay": "1.Вкл. выкл. локального реле", - "/relay_timer": "2.Вкл. выкл. локального реле в определенное время", - "/relay_countdown": "3.Вкл. выкл. локального реле на определенный период времени", - "/relay_several": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении", - "/relay_switch": "5.Вкл. выкл. локального реле физической кнопкой (кнопка так же дублируется в приложении)", - "/relay_button_remote": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)", - "/relay_switch_remote": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)", - "/pwm": "8.Широтно импульсная модуляция", - "/dht11": "9.Сенсор DHT11", - "/dht22": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03", - "/analog": "11.Аналоговый сенсор", - "/dallas": "12.Сенсор DS18B20", - "/termostat": "13.Термостат на DS18B20 с переключением в ручной режим", - "/level": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 (управление насосом)", - "/moution_relay": "15.Датчик движения включающий свет", - "/moution_security": "16.Охранный датчик движения", - "/stepper": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", - "/default": "Настройки по умолчанию" + "/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": "Настройки по умолчанию" } }, { @@ -59,7 +59,7 @@ }, { "type": "file", - "state": "firmware.config.txt", + "state": "firmware.c.txt", "style": "width:100%;height:400px", "title": "Сохранить", "action": "/all_modules_init", @@ -88,7 +88,7 @@ }, { "type": "file", - "state": "firmware.scenario.txt", + "state": "firmware.s.txt", "style": "width:100%;height:400px", "title": "Сохранить и включить", "action": "/scenario?status=1", @@ -99,7 +99,7 @@ }, { "type": "link", - "title": "Очистить все логи", + "title": "Очистить логи сенсоров", "action": "/cleanlog", "class": "btn btn-block btn-success" }, diff --git a/data/firmware.c.txt b/data/firmware.c.txt new file mode 100644 index 00000000..d473d648 --- /dev/null +++ b/data/firmware.c.txt @@ -0,0 +1,14 @@ +button 1 na Включить#все Реле 0 1 +button 2 13 Прихожая Реле 0 2 +button 3 14 Кухня Реле 0 3 +pwm 1 3 Яркость#коредор: Реле 1023 4 +pwm 2 4 Яркость#ванная: Реле 510 5 +analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 +logging analog 1 100 slow Аналоговый#вход Датчики 7 + +//Это демо конфигурация. В ней показано как связать кнопки c мощью сценариев +//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 +//Так же продемонстрированна система логгирования данных строкой logging +//1 - это интервал между точками в минутах, 100 это количество точек +//slow или fast это два варианта выгрузки графика, slow более экономичный режим +//больше подходит для esp8266 \ No newline at end of file diff --git a/data/firmware.config.txt b/data/firmware.config.txt deleted file mode 100644 index 4f9dc5c4..00000000 --- a/data/firmware.config.txt +++ /dev/null @@ -1,9 +0,0 @@ -button 1 na Включить#все Реле 0 1 -button 2 13 Прихожая Реле 0 2 -button 3 14 Кухня Реле 0 3 -pwm 1 3 Яркость#коредор: Реле 1023 4 -pwm 2 4 Яркость#ванная: Реле 510 5 -analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 - -//Это демо конфигурация. В ней показано как связать сценариями кнопки. -//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 \ No newline at end of file diff --git a/data/firmware.scenario.txt b/data/firmware.s.txt similarity index 100% rename from data/firmware.scenario.txt rename to data/firmware.s.txt diff --git a/esp32-esp8266_iot-manager_modules_firmware.ino b/esp32-esp8266_iot-manager_modules_firmware.ino index 10589ee8..838a5908 100644 --- a/esp32-esp8266_iot-manager_modules_firmware.ino +++ b/esp32-esp8266_iot-manager_modules_firmware.ino @@ -36,26 +36,14 @@ void setup() { Serial.println("[V] SSDP_init"); //-------------------------------------------------------------- - ts.add(TEST, 10000, [&](void*) { - - //String json = "{}"; - //jsonWriteStr(json, "test", GetTime()); - //ws.textAll(json); - - //getMemoryLoad("[i] After loading"); - //Serial.print(GetDataDigital()); - //Serial.print(" "); - //Serial.println(GetTime()); - - - }, nullptr, false); + getMemoryLoad("[i] periodic check of"); + }, nullptr, true); just_load = false; } - void loop() { #ifdef OTA_enable diff --git a/main.ino b/main.ino index f2717244..7f78e64c 100644 --- a/main.ino +++ b/main.ino @@ -257,6 +257,56 @@ String readFileString(String fileName, String found) { configFile.close(); } +// Запись данных в файл с частотой 1 секунда и более. Максимальное количество данных в суточном файле 1440 значений +void safeDataToFile(int inter, String par, uint16_t data) { + yield(); + // Формируем зоголовок (префикс) Интервал, Параметр, размер_параметра + uint16_t dataSize = sizeof(data); + String prifexFile; + prifexFile += inter; + prifexFile += "," + par; + prifexFile += ","; + prifexFile += dataSize; + prifexFile += ":"; + uint16_t prifexLen = prifexFile.length(); //Размер префикса + + // Сделаем имя файла + String fileName = GetDate(); + fileName = deleteBeforeDelimiter(fileName, " "); // удалим день недели + fileName.replace(" ", "."); + fileName.replace("..", "."); // Заменяем пробелы точками + fileName = par + "/" + fileName + ".txt"; // Имя файла параметр в виде директории и дата + fileName.toLowerCase(); //fileName = "san aug 31 2018"; Имя файла строчными буквами + Serial.println(fileName); + File configFile = SPIFFS.open("/" + fileName, "a"); // Открываем файл на добавление + size_t size = configFile.size(); + yield(); + if (size == 0) { + configFile.print(prifexFile); + } + size = configFile.size(); + // Получим время и определим позицию в файле + String time = GetTime(); + //time = "00:15:00"; + int timeM = timeToMin(time); // Здесь количество минут с начала суток + timeM = timeM / inter; + int poz = timeM * dataSize + prifexLen + 1; // позиция в которую нужно записать. + int endF = (size - prifexLen) * dataSize + prifexLen + 1; // позиция конца файла + if (poz >= endF) { // если файл имел пропуски в записи данных + int i = (poz - endF) / dataSize; + for (int j = 0; j < i; j++) { // Заполним недостающие данные + for (int d = 0; d < dataSize; d++) { + yield(); + configFile.write(0); // нулями + } + } + } + yield(); + configFile.write(data >> 8); // добавим текущие + configFile.write(data); // данные + configFile.close(); +} + //=======================================УПРАВЛЕНИЕ ВИДЖЕТАМИ MQTT====================================================================== diff --git a/mqtt.ino b/mqtt.ino index 72e7332b..6bdd5dc4 100644 --- a/mqtt.ino +++ b/mqtt.ino @@ -76,14 +76,14 @@ boolean MQTT_Connecting() { //ssl//espClient.setCACert(local_root_ca1); client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort")); if (WiFi.status() == WL_CONNECTED) { - if (!client.connected()) { + if (!client.connected()) { Serial.println("[V] Connecting to MQTT server commenced"); - if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { + if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { Serial.println("[V] MQTT connected"); client.setCallback(callback); client.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control - client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order + client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order Serial.println("[V] Callback set, subscribe done"); return true; } else { @@ -155,6 +155,11 @@ boolean sendCHART(String topik, String data) { client.endPublish(); return send_status; } +boolean sendCHART_test(String topik, String data) { + topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; + boolean send_status = client.publish (topik.c_str(), data.c_str(), false); + return send_status; +} //======================================STATUS================================================== void sendSTATUS(String topik, String state) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; @@ -264,7 +269,7 @@ String stateMQTT() { //SCENARIO ANALOG > 5 800324-1458415 rel1 0 if (jsonRead(configSetup, "scenario") == "1") { - //String all_text = readFile("firmware.scenario.txt", 1024) + "\r\n"; + //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"); diff --git a/set.h b/set.h index a86a0aa0..5c83bbba 100644 --- a/set.h +++ b/set.h @@ -155,3 +155,5 @@ boolean get_url_flag = false; boolean start_connecting_to_mqtt = false; String test; + +boolean chart_data_in_solid_array;