diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index cab0dbe2..4c681bff 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -47,7 +47,7 @@ "name": "anydataWth", "label": "Энергия", "widget": "anydata", - "after": "kWt/Hr", + "after": "kWh", "icon": "speedometer" }, { @@ -209,6 +209,27 @@ "after": "ppm", "icon": "speedometer" }, + { + "name": "anydatamAmp", + "label": "миллиАмперы", + "widget": "anydata", + "after": "mAmp", + "icon": "speedometer" + }, + { + "name": "anydatamVlt", + "label": "миллиВольты", + "widget": "anydata", + "after": "mVlt", + "icon": "speedometer" + }, + { + "name": "anydatamWt", + "label": "миллиВатты", + "widget": "anydata", + "after": "mWt", + "icon": "speedometer" + }, { "name": "nil", "label": "Без виджета" diff --git a/src/modules/sensors/UART/Uart.cpp b/src/modules/sensors/UART/Uart.cpp index a55cfa13..df2501f5 100644 --- a/src/modules/sensors/UART/Uart.cpp +++ b/src/modules/sensors/UART/Uart.cpp @@ -105,14 +105,20 @@ class UART : public IoTItem { case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF printStr += eventItem->getID(); - if (printStr.indexOf("_") == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol + int indexOf_ = printStr.indexOf("_"); + if (indexOf_ == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol if (printStr.indexOf("_txt") > 0) { printStr.replace("_txt", ".txt=\""); printStr += eventItem->getValue(); printStr += "\""; + } else if (printStr.indexOf("_val") > 0) { + printStr.replace(".", ""); + printStr.replace("_val", ".val="); + printStr += eventItem->getValue(); } else { - printStr.replace("_", "."); + if (indexOf_ == printStr.length()) printStr.replace("_", ""); + else printStr.replace("_", "."); printStr += "="; printStr += eventItem->getValue(); } diff --git a/src/modules/virtual/Loging/Loging.cpp b/src/modules/virtual/Loging/Loging.cpp index 9fb21aec..3c26c933 100644 --- a/src/modules/virtual/Loging/Loging.cpp +++ b/src/modules/virtual/Loging/Loging.cpp @@ -9,6 +9,7 @@ class Loging : public IoTItem { private: String logid; String id; + String tmpValue; String filesList = ""; int _publishType = -2; @@ -103,7 +104,56 @@ class Loging : public IoTItem { //запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } +void SetDoByInterval(String valse) { + String value = valse; + //если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("LogingEvent"), "'" + id + "' loging value is empty, return"); + return; + } + //если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("LogingEvent"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + regEvent(value, F("LogingEvent")); + String logData; + jsonWriteInt(logData, "x", unixTime); + jsonWriteFloat(logData, "y1", value.toFloat()); + //прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + //если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("LogingEvent"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData); + return; + } else { + //если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("LogingEvent"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData); + return; + } + } + + //считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("LogingEvent"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + //если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + //просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData); + //если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData); + } + //запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); + + } void createNewFileWithData(String &logData) { logData = logData + ","; String path = "/lg/" + id + "/" + String(unixTimeShort) + ".txt"; //создадим путь вида /lg/id/133256622333.txt @@ -258,7 +308,9 @@ class Loging : public IoTItem { difference = currentMillis - prevMillis; if (difference >= interval) { prevMillis = millis(); - this->doByInterval(); + if(interval != 0){ + this->doByInterval(); + } } } } @@ -285,6 +337,12 @@ class Loging : public IoTItem { 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", "Loging", "setValue:" + String(value.valD)); + regEvent(value.valS, "Loging", false, genEvent); + } }; void *getAPI_Loging(String subtype, String param) { diff --git a/src/modules/virtual/Loging/modinfo.json b/src/modules/virtual/Loging/modinfo.json index 1fb3da7f..53a962f7 100644 --- a/src/modules/virtual/Loging/modinfo.json +++ b/src/modules/virtual/Loging/modinfo.json @@ -14,6 +14,19 @@ "int": 5, "logid": "t", "points": 300 + }, + { + "global": 0, + "name": "График по событию", + "type": "Writing", + "subtype": "Loging", + "id": "log", + "widget": "chart2", + "page": "Графики", + "descr": "Температура", + "int": 0, + "num": 1, + "points": 300 } ], "about": { diff --git a/src/modules/virtual/LogingDaily/modinfo.json b/src/modules/virtual/LogingDaily/modinfo.json index 9688920c..45623902 100644 --- a/src/modules/virtual/LogingDaily/modinfo.json +++ b/src/modules/virtual/LogingDaily/modinfo.json @@ -14,7 +14,7 @@ "int": 1, "logid": "t", "points": 365, - "test": 0 + "column": 0 } ], "about": { @@ -34,7 +34,7 @@ "int": "Интервал логирования в мнутах, частота проверки смены суток в минутах. Не рекомендуется менять", "logid": "ID накопительной величины которую будем логировать", "points": "Максимальное количество точек", - "test": "Режим тестирования - график будет обновляться не раз в сутки, а кадый заданный в int интервал" + "column": "Режим тестирования - график будет обновляться не раз в сутки, а кадый заданный в int интервал. Суточные столбики - 0, Минутные столбики - 1" } }, "defActive": true,