From e823207627a57ca59bd2fce6fb75a4e87121608a Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 29 Aug 2022 00:22:17 +0200 Subject: [PATCH 1/6] =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Logging/Loging.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/virtual/Logging/Loging.cpp b/src/modules/virtual/Logging/Loging.cpp index 48c85b64..1923ece2 100644 --- a/src/modules/virtual/Logging/Loging.cpp +++ b/src/modules/virtual/Logging/Loging.cpp @@ -104,11 +104,11 @@ class Loging : public IoTItem { //если id в имени файла совпадает с id данного экземпляра, пусть каждый экземпляр класса шлет только свое if (idInFileName == id) { //выбираем только те файлы которые входят в выбранные пользователем сутки - if (fileUnixTime > reqUnixTime && fileUnixTime < reqUnixTime + 86400) { - SerialPrint("i", F("Loging"), "'" + id + "' matching file found '" + fname + "'"); - //выгрузка по частям, по одному файлу - publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); - } + // if (fileUnixTime > reqUnixTime && fileUnixTime < reqUnixTime + 86400) { + SerialPrint("i", F("Loging"), "'" + id + "' matching file found '" + fname + "'"); + //выгрузка по частям, по одному файлу + publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); + //} } } else { SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' not used, deleted"); From 199c6ac46be42cebbfd8097795e7606267a8db1a Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:23:06 +0200 Subject: [PATCH 2/6] =?UTF-8?q?esp32=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 + data_svelte/items.json | 8 +- include/Const.h | 4 +- myProfile.json | 2 +- platformio.ini | 2 +- src/modules/API.cpp | 4 +- src/modules/virtual/Logging/Loging.cpp | 228 ++++++++++++++----------- src/utils/FileUtils.cpp | 18 +- 8 files changed, 159 insertions(+), 113 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..4302f252 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "*.tcc": "cpp", + "fstream": "cpp" + } +} \ No newline at end of file diff --git a/data_svelte/items.json b/data_svelte/items.json index ffb049c3..a9329e9a 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -442,16 +442,18 @@ "num": 33 }, { - "name": "34. PWM ESP8266", + "name": "34. PWM ESP32", "type": "Writing", - "subtype": "Pwm8266", + "subtype": "Pwm32", "id": "pwm", "widget": "range", "page": "Кнопки", "descr": "PWM", "int": 0, - "pin": 15, + "pin": 2, "freq": 5000, + "ledChannel": 2, + "PWM_resolution": 10, "val": 0, "apin": -1, "num": 34 diff --git a/include/Const.h b/include/Const.h index ed2e43ae..dad350c6 100644 --- a/include/Const.h +++ b/include/Const.h @@ -1,7 +1,7 @@ #pragma once //Версия прошивки -#define FIRMWARE_VERSION 412 +#define FIRMWARE_VERSION 413 #ifdef esp8266_4mb #define FIRMWARE_NAME "esp8266_4mb" @@ -32,7 +32,7 @@ #endif #ifdef esp32_4mb -#define USE_LITTLEFS true +#define USE_LITTLEFS false #endif #define START_DATETIME 1640995200 // 01.01.2022 00:00:00 константа для сокращения unix time diff --git a/myProfile.json b/myProfile.json index abcde54e..b737c76a 100644 --- a/myProfile.json +++ b/myProfile.json @@ -21,7 +21,7 @@ }, "projectProp": { "platformio": { - "default_envs": "esp8266_4mb", + "default_envs": "esp32_4mb", "data_dir": "data_svelte" } }, diff --git a/platformio.ini b/platformio.ini index cc816e70..c53521c1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,7 +39,7 @@ build_src_filter = ${env:esp32_4mb_fromitems.build_src_filter} [platformio] -default_envs = esp8266_4mb +default_envs = esp32_4mb data_dir = data_svelte [common_env_data] diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 33431763..cfb7e431 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -22,7 +22,7 @@ void* getAPI_ButtonOut(String subtype, String params); void* getAPI_IoTServo(String subtype, String params); void* getAPI_Mcp23017(String subtype, String params); void* getAPI_Mp3(String subtype, String params); -void* getAPI_Pwm8266(String subtype, String params); +void* getAPI_Pwm32(String subtype, String params); void* getAPI_SysExt(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); @@ -50,7 +50,7 @@ if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; +if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; return nullptr; diff --git a/src/modules/virtual/Logging/Loging.cpp b/src/modules/virtual/Logging/Loging.cpp index 1923ece2..f0fd2e77 100644 --- a/src/modules/virtual/Logging/Loging.cpp +++ b/src/modules/virtual/Logging/Loging.cpp @@ -16,6 +16,10 @@ class Loging : public IoTItem { jsonRead(parameters, F("logid"), logid); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); + if (points >= 300) { + points = 300; + SerialPrint("E", F("Loging"), "'" + id + "' user set more points than allowed, value reset to 300"); + } jsonRead(parameters, F("int"), interval); } @@ -50,10 +54,10 @@ class Loging : public IoTItem { //прочитаем путь к файлу последнего сохранения String filePath = readDataDB(id); - Serial.println("filePath " + filePath); + // Serial.println("filePath " + filePath); //если данные о файле отсутствуют, создадим новый - if (filePath == "failed") { + if (filePath == "failed" || filePath == "") { SerialPrint("E", F("Loging"), "'" + id + "' file path not found"); createNewFileWithData(logData); return; @@ -74,15 +78,15 @@ class Loging : public IoTItem { } void createNewFileWithData(String &logData) { - String filePath = "/lg/" + id + "-" + String(unixTimeShort) + ".txt"; //создадим путь - addFileLn(filePath, logData); //запишем файл и данные в него - saveDataDB(id, filePath); //запишем путь к файлу в базу данных - SerialPrint("i", F("Loging"), "'" + id + "' file created http://" + WiFi.localIP().toString() + filePath); + String path = "/lg/" + id + "-" + String(unixTimeShort) + ".txt"; //создадим путь + addFileLn(path, logData); //запишем файл и данные в него + saveDataDB(id, path); //запишем путь к файлу в базу данных + SerialPrint("i", F("Loging"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); } - void addNewDataToExistingFile(String &filePath, String &logData) { - addFileLn(filePath, logData); - SerialPrint("i", F("Loging"), "'" + id + "' loging in file http://" + WiFi.localIP().toString() + filePath); + void addNewDataToExistingFile(String &path, String &logData) { + addFileLn(path, logData); + SerialPrint("i", F("Loging"), "'" + id + "' loging in file http://" + WiFi.localIP().toString() + path); } void sendChart() { @@ -90,109 +94,127 @@ class Loging : public IoTItem { String reqUnixTimeStr = "27.08.2022"; //нужно получить эту дату из окна ввода под графиком. unsigned long reqUnixTime = strDateToUnix(reqUnixTimeStr); - String directory = "lg"; - // SerialPrint("i", F("Loging"), "'" + id + "' in directory '" + directory + "' files:"); - auto dir = FileFS.openDir(directory); String oneSingleJson; int i = 0; - +#if defined(ESP8266) + String directory = "lg"; + auto dir = FileFS.openDir(directory); while (dir.next()) { String fname = dir.fileName(); - String idInFileName = selectToMarker(fname, "-"); - unsigned long fileUnixTime = deleteBeforeDelimiter(deleteToMarkerLast(fname, "."), "-").toInt() + START_DATETIME; - if (isItemExist(id)) { - //если id в имени файла совпадает с id данного экземпляра, пусть каждый экземпляр класса шлет только свое - if (idInFileName == id) { - //выбираем только те файлы которые входят в выбранные пользователем сутки - // if (fileUnixTime > reqUnixTime && fileUnixTime < reqUnixTime + 86400) { - SerialPrint("i", F("Loging"), "'" + id + "' matching file found '" + fname + "'"); - //выгрузка по частям, по одному файлу - publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); - //} +#endif +#if defined(ESP32) + String directory = "/lg"; + File root = FileFS.open(directory); + directory = String(); + if (root.isDirectory()) { + File file = root.openNextFile(); + while (file) { + String fname = file.name(); + fname = selectToMarkerLast(fname, "/"); + file = root.openNextFile(); +#endif + String idInFileName = selectToMarker(fname, "-"); + unsigned long fileUnixTime = deleteBeforeDelimiter(deleteToMarkerLast(fname, "."), "-").toInt() + START_DATETIME; + if (isItemExist(id)) { + //если id в имени файла совпадает с id данного экземпляра, пусть каждый экземпляр класса шлет только свое + if (idInFileName == id) { + //выбираем только те файлы которые входят в выбранные пользователем сутки + // if (fileUnixTime > reqUnixTime && fileUnixTime < reqUnixTime + 86400) { + SerialPrint("i", F("Loging"), "'" + id + "' matching file found '" + fname + "'"); + //выгрузка по частям, по одному файлу + publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); + //} + } + } else { + SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' not used, deleted"); + removeFile(directory + "/" + fname); + } } - } else { - SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' not used, deleted"); - removeFile(directory + "/" + fname); +#if defined(ESP32) + } +#endif + + SerialPrint("i", F("Loging"), "'" + id + "'--------------'" + String(i) + "'--------------"); + } + + void publishJsonPartly(String file, int maxCount, int &i) { + File configFile = FileFS.open(file, "r"); + if (!configFile) { + SerialPrint("E", F("Loging"), "'" + id + "' open file error"); + return; + } + configFile.seek(0, SeekSet); + String buf = "{}"; + String dividedJson; + String unix_time; + String value; + unsigned int psn; + unsigned int sz = configFile.size(); + do { + i++; + psn = configFile.position(); + String line = configFile.readStringUntil('\n'); + unix_time = selectToMarker(line, " "); + jsonWriteInt(buf, "x", unix_time.toInt() + START_DATETIME); + value = deleteBeforeDelimiter(line, " "); + jsonWriteFloat(buf, "y1", value.toFloat()); + if (unix_time != "" || value != "") { + dividedJson += buf + ","; + } + } while (psn < sz); + + configFile.close(); + publishJson(dividedJson, maxCount); + } + + void publishJson(String & oneSingleJson, int &maxCount) { + oneSingleJson = "{\"maxCount\":" + String(maxCount) + ",\"status\":[" + oneSingleJson + "]}"; + oneSingleJson.replace("},]}", "}]}"); + if (!publishChart(id, oneSingleJson)) { + SerialPrint("E", F("Loging"), "'" + id + "' mqtt publish error"); } } - SerialPrint("i", F("Loging"), "'" + id + "'--------------'" + String(i) + "'--------------"); - } - void publishJsonPartly(String file, int maxCount, int &i) { - File configFile = FileFS.open(file, "r"); - if (!configFile) { - return; + //примерный подсчет максимального количества точек + int calculateMaxCount() { + return 86400 / interval; } - configFile.seek(0, SeekSet); - String buf = "{}"; - String dividedJson; - String unix_time; - String value; - unsigned int psn; - unsigned int sz = configFile.size(); - do { - i++; - psn = configFile.position(); - String line = configFile.readStringUntil('\n'); - unix_time = selectToMarker(line, " "); - jsonWriteInt(buf, "x", unix_time.toInt() + START_DATETIME); - value = deleteBeforeDelimiter(line, " "); - jsonWriteFloat(buf, "y1", value.toFloat()); - if (unix_time != "" || value != "") { - dividedJson += buf + ","; - } - } while (psn < sz); + }; - configFile.close(); - publishJson(dividedJson, maxCount); + void *getAPI_Loging(String subtype, String param) { + if (subtype == F("Loging")) { + return new Loging(param); + } else { + return nullptr; + } } - void publishJson(String &oneSingleJson, int &maxCount) { - oneSingleJson = "{\"maxCount\":" + String(maxCount) + ",\"status\":[" + oneSingleJson + "]}"; - oneSingleJson.replace("},]}", "}]}"); - publishChart(id, oneSingleJson); - } - - //примерный подсчет максимального количества точек - int calculateMaxCount() { - return 86400 / interval; - } -}; - -void *getAPI_Loging(String subtype, String param) { - if (subtype == F("Loging")) { - return new Loging(param); - } else { - return nullptr; - } -} - -//то что не пригодилось но пригодится потом может быть -// void createOneSingleJson(String &oneSingleJson, String file, int &maxCount, int &i) { -// File configFile = FileFS.open(file, "r"); -// if (!configFile) { -// return; -// } -// configFile.seek(0, SeekSet); -// String buf = "{}"; -// String unix_time; -// String value; -// unsigned int psn; -// unsigned int sz = configFile.size(); -// do { -// maxCount++; -// i++; -// psn = configFile.position(); -// String line = configFile.readStringUntil('\n'); -// unix_time = selectToMarker(line, " "); -// jsonWriteInt(buf, "x", unix_time.toInt() + START_DATETIME); -// value = deleteBeforeDelimiter(line, " "); -// jsonWriteFloat(buf, "y1", value.toFloat()); -// if (unix_time != "" || value != "") { -// oneSingleJson += buf + ","; -// } -// -// } while (psn < sz); -// -// configFile.close(); -// } + //то что не пригодилось но пригодится потом может быть + // void createOneSingleJson(String &oneSingleJson, String file, int &maxCount, int &i) { + // File configFile = FileFS.open(file, "r"); + // if (!configFile) { + // return; + // } + // configFile.seek(0, SeekSet); + // String buf = "{}"; + // String unix_time; + // String value; + // unsigned int psn; + // unsigned int sz = configFile.size(); + // do { + // maxCount++; + // i++; + // psn = configFile.position(); + // String line = configFile.readStringUntil('\n'); + // unix_time = selectToMarker(line, " "); + // jsonWriteInt(buf, "x", unix_time.toInt() + START_DATETIME); + // value = deleteBeforeDelimiter(line, " "); + // jsonWriteFloat(buf, "y1", value.toFloat()); + // if (unix_time != "" || value != "") { + // oneSingleJson += buf + ","; + // } + // + // } while (psn < sz); + // + // configFile.close(); + // } diff --git a/src/utils/FileUtils.cpp b/src/utils/FileUtils.cpp index dfdfa4f7..efecfe4e 100644 --- a/src/utils/FileUtils.cpp +++ b/src/utils/FileUtils.cpp @@ -192,6 +192,7 @@ void removeFile(const String& filename) { //очищаем директорию с файлами void cleanDirectory(String path) { +#if defined(ESP8266) auto dir = FileFS.openDir(path); while (dir.next()) { String fname = dir.fileName(); @@ -199,6 +200,21 @@ void cleanDirectory(String path) { SerialPrint("I", "Files", path + "/" + fname + " => deleted"); } onFlashWrite(); +#endif +#if defined(ESP32) + path = "/" + path; + File root = FileFS.open(path); + path = String(); + if (root.isDirectory()) { + File file = root.openNextFile(); + while (file) { + String fname = file.name(); + removeFile(fname); + SerialPrint("I", "Files", fname + " => deleted"); + file = root.openNextFile(); + } + } +#endif } void saveDataDB(String id, String data) { @@ -252,7 +268,7 @@ String FileList(String path) { output += "{\"type\":\""; output += (file.isDirectory()) ? "dir" : "file"; output += "\",\"name\":\""; - output += String(file.path()).substring(1); + // output += String(file.path()).substring(1); output += "\"}"; file = root.openNextFile(); } From 88d5ac513e2893b0ab6abd16dfd2ebcbbef8400d Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:41:27 +0200 Subject: [PATCH 3/6] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D1=8B=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Logging/Loging.cpp | 6 ++++++ src/modules/virtual/Logging/modinfo.json | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/modules/virtual/Logging/Loging.cpp b/src/modules/virtual/Logging/Loging.cpp index f0fd2e77..35529d3d 100644 --- a/src/modules/virtual/Logging/Loging.cpp +++ b/src/modules/virtual/Logging/Loging.cpp @@ -7,6 +7,7 @@ class Loging : public IoTItem { String logid; String id; int points; + int keepdays; int interval; bool firstTime = true; @@ -21,6 +22,7 @@ class Loging : public IoTItem { SerialPrint("E", F("Loging"), "'" + id + "' user set more points than allowed, value reset to 300"); } jsonRead(parameters, F("int"), interval); + jsonRead(parameters, F("keepdays"), keepdays); } String getValue() { @@ -124,6 +126,10 @@ class Loging : public IoTItem { //выгрузка по частям, по одному файлу publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); //} + if (fileUnixTime < (unixTime - (keepdays * 86400))) { + SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' too old, deleted"); + removeFile(directory + "/" + fname); + } } } else { SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' not used, deleted"); diff --git a/src/modules/virtual/Logging/modinfo.json b/src/modules/virtual/Logging/modinfo.json index 694156fb..a2be2d4f 100644 --- a/src/modules/virtual/Logging/modinfo.json +++ b/src/modules/virtual/Logging/modinfo.json @@ -12,7 +12,8 @@ "int": 60, "logid": "tmp", "num": 1, - "points": 255 + "points": 300, + "keepdays": 2 } ], "about": { @@ -22,11 +23,12 @@ "specialThanks": "", "moduleName": "Loging", "moduleVersion": "1.0", - "moduleDesc": "Расширение позволяющее логгировать любую величину в график", + "moduleDesc": "Расширение позволяющее логировать любую величину в график", "propInfo": { - "int": "Интервал", - "logid": "ID величины которую будем логгировать", - "points": "Максимальное количество точек в одном файле" + "int": "Интервал логирования", + "logid": "ID величины которую будем логировать", + "points": "Максимальное количество точек в одном файле, может быть не более 300", + "keepdays": "Количество дней за которое необходимо хранить историю. Данные старее будут удалены автоматически" } }, "defActive": true, From 4b4816a2648f064c2db356906187bb16384f7c3b Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:42:33 +0200 Subject: [PATCH 4/6] . --- src/modules/virtual/Logging/Loging.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/virtual/Logging/Loging.cpp b/src/modules/virtual/Logging/Loging.cpp index 35529d3d..c27b1063 100644 --- a/src/modules/virtual/Logging/Loging.cpp +++ b/src/modules/virtual/Logging/Loging.cpp @@ -126,6 +126,7 @@ class Loging : public IoTItem { //выгрузка по частям, по одному файлу publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); //} + //удаление старых файлов if (fileUnixTime < (unixTime - (keepdays * 86400))) { SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' too old, deleted"); removeFile(directory + "/" + fname); From 03000298a4090d8643d40c63b57c0d423951efda Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:46:48 +0200 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/items.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data_svelte/items.json b/data_svelte/items.json index a9329e9a..fedb8f8e 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -17,7 +17,8 @@ "int": 60, "logid": "tmp", "num": 1, - "points": 255 + "points": 300, + "keepdays": 2 }, { "name": "2. Таймер", From 1200861b1d96b7c452634ddae38b0a145630a517 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Tue, 30 Aug 2022 01:12:30 +0200 Subject: [PATCH 6/6] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Logging/Loging.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/virtual/Logging/Loging.cpp b/src/modules/virtual/Logging/Loging.cpp index c27b1063..b3a603b2 100644 --- a/src/modules/virtual/Logging/Loging.cpp +++ b/src/modules/virtual/Logging/Loging.cpp @@ -127,7 +127,7 @@ class Loging : public IoTItem { publishJsonPartly("/lg/" + fname, calculateMaxCount(), i); //} //удаление старых файлов - if (fileUnixTime < (unixTime - (keepdays * 86400))) { + if ((fileUnixTime + (points * interval)) < (unixTime - (keepdays * 86400))) { SerialPrint("i", F("Loging"), "'" + id + "' file '" + fname + "' too old, deleted"); removeFile(directory + "/" + fname); }