From 692a36bf376bed34664cdf36c04ff905a9c6d9b1 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 28 Mar 2025 22:47:10 +0300 Subject: [PATCH] fix chart 2x 3x --- src/modules/virtual/Loging2/Loging2.cpp | 264 ++++++++++++------- src/modules/virtual/Loging3/Loging3.cpp | 335 ++++++++++++++---------- 2 files changed, 375 insertions(+), 224 deletions(-) diff --git a/src/modules/virtual/Loging2/Loging2.cpp b/src/modules/virtual/Loging2/Loging2.cpp index 71573552..3749bbb8 100644 --- a/src/modules/virtual/Loging2/Loging2.cpp +++ b/src/modules/virtual/Loging2/Loging2.cpp @@ -5,8 +5,9 @@ void *getAPI_Date2(String params); -class Loging2 : public IoTItem { - private: +class Loging2 : public IoTItem +{ +private: String logid1; String logid2; String id; @@ -17,29 +18,31 @@ class Loging2 : public IoTItem { int _wsNum = -1; int points; - //int keepdays; + // int keepdays; IoTItem *dateIoTItem; String prevDate = ""; bool firstTimeInit = true; - // long interval; + // long interval; - public: - Loging2(String parameters) : IoTItem(parameters) { +public: + Loging2(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("logid1"), logid1); jsonRead(parameters, F("logid2"), logid2); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); - if (points > 300) { + if (points > 300) + { points = 300; SerialPrint("E", F("Loging2"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); - interval = interval * 60; // приводим к милисекундам - //jsonRead(parameters, F("keepdays"), keepdays, false); + jsonRead(parameters, F("int"), interval); // в минутах + setInterval(interval * 60); + // jsonRead(parameters, F("keepdays"), keepdays, false); // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date2("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); @@ -47,28 +50,33 @@ class Loging2 : public IoTItem { SerialPrint("I", F("Loging2"), "created date instance " + id); } - void doByInterval() { + void doByInterval() + { // если объект логгирования не был создан - if (!isItemExist(logid1)) { + if (!isItemExist(logid1)) + { SerialPrint("E", F("Loging2"), "'" + id + "' loging object not exist, return"); return; } String value = getItemValue(logid1); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); return; } - String value2 = getItemValue(logid2); + String value2 = getItemValue(logid2); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging2"), "'" + id + "' Сant loging - time not synchronized, return"); return; } @@ -85,13 +93,17 @@ class Loging2 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData2); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging2"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData2); return; @@ -104,26 +116,32 @@ class Loging2 : public IoTItem { SerialPrint("i", F("Loging2"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData2); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData2); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - - void SetDoByInterval(String valse) { +/* + void SetDoByInterval(String valse) + { String value = valse; // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2Event"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging2Event"), "'" + id + "' Сant loging - time not synchronized, return"); return; } @@ -136,13 +154,17 @@ class Loging2 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging2Event"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData2); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging2Event"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData2); return; @@ -155,41 +177,51 @@ class Loging2 : public IoTItem { SerialPrint("i", F("Loging2Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData2); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData2); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - void createNewFileWithData(String &logData) { +*/ + void createNewFileWithData(String &logData) + { logData = logData + ","; - String path = "/lg2/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + String path = "/lg2/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt // создадим пустой файл - if (writeEmptyFile(path) != "success") { + if (writeEmptyFile(path) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' file writing error, return"); return; } // запишем в него данные - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' data writing error, return"); return; } // запишем путь к нему в базу данных - if (saveDataDB(id, path) != "success") { + if (saveDataDB(id, path) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' db file writing error, return"); return; } SerialPrint("i", F("Loging2"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); } - void addNewDataToExistingFile(String &path, String &logData) { + void addNewDataToExistingFile(String &path, String &logData) + { logData = logData + ","; - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("i", F("Loging2"), "'" + id + "' file writing error, return"); return; }; @@ -197,11 +229,14 @@ class Loging2 : public IoTItem { } // данная функция уже перенесена в ядро и будет удалена в последствии - bool hasDayChanged() { + bool hasDayChanged() + { bool changed = false; String currentDate = getTodayDateDotFormated(); - if (!firstTimeInit) { - if (prevDate != currentDate) { + if (!firstTimeInit) + { + if (prevDate != currentDate) + { changed = true; SerialPrint("i", F("NTP"), F("Change day event")); #if defined(ESP8266) @@ -216,7 +251,8 @@ class Loging2 : public IoTItem { return changed; } - void publishValue() { + void publishValue() + { String dir = "/lg2/" + id; filesList = getFilesList(dir); @@ -226,7 +262,8 @@ class Loging2 : public IoTItem { bool noData = true; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = "/lg2/" + id + path; @@ -236,65 +273,83 @@ class Loging2 : public IoTItem { unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); - if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) + { noData = false; String json = getAdditionalJson(); - if (_publishType == TO_MQTT) { + if (_publishType == TO_MQTT) + { publishChartFileToMqtt(path, id, calculateMaxCount()); - } else if (_publishType == TO_WS) { + } + else if (_publishType == TO_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); - } else if (_publishType == TO_MQTT_WS) { + } + else if (_publishType == TO_MQTT_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); publishChartFileToMqtt(path, id, calculateMaxCount()); } SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); - } else { + } + else + { SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); } filesList = deleteBeforeDelimiter(filesList, ";"); } // если данных нет отправляем пустой грфик - if (noData) { + if (noData) + { clearValue(); } } - String getAdditionalJson() { + String getAdditionalJson() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; return json; } - void publishChartToWsSinglePoint(String value) { + void publishChartToWsSinglePoint(String value) + { String topic = mqttRootDevice + "/" + id; - String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + "}]}"; + String value2 = getItemValue(logid2); + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value2 + "}]}"; sendStringToWs("chartb", json, -1); } - void clearValue() { + void clearValue() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; sendStringToWs("chartb", json, -1); } - void clearHistory() { + void clearHistory() + { String dir = "/lg2/" + id; cleanDirectory(dir); } - void deleteLastFile() { + void deleteLastFile() + { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging2", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 20.00) { + if (tmp.freePer <= 20.00) + { String dir = "/lg/" + id; filesList = getFilesList(dir); int i = 0; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = dir + path; i++; - if (i == 1) { + if (i == 1) + { removeFile(path); SerialPrint("!", "Loging2", String(i) + ") " + path + " => oldest files been deleted"); return; @@ -305,33 +360,37 @@ class Loging2 : public IoTItem { } } - void setPublishDestination(int publishType, int wsNum) { + void setPublishDestination(int publishType, int wsNum) + { _publishType = publishType; _wsNum = wsNum; } - String getValue() { + String getValue() + { return ""; } -/* - void loop() { - if (enableDoByInt) { - currentMillis = millis(); - difference = currentMillis - prevMillis; - if (difference >= interval) { - prevMillis = millis(); - if (interval != 0) { - this->doByInterval(); + /* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } } } } - } -*/ - void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + */ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) + { String userDate = getItemValue(id + "-date"); String currentDate = getTodayDateDotFormated(); // отправляем в график данные только когда выбран сегодняшний день - if (userDate == currentDate) { + if (userDate == currentDate) + { // generateEvent(_id, value); // publishStatusMqtt(_id, value); @@ -341,53 +400,69 @@ class Loging2 : public IoTItem { } // просто максимальное количество точек - int calculateMaxCount() { + int calculateMaxCount() + { return 86400; } // путь вида: /lg/log/1231231.txt - unsigned long getFileUnixLocalTime(String path) { + unsigned long getFileUnixLocalTime(String path) + { return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); } - void setValue(const IoTValue &Value, bool genEvent = true) { + /* + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; this->SetDoByInterval(String(value.valD)); SerialPrint("i", "Loging2", "setValue:" + String(value.valD)); regEvent(value.valS, "Loging2", false, genEvent); } +*/ }; -void *getAPI_Loging2(String subtype, String param) { - if (subtype == F("Loging2")) { +void *getAPI_Loging2(String subtype, String param) +{ + if (subtype == F("Loging2")) + { return new Loging2(param); - } else { + } + else + { return nullptr; } } -class Date : public IoTItem { - private: +class Date : public IoTItem +{ +private: bool firstTime = true; - public: +public: String id; - Date(String parameters) : IoTItem(parameters) { + Date(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("id"), id); value.isDecimal = false; } - void setValue(const String &valStr, bool genEvent = true) { + void setValue(const String &valStr, bool genEvent = true) + { value.valS = valStr; setValue(value, genEvent); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; regEvent(value.valS, "", false, genEvent); // отправка данных при изменении даты - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() == "Loging2") { - if ((*it)->getID() == selectToMarker(id, "-")) { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "Loging2") + { + if ((*it)->getID() == selectToMarker(id, "-")) + { (*it)->setPublishDestination(TO_MQTT_WS, -1); (*it)->publishValue(); } @@ -395,14 +470,18 @@ class Date : public IoTItem { } } - void setTodayDate() { + void setTodayDate() + { setValue(getTodayDateDotFormated()); SerialPrint("E", F("Loging2"), "today date set " + getTodayDateDotFormated()); } - void doByInterval() { - if (isTimeSynch) { - if (firstTime) { + void doByInterval() + { + if (isTimeSynch) + { + if (firstTime) + { setTodayDate(); firstTime = false; } @@ -410,6 +489,7 @@ class Date : public IoTItem { } }; -void *getAPI_Date2(String param) { +void *getAPI_Date2(String param) +{ return new Date(param); } diff --git a/src/modules/virtual/Loging3/Loging3.cpp b/src/modules/virtual/Loging3/Loging3.cpp index 0a2dcfa9..fa9254f3 100644 --- a/src/modules/virtual/Loging3/Loging3.cpp +++ b/src/modules/virtual/Loging3/Loging3.cpp @@ -5,8 +5,9 @@ void *getAPI_Date3(String params); -class Loging3 : public IoTItem { - private: +class Loging3 : public IoTItem +{ +private: String logid1; String logid2; String logid3; @@ -18,31 +19,33 @@ class Loging3 : public IoTItem { int _wsNum = -1; int points; - //int keepdays; + // int keepdays; IoTItem *dateIoTItem; String prevDate = ""; bool firstTimeInit = true; - //long interval; + // long interval; - public: - Loging3(String parameters) : IoTItem(parameters) { +public: + Loging3(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("logid1"), logid1); jsonRead(parameters, F("logid2"), logid2); jsonRead(parameters, F("logid3"), logid3); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); - if (points > 300) { + if (points > 300) + { points = 300; SerialPrint("E", F("Loging3"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); - interval = interval * 60; // приводим к милисекундам - //jsonRead(parameters, F("keepdays"), keepdays, false); + jsonRead(parameters, F("int"), interval); // в минутах + setInterval(interval * 60); + // jsonRead(parameters, F("keepdays"), keepdays, false); // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date3("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); @@ -50,41 +53,47 @@ class Loging3 : public IoTItem { SerialPrint("I", F("Loging3"), "created date instance " + id); } - void doByInterval() { + void doByInterval() + { // если объект логгирования не был создан - if (!isItemExist(logid1)) { + if (!isItemExist(logid1)) + { SerialPrint("E", F("Loging3"), "'" + id + "' loging object not exist, return"); return; } String value = getItemValue(logid1); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } - String value2 = getItemValue(logid2); + String value2 = getItemValue(logid2); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } - String value3 = getItemValue(logid3); + String value3 = getItemValue(logid3); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging"), "'" + id + "' Сant loging - time not synchronized, return"); return; } regEvent(value, F("Loging3")); - //String logData2; + // String logData2; String logData3; jsonWriteInt(logData3, "x", unixTime, false); @@ -96,13 +105,17 @@ class Loging3 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData3); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging3"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData3); return; @@ -115,93 +128,103 @@ class Loging3 : public IoTItem { SerialPrint("i", F("Loging3"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData3); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData3); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - - void SetDoByInterval(String valse) { - String value = valse; - // если значение логгирования пустое - if (value == "") { - SerialPrint("E", F("Loging3Event"), "'" + id + "' loging value is empty, return"); - return; - } - // если время не было получено из интернета - if (!isTimeSynch) { - SerialPrint("E", F("Loging3Event"), "'" + id + "' Сant loging - time not synchronized, return"); - return; - } - regEvent(value, F("Loging3Event")); - String logData3; - jsonWriteInt(logData3, "x", unixTime, false); - jsonWriteFloat(logData3, "y1", value.toFloat(), false); - jsonWriteFloat(logData3, "y2", value.toFloat(), false); - jsonWriteFloat(logData3, "y3", value.toFloat(), false); - // прочитаем путь к файлу последнего сохранения - String filePath = readDataDB(id); - - // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { - SerialPrint("E", F("Loging3Event"), "'" + id + "' file path not found, start create new file"); - createNewFileWithData(logData3); - return; - } else { - // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { - SerialPrint("E", F("Loging3Event"), "'" + id + "' file too old, start create new file"); - createNewFileWithData(logData3); + /* + void SetDoByInterval(String valse) { + String value = valse; + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' loging value is empty, return"); return; } - } + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + regEvent(value, F("Loging3Event")); + String logData3; + jsonWriteInt(logData3, "x", unixTime, false); + jsonWriteFloat(logData3, "y1", value.toFloat(), false); + jsonWriteFloat(logData3, "y2", value.toFloat(), false); + jsonWriteFloat(logData3, "y3", value.toFloat(), false); + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); - // считаем количество строк и определяем размер файла - size_t size = 0; - int lines = countJsonObj(filePath, size); - SerialPrint("i", F("Loging3Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData3); + return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData3); + return; + } + } - // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { - // просто добавим в существующий файл новые данные - addNewDataToExistingFile(filePath, logData3); - // если больше или поменялась дата то создадим следующий файл - } else { - createNewFileWithData(logData3); + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging3Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData3); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData3); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); } - // запускаем процедуру удаления старых файлов если память переполняется - deleteLastFile(); - } - void createNewFileWithData(String &logData) { + */ + void createNewFileWithData(String &logData) + { logData = logData + ","; - String path = "/lg3/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + String path = "/lg3/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt // создадим пустой файл - if (writeEmptyFile(path) != "success") { + if (writeEmptyFile(path) != "success") + { SerialPrint("E", F("Loging"), "'" + id + "' file writing error, return"); return; } // запишем в него данные - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("E", F("Loging3"), "'" + id + "' data writing error, return"); return; } // запишем путь к нему в базу данных - if (saveDataDB(id, path) != "success") { + if (saveDataDB(id, path) != "success") + { SerialPrint("E", F("Loging3"), "'" + id + "' db file writing error, return"); return; } SerialPrint("i", F("Loging3"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); } - void addNewDataToExistingFile(String &path, String &logData) { + void addNewDataToExistingFile(String &path, String &logData) + { logData = logData + ","; - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("i", F("Loging3"), "'" + id + "' file writing error, return"); return; }; @@ -209,11 +232,14 @@ class Loging3 : public IoTItem { } // данная функция уже перенесена в ядро и будет удалена в последствии - bool hasDayChanged() { + bool hasDayChanged() + { bool changed = false; String currentDate = getTodayDateDotFormated(); - if (!firstTimeInit) { - if (prevDate != currentDate) { + if (!firstTimeInit) + { + if (prevDate != currentDate) + { changed = true; SerialPrint("i", F("NTP"), F("Change day event")); #if defined(ESP8266) @@ -228,7 +254,8 @@ class Loging3 : public IoTItem { return changed; } - void publishValue() { + void publishValue() + { String dir = "/lg3/" + id; filesList = getFilesList(dir); @@ -238,7 +265,8 @@ class Loging3 : public IoTItem { bool noData = true; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = "/lg3/" + id + path; @@ -248,65 +276,84 @@ class Loging3 : public IoTItem { unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); - if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) + { noData = false; String json = getAdditionalJson(); - if (_publishType == TO_MQTT) { + if (_publishType == TO_MQTT) + { publishChartFileToMqtt(path, id, calculateMaxCount()); - } else if (_publishType == TO_WS) { + } + else if (_publishType == TO_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); - } else if (_publishType == TO_MQTT_WS) { + } + else if (_publishType == TO_MQTT_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); publishChartFileToMqtt(path, id, calculateMaxCount()); } SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); - } else { + } + else + { SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); } filesList = deleteBeforeDelimiter(filesList, ";"); } // если данных нет отправляем пустой грфик - if (noData) { + if (noData) + { clearValue(); } } - String getAdditionalJson() { + String getAdditionalJson() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; return json; } - void publishChartToWsSinglePoint(String value) { + void publishChartToWsSinglePoint(String value) + { String topic = mqttRootDevice + "/" + id; - String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + ",\"y3\":" + value + "}]}"; + String value2 = getItemValue(logid2); + String value3 = getItemValue(logid3); + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value2 + ",\"y3\":" + value3 + "}]}"; sendStringToWs("chartb", json, -1); } - void clearValue() { + void clearValue() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; sendStringToWs("chartb", json, -1); } - void clearHistory() { + void clearHistory() + { String dir = "/lg3/" + id; cleanDirectory(dir); } - void deleteLastFile() { + void deleteLastFile() + { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging3", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 20.00) { + if (tmp.freePer <= 20.00) + { String dir = "/lg3/" + id; filesList = getFilesList(dir); int i = 0; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = dir + path; i++; - if (i == 1) { + if (i == 1) + { removeFile(path); SerialPrint("!", "Loging3", String(i) + ") " + path + " => oldest files been deleted"); return; @@ -317,33 +364,37 @@ class Loging3 : public IoTItem { } } - void setPublishDestination(int publishType, int wsNum) { + void setPublishDestination(int publishType, int wsNum) + { _publishType = publishType; _wsNum = wsNum; } - String getValue() { + String getValue() + { return ""; } -/* - void loop() { - if (enableDoByInt) { - currentMillis = millis(); - difference = currentMillis - prevMillis; - if (difference >= interval) { - prevMillis = millis(); - if (interval != 0) { - this->doByInterval(); + /* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } } } } - } -*/ - void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + */ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) + { String userDate = getItemValue(id + "-date"); String currentDate = getTodayDateDotFormated(); // отправляем в график данные только когда выбран сегодняшний день - if (userDate == currentDate) { + if (userDate == currentDate) + { // generateEvent(_id, value); // publishStatusMqtt(_id, value); @@ -353,53 +404,68 @@ class Loging3 : public IoTItem { } // просто максимальное количество точек - int calculateMaxCount() { + int calculateMaxCount() + { return 86400; } // путь вида: /lg/log/1231231.txt - unsigned long getFileUnixLocalTime(String path) { + unsigned long getFileUnixLocalTime(String path) + { return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); } + /* void setValue(const IoTValue &Value, bool genEvent = true) { value = Value; this->SetDoByInterval(String(value.valD)); SerialPrint("i", "Loging3", "setValue:" + String(value.valD)); regEvent(value.valS, "Loging3", false, genEvent); } + */ }; -void *getAPI_Loging3(String subtype, String param) { - if (subtype == F("Loging3")) { +void *getAPI_Loging3(String subtype, String param) +{ + if (subtype == F("Loging3")) + { return new Loging3(param); - } else { + } + else + { return nullptr; } } -class Date : public IoTItem { - private: +class Date : public IoTItem +{ +private: bool firstTime = true; - public: +public: String id; - Date(String parameters) : IoTItem(parameters) { + Date(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("id"), id); value.isDecimal = false; } - void setValue(const String &valStr, bool genEvent = true) { + void setValue(const String &valStr, bool genEvent = true) + { value.valS = valStr; setValue(value, genEvent); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; regEvent(value.valS, "", false, genEvent); // отправка данных при изменении даты - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() == "Loging3") { - if ((*it)->getID() == selectToMarker(id, "-")) { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "Loging3") + { + if ((*it)->getID() == selectToMarker(id, "-")) + { (*it)->setPublishDestination(TO_MQTT_WS, -1); (*it)->publishValue(); } @@ -407,14 +473,18 @@ class Date : public IoTItem { } } - void setTodayDate() { + void setTodayDate() + { setValue(getTodayDateDotFormated()); SerialPrint("E", F("Loging3"), "today date set " + getTodayDateDotFormated()); } - void doByInterval() { - if (isTimeSynch) { - if (firstTime) { + void doByInterval() + { + if (isTimeSynch) + { + if (firstTime) + { setTodayDate(); firstTime = false; } @@ -422,6 +492,7 @@ class Date : public IoTItem { } }; -void *getAPI_Date3(String param) { +void *getAPI_Date3(String param) +{ return new Date(param); }