diff --git a/compilerProfile.json b/compilerProfile.json index b87fdac3..97fd71cd 100644 --- a/compilerProfile.json +++ b/compilerProfile.json @@ -144,6 +144,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/data_svelte/flashProfile.json b/data_svelte/flashProfile.json index 903e5c8f..79eca748 100644 --- a/data_svelte/flashProfile.json +++ b/data_svelte/flashProfile.json @@ -22,6 +22,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/data_svelte/items.json b/data_svelte/items.json index 49d64ed4..8ee594e1 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -60,7 +60,7 @@ "num": 4, "int": 1, "logid": "t", - "points": 365, + "points": 200, "telegram": 0, "test": 0, "btn-defvalue": 0, @@ -723,10 +723,11 @@ "widget": "rangeServo", "page": "servo", "descr": "угол", - "int": 1, "pin": 12, - "apin": -1, - "amap": "0, 4096, 0, 180", + "minPulseWidth": 544, + "maxPulseWidth": 2400, + "neutralPulseWidth": 1500, + "trackingID": "", "num": 47 }, { diff --git a/myProfile.json b/myProfile.json index b87fdac3..97fd71cd 100644 --- a/myProfile.json +++ b/myProfile.json @@ -144,6 +144,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/src/modules/exec/IoTServo/IoTServo.cpp b/src/modules/exec/IoTServo/IoTServo.cpp index 3cd672cf..d9e95974 100644 --- a/src/modules/exec/IoTServo/IoTServo.cpp +++ b/src/modules/exec/IoTServo/IoTServo.cpp @@ -9,37 +9,41 @@ extern IoTGpio IoTgpio; class IoTServo : public IoTItem { private: Servo servObj; - int _apin, _oldValue; - int _locmap1, _locmap2, _locmap3, _locmap4; + // int _apin, _oldValue; + int _oldValue; + // int _locmap1, _locmap2, _locmap3, _locmap4; public: IoTServo(String parameters): IoTItem(parameters) { - int pin; + int pin, minPulseWidth, maxPulseWidth, neutralPulseWidth; jsonRead(parameters, "pin", pin); - servObj.attach(pin); + jsonRead(parameters, "minPulseWidth", minPulseWidth); + jsonRead(parameters, "maxPulseWidth", maxPulseWidth); + jsonRead(parameters, "neutralPulseWidth", neutralPulseWidth); + servObj.attach(pin, minPulseWidth, maxPulseWidth, neutralPulseWidth); - jsonRead(parameters, "apin", _apin); - if (_apin >= 0) IoTgpio.pinMode(_apin, INPUT); + // jsonRead(parameters, "apin", _apin); + // if (_apin >= 0) IoTgpio.pinMode(_apin, INPUT); - String map; - jsonRead(parameters, F("amap"), map, false); - if (map != "") { - _locmap1 = selectFromMarkerToMarker(map, ",", 0).toInt(); - _locmap2 = selectFromMarkerToMarker(map, ",", 1).toInt(); - _locmap3 = selectFromMarkerToMarker(map, ",", 2).toInt(); - _locmap4 = selectFromMarkerToMarker(map, ",", 3).toInt(); - } + // String map; + // jsonRead(parameters, F("amap"), map, false); + // if (map != "") { + // _locmap1 = selectFromMarkerToMarker(map, ",", 0).toInt(); + // _locmap2 = selectFromMarkerToMarker(map, ",", 1).toInt(); + // _locmap3 = selectFromMarkerToMarker(map, ",", 2).toInt(); + // _locmap4 = selectFromMarkerToMarker(map, ",", 3).toInt(); + // } } - void doByInterval() { - if (_apin >= 0) { - value.valD = map(IoTgpio.analogRead(_apin), _locmap1, _locmap2, _locmap3, _locmap4); - if (abs(_oldValue - value.valD) > 5) { - _oldValue = value.valD; - servObj.write(_oldValue); - } - } - } + // void doByInterval() { + // if (_apin >= 0) { + // value.valD = map(IoTgpio.analogRead(_apin), _locmap1, _locmap2, _locmap3, _locmap4); + // if (abs(_oldValue - value.valD) > 5) { + // _oldValue = value.valD; + // servObj.write(_oldValue); + // } + // } + // } IoTValue execute(String command, std::vector ¶m) { if (command == "rotate") { diff --git a/src/modules/exec/IoTServo/modinfo.json b/src/modules/exec/IoTServo/modinfo.json index 73f8e61e..5557aeb4 100644 --- a/src/modules/exec/IoTServo/modinfo.json +++ b/src/modules/exec/IoTServo/modinfo.json @@ -10,10 +10,11 @@ "widget": "rangeServo", "page": "servo", "descr": "угол", - "int": 1, "pin": 12, - "apin": -1, - "amap": "0, 4096, 0, 180" + "minPulseWidth": 544, + "maxPulseWidth": 2400, + "neutralPulseWidth": 1500, + "trackingID": "" } ], "about": { @@ -30,10 +31,11 @@ "title": "Сервопривод", "moduleDesc": "Предназначен для управления сервоприводом по уровню аналогово сигнала.", "propInfo": { - "int": "Пауза в секундах между опросами аналогового входа. Если 0, то читаем постоянно", "pin": "Пин, к которому подключен сервопривод", - "apin": "Номер GPIO аналогового пина. Если -1, то функция отключена.", - "amap": "Настройки преобразования значений аналога в нужный диапазон сервы, имеет смысл, если аналог включен." + "minPulseWidth": "Минимальная длина импульса", + "maxPulseWidth": "Максимальная длина импульса", + "neutralPulseWidth": "Нейтральная длина импульса", + "trackingID": "Идентификатор отслеживания значения другого элемента конфигурации, например, чтение аналога" }, "retInfo": "Содержит текущее значение поворота", "funcInfo": [ diff --git a/src/modules/sensors/RTC/RTC.cpp b/src/modules/sensors/RTC/RTC.cpp index b9994c5c..ea1dee8b 100644 --- a/src/modules/sensors/RTC/RTC.cpp +++ b/src/modules/sensors/RTC/RTC.cpp @@ -63,6 +63,42 @@ class RTC : public IoTItem { valTmp.valS = _watch->gettime(param[0].valS + " "); return valTmp; } + } else if (command == "setUnixTime") { + if (param.size() == 1) { + long ut = strtoul(param[0].valS.c_str(), nullptr, 10); + _watch->settimeUnix(ut); + return {}; + } + } else if (command == "setTime") { + if (param.size() == 6) { + _watch->settime(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD, param[5].valD); //сек, мин, час, день, мес, год + return {}; + } + } else if (command == "getTimeFloat") { + if (param.size() == 1) { + IoTValue valTmp; + _watch->gettime(); + valTmp.isDecimal = true; + String type = param[0].valS; + if (type == "H") { + valTmp.valD = static_cast(_watch->Hours); + } else if (type == "i") { + valTmp.valD = static_cast(_watch->minutes); + } else if (type == "s") { + valTmp.valD = static_cast(_watch->seconds); + } else if (type == "w") { + valTmp.valD = static_cast(_watch->weekday); + } else if (type == "d") { + valTmp.valD = static_cast(_watch->day); + } else if (type == "m") { + valTmp.valD = static_cast(_watch->month); + } else if (type == "Y") { + valTmp.valD = static_cast(_watch->year); + } else { + return {}; // Если переданный тип не поддерживается + } + return valTmp; + } } return {}; diff --git a/src/modules/sensors/RTC/modinfo.json b/src/modules/sensors/RTC/modinfo.json index 9e053b2d..f22250a1 100644 --- a/src/modules/sensors/RTC/modinfo.json +++ b/src/modules/sensors/RTC/modinfo.json @@ -54,6 +54,27 @@ "params": [ "Формат как у функции date() в PHP" ] + }, + { + "name": "setTime", + "descr": "Установить время через сценарии в формате сек, мин, час, день, мес, год.", + "params": [ + "сек", "мин", "час", "день", "мес", "год" + ] + }, + { + "name": "setUnixTime", + "descr": "Установить время через сценарий в формате юникстайм", + "params": [ + "rtc.setUnixTime('46489234') - параметр в виде строки" + ] + }, + { + "name": "getTimeFloat", + "descr": "Получить числовое значение времени по указанному формату", + "params": [ + "s - Вернуть секунды, i - Вернуть минуты, H - Вернуть часы в 24-часовом формате, d - Вернуть день месяца, w - Вернуть день недели, m - Вернуть месяц, Y - Вернуть год(4 знака)" + ] } ] }, diff --git a/src/modules/virtual/Loging/Loging.cpp b/src/modules/virtual/Loging/Loging.cpp index fa8d4c48..362fcdeb 100644 --- a/src/modules/virtual/Loging/Loging.cpp +++ b/src/modules/virtual/Loging/Loging.cpp @@ -16,7 +16,7 @@ class Loging : public IoTItem { int _wsNum = -1; int points; - //int keepdays; + // int keepdays; IoTItem *dateIoTItem; @@ -35,9 +35,9 @@ class Loging : public IoTItem { SerialPrint("E", F("Loging"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); // в минутах + jsonRead(parameters, F("int"), interval); // в минутах setInterval(interval * 60); - //jsonRead(parameters, F("keepdays"), keepdays, false); + // jsonRead(parameters, F("keepdays"), keepdays, false); // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); @@ -276,7 +276,7 @@ class Loging : public IoTItem { void deleteLastFile() { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 20.00) { + if (tmp.freePer <= 50.00) { String dir = "/lg/" + id; filesList = getFilesList(dir); int i = 0; @@ -300,9 +300,7 @@ class Loging : public IoTItem { _wsNum = wsNum; } - String getValue() { - return ""; - } + String getValue() { return ""; } // void loop() { // if (enableDoByInt) { @@ -331,14 +329,10 @@ class Loging : public IoTItem { } // просто максимальное количество точек - int calculateMaxCount() { - return 86400; - } + int calculateMaxCount() { return 86400; } // путь вида: /lg/log/1231231.txt - unsigned long getFileUnixLocalTime(String path) { - return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); - } + 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)); @@ -400,6 +394,4 @@ class Date : public IoTItem { } }; -void *getAPI_Date(String param) { - return new Date(param); -} +void *getAPI_Date(String param) { return new Date(param); } diff --git a/src/modules/virtual/LogingDaily/LogingDaily.cpp b/src/modules/virtual/LogingDaily/LogingDaily.cpp index 32a0e68d..b6f5b1e0 100644 --- a/src/modules/virtual/LogingDaily/LogingDaily.cpp +++ b/src/modules/virtual/LogingDaily/LogingDaily.cpp @@ -36,12 +36,12 @@ class LogingDaily : public IoTItem { jsonRead(parameters, F("telegram"), telegram); jsonRead(parameters, F("descr"), descr); - if (points > 365) { - points = 365; - SerialPrint("E", F("LogingDaily"), "'" + id + "' user set more points than allowed, value reset to 365"); + if (points > 200) { + points = 200; + SerialPrint("E", F("LogingDaily"), "'" + id + "' user set more points than allowed, value reset to 200"); } long interval; - jsonRead(parameters, F("int"), interval); // в минутах + jsonRead(parameters, F("int"), interval); // в минутах setInterval(interval * 60); } @@ -222,9 +222,7 @@ class LogingDaily : public IoTItem { _wsNum = wsNum; } - String getValue() { - return ""; - } + String getValue() { return ""; } // void loop() { // if (enableDoByInt) { @@ -238,9 +236,7 @@ class LogingDaily : public IoTItem { // } // просто максимальное количество точек - int calculateMaxCount() { - return 86400; - } + int calculateMaxCount() { return 86400; } void onModuleOrder(String &key, String &value) { if (key == "defvalue") { diff --git a/src/modules/virtual/LogingDaily/modinfo.json b/src/modules/virtual/LogingDaily/modinfo.json index 39c82335..4f0a5f09 100644 --- a/src/modules/virtual/LogingDaily/modinfo.json +++ b/src/modules/virtual/LogingDaily/modinfo.json @@ -13,7 +13,7 @@ "num": 1, "int": 1, "logid": "t", - "points": 365, + "points": 200, "telegram": 0, "test": 0, "btn-defvalue": 0, diff --git a/src/modules/virtual/Math/Math.cpp b/src/modules/virtual/Math/Math.cpp new file mode 100644 index 00000000..7b14c396 --- /dev/null +++ b/src/modules/virtual/Math/Math.cpp @@ -0,0 +1,69 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include + +class IoTMath : public IoTItem { +private: + + time_t convertTime(float day, float month, float year, float hour, float minute) { + // Преобразование из float в int + int d = static_cast(day); + int m = static_cast(month); + int y = static_cast(year); + int h = static_cast(hour); + int min = static_cast(minute); + + if (d < 1 || d > 31 || m < 1 || m > 12 || y < 1900 || h < 0 || h > 23 || min < 0 || min > 59) { + SerialPrint("E", F("IoTMath"), F("Invalid date or time parameters!")); + return -1; + } + + // Структура для хранения даты и времени + struct tm t; + t.tm_year = y - 1900; + t.tm_mon = m - 1; + t.tm_mday = d; + t.tm_hour = h; + t.tm_min = min; + t.tm_sec = 0; + t.tm_isdst = -1; // Пусть система сама определяет DST + + return mktime(&t); + } + +public: + IoTMath(String parameters) : IoTItem(parameters) {} + + IoTValue execute(String command, std::vector ¶m) { + if(command == "map" && param.size() == 5) { + IoTValue valTmp; + valTmp.isDecimal = true; + valTmp.valD = map(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD); + //SerialPrint("i", F("IoTMath"), F("Mapping value done.")); + return valTmp; + } else if(command == "convertTime" && param.size() == 5) { + time_t unixTime = convertTime(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD); + + if (unixTime == -1) { + SerialPrint("E", F("IoTMath"), F("Failed to convert time.")); + return {}; + } + + IoTValue valTmp; + valTmp.isDecimal = true; + valTmp.valD = unixTime; + //SerialPrint("i", F("IoTMath"), F("Time conversion done.")); + return valTmp; + } + + SerialPrint("E", F("IoTMath"), F("Unknown command or wrong parameters.")); + return {}; + } +}; + +void *getAPI_IoTMath(String subtype, String param) { + if (subtype == F("IoTMath")) { + return new IoTMath(param); + } + return nullptr; +} diff --git a/src/modules/virtual/Math/modinfo.json b/src/modules/virtual/Math/modinfo.json new file mode 100644 index 00000000..6265e85b --- /dev/null +++ b/src/modules/virtual/Math/modinfo.json @@ -0,0 +1,62 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Math library", + "type": "Reading", + "subtype": "IoTMath", + "id": "math", + "widget": "anydataValue", + "page": "Математика", + "descr": "" + } + ], + "about": { + "authorName": "Berenbaum Maxim", + "authorContact": "https://t.me/Bermax_sys", + "authorGit": "https://github.com/xpohuk8", + "exampleURL": "https://iotmanager.org/wiki", + "specialThanks": "Ilya Belyakov", + "moduleName": "IoTMath", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Модуль Math", + "moduleDesc": "Модуль для расчета значений с использованием математических функций. Подходит для коррекции показаний датчиков.", + "propInfo": { + }, + "funcInfo": [ + { + "name": "map", + "descr": "Аналог функции map", + "params": [ + "Значение1", "Значение2", "Значение3", "Значение4" + ] + }, + { + "name": "convertTime", + "descr": "Перевести время из формата d-m-Y H:i:s например, 13-08-2023 16:24:00 в юникс-время ", + "params": [ + "tm.convertTime(13, 08, 2023, 16, 24); - передаем пять целых чисел. секунды подставятся в ноль" + ] + } + ] + }, + "defActive": true, + "usedLibs": { + "esp32_4mb": [], + "esp32_4mb3f": [], + "esp32cam_4mb": [], + "esp32s2_4mb": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [], + "esp8266_2mb": [], + "esp8266_2mb_ota": [] + } +}