diff --git a/data_svelte/items.json b/data_svelte/items.json index 78b0e596..4a94fc4d 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -613,33 +613,7 @@ }, { "global": 0, - "name": "42. MySensorsGate", - "type": "Reading", - "subtype": "MySensorsGate", - "id": "gt", - "widget": "nil", - "page": "", - "descr": "", - "num": 42 - }, - { - "global": 0, - "name": "43. MySensorsNode", - "type": "Reading", - "subtype": "MySensorsNode", - "id": "n", - "widget": "anydataTmp", - "page": "MySensors", - "descr": "Температура", - "orange": 60, - "red": 120, - "offline": 180, - "round": 1, - "num": 43 - }, - { - "global": 0, - "name": "44. Расширитель портов Pcf8574", + "name": "42. Расширитель портов Pcf8574", "type": "Reading", "subtype": "Pcf8574", "id": "Pcf", @@ -649,29 +623,27 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 44 + "num": 42 }, { "global": 0, - "name": "45. PWM ESP32", + "name": "43. PWM ESP8266", "type": "Writing", - "subtype": "Pwm32", + "subtype": "Pwm8266", "id": "pwm", "widget": "range", "page": "Кнопки", "descr": "PWM", "int": 0, - "pin": 2, + "pin": 15, "freq": 5000, - "ledChannel": 2, - "PWM_resolution": 10, "val": 0, "apin": -1, - "num": 45 + "num": 43 }, { "global": 0, - "name": "46. Телеграм-Лайт", + "name": "44. Телеграм-Лайт", "type": "Writing", "subtype": "TelegramLT", "id": "tg", @@ -680,14 +652,14 @@ "descr": "", "token": "", "chatID": "", - "num": 46 + "num": 44 }, { "header": "Экраны" }, { "global": 0, - "name": "47. LCD экран 2004", + "name": "45. LCD экран 2004", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -699,10 +671,10 @@ "size": "20,4", "coord": "0,0", "id2show": "id датчика", - "num": 47 + "num": 45 }, { - "name": "48. LCD экран 1602", + "name": "46. LCD экран 1602", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -714,6 +686,6 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика", - "num": 48 + "num": 46 } ] \ No newline at end of file diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index e016f220..2086840c 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -56,7 +56,10 @@ class IoTItem { virtual void onMqttRecive(String& topic, String& msg); virtual void onMqttWsAppConnectEvent(); - //методы для графиков (будет упрощено) + // делаем доступным модулям отправку сообщений в телеграм + virtual void sendTelegramMsg(bool often, String msg); + + // методы для графиков (будет упрощено) virtual void publishValue(); virtual void clearValue(); virtual void setPublishDestination(int type, int wsNum = -1); diff --git a/myProfile.json b/myProfile.json index 571c36dc..1c55765c 100644 --- a/myProfile.json +++ b/myProfile.json @@ -24,7 +24,7 @@ }, "projectProp": { "platformio": { - "default_envs": "esp32_4mb", + "default_envs": "esp8266_4mb", "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota" } }, diff --git a/platformio.ini b/platformio.ini index 4399047e..117bb9e5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,5 @@ [platformio] -default_envs = esp32_4mb +default_envs = esp8266_4mb data_dir = data_svelte [common_env_data] diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index f478291b..bb57d4f0 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -79,14 +79,14 @@ void IoTItem::setValue(const IoTValue& Value, bool genEvent) { } } -//метод отправки из модуля дополнительных json полей виджета в приложение и веб интерфейс, -//необходимый для изменения виджетов "на лету" из модуля +// метод отправки из модуля дополнительных json полей виджета в приложение и веб интерфейс, +// необходимый для изменения виджетов "на лету" из модуля void IoTItem::sendSubWidgetsValues(String& id, String& json) { publishJsonMqtt(id, json); publishJsonWs(id, json); } -//когда событие случилось +// когда событие случилось void IoTItem::regEvent(const String& value, const String& consoleInfo, bool error, bool genEvent) { if (_needSave) { jsonWriteStr_(valuesFlashJson, _id, value); @@ -104,7 +104,7 @@ void IoTItem::regEvent(const String& value, const String& consoleInfo, bool erro (*it)->onRegEvent(this); } - //отправка события другим устройствам в сети если не было ошибки============================== + // отправка события другим устройствам в сети если не было ошибки if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) { String json = "{}"; jsonWriteStr_(json, "id", _id); @@ -179,7 +179,10 @@ void IoTItem::onRegEvent(IoTItem* item) {} void IoTItem::onMqttRecive(String& topic, String& msg) {} void IoTItem::onMqttWsAppConnectEvent() {} -//методы для графиков (будет упрощено) +// делаем доступным модулям отправку сообщений в телеграм +void IoTItem::sendTelegramMsg(bool often, String msg) {} + +// методы для графиков (будет упрощено) void IoTItem::publishValue() {} void IoTItem::clearValue() {} void IoTItem::setPublishDestination(int publishType, int wsNum){}; @@ -198,7 +201,7 @@ IoTGpio* IoTItem::getGpioDriver() { return nullptr; } -//сетевое общение==================================================================================================================================== +// сетевое общение==================================================================================================================================== // externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) { // prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек diff --git a/src/modules/API.cpp b/src/modules/API.cpp index e088171b..12df2c22 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -24,9 +24,8 @@ void* getAPI_IoTServo(String subtype, String params); void* getAPI_Mcp23017(String subtype, String params); void* getAPI_Mp3(String subtype, String params); void* getAPI_Multitouch(String subtype, String params); -void* getAPI_MySensorsGate(String subtype, String params); void* getAPI_Pcf8574(String subtype, String params); -void* getAPI_Pwm32(String subtype, String params); +void* getAPI_Pwm8266(String subtype, String params); void* getAPI_TelegramLT(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); @@ -56,9 +55,8 @@ 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_Multitouch(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_MySensorsGate(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) return tmpAPI; +if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; return nullptr; diff --git a/src/modules/exec/TelegramLT/TelegramLT.cpp b/src/modules/exec/TelegramLT/TelegramLT.cpp index 3c177e7a..2fb3c14a 100644 --- a/src/modules/exec/TelegramLT/TelegramLT.cpp +++ b/src/modules/exec/TelegramLT/TelegramLT.cpp @@ -1,24 +1,19 @@ #include "Global.h" #include "classes/IoTItem.h" -class TelegramLT : public IoTItem -{ - -public: +class TelegramLT : public IoTItem { + public: String _prevMsg = ""; String _token; String _chatID; - TelegramLT(String parameters) : IoTItem(parameters) - { + TelegramLT(String parameters) : IoTItem(parameters) { jsonRead(parameters, "token", _token); jsonRead(parameters, "chatID", _chatID); } - void sendTelegramMsg(bool often, String msg) - { - if (WiFi.status() == WL_CONNECTED && (often || !often && _prevMsg != msg)) - { + void sendTelegramMsg(bool often, String msg) { + if (WiFi.status() == WL_CONNECTED && (often || !often && _prevMsg != msg)) { WiFiClient client; HTTPClient http; http.begin(client, "http://live-control.com/iotm/telegram.php"); @@ -29,14 +24,11 @@ public: SerialPrint("<-", F("Telegram"), "chat ID: " + _chatID + ", msg: " + msg); SerialPrint("->", F("Telegram"), "chat ID: " + _chatID + ", server: " + httpResponseCode); - if (!strstr(payload.c_str(), "{\"ok\":true")) - { + if (!strstr(payload.c_str(), "{\"ok\":true")) { value.valD = 0; Serial.printf("Telegram error, msg from server: %s\n", payload.c_str()); regEvent(value.valD, payload); - } - else - { + } else { value.valD = 1; regEvent(value.valD, payload); } @@ -45,27 +37,20 @@ public: } } - IoTValue execute(String command, std::vector ¶m) - { - if (param.size() == 1) - { + IoTValue execute(String command, std::vector ¶m) { + if (param.size() == 1) { String strTmp; if (param[0].isDecimal && param[0].valS == "") strTmp = param[0].valD; else strTmp = param[0].valS; - if (command == "sendMsg") - { - if (param.size()) - { + if (command == "sendMsg") { + if (param.size()) { sendTelegramMsg(false, strTmp); } - } - else if (command == "sendOftenMsg") - { - if (param.size()) - { + } else if (command == "sendOftenMsg") { + if (param.size()) { sendTelegramMsg(true, strTmp); } } @@ -76,14 +61,10 @@ public: ~TelegramLT(){}; }; -void *getAPI_TelegramLT(String subtype, String param) -{ - if (subtype == F("TelegramLT")) - { +void *getAPI_TelegramLT(String subtype, String param) { + if (subtype == F("TelegramLT")) { return new TelegramLT(param); - } - else - { + } else { return nullptr; } } \ No newline at end of file diff --git a/src/modules/virtual/LogingDaily/LogingDaily.cpp b/src/modules/virtual/LogingDaily/LogingDaily.cpp index ee849651..52111c98 100644 --- a/src/modules/virtual/LogingDaily/LogingDaily.cpp +++ b/src/modules/virtual/LogingDaily/LogingDaily.cpp @@ -9,6 +9,8 @@ class LogingDaily : public IoTItem { String id; String filesList = ""; + String descr; + int _publishType = -2; int _wsNum = -1; @@ -16,6 +18,8 @@ class LogingDaily : public IoTItem { int testMode; + int telegram; + IoTItem *dateIoTItem; String prevDate = ""; @@ -29,13 +33,15 @@ class LogingDaily : public IoTItem { jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); jsonRead(parameters, F("test"), testMode); + 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"); } jsonRead(parameters, F("int"), interval); - interval = interval * 1000 * 60; //приводим к милисекундам + interval = interval * 1000 * 60; // приводим к милисекундам } void doByInterval() { @@ -45,7 +51,7 @@ class LogingDaily : public IoTItem { } void execute() { - //если объект логгирования не был создан + // если объект логгирования не был создан if (!isItemExist(logid)) { SerialPrint("E", F("LogingDaily"), "'" + id + "' LogingDaily object not exist, return"); return; @@ -53,51 +59,60 @@ class LogingDaily : public IoTItem { String value = getItemValue(logid); - //если значение логгирования пустое + // если значение логгирования пустое if (value == "") { SerialPrint("E", F("LogingDaily"), "'" + id + "' LogingDaily value is empty, return"); return; } - //если время не было получено из интернета + // если время не было получено из интернета if (!isTimeSynch) { - SerialPrint("E", F("LogingDaily"), "'" + id + "' Сant LogingDaily - time not synchronized, return"); + SerialPrint("E", F("LogingDaily"), "'" + id + "' Cant LogingDaily - time not synchronized, return"); return; } String logData; float currentValue = value.toFloat(); - //прочитаем предудущее значение + // прочитаем предудущее значение float prevValue = readDataDB(id + "-v").toFloat(); - //сохраним в базу данных текущее значение, понадобится в следующие сутки + // сохраним в базу данных текущее значение, понадобится в следующие сутки saveDataDB(id + "-v", value); float difference = currentValue - prevValue; + if (telegram == 1) { + String msg = descr + " " + String(currentValue) + " " + String(difference); + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { + if ((*it)->getSubtype() == "TelegramLT" || "Telegram") { + (*it)->sendTelegramMsg(false, msg); + } + } + } + jsonWriteInt(logData, "x", unixTime - 120); jsonWriteFloat(logData, "y1", difference); - //прочитаем путь к файлу последнего сохранения + // прочитаем путь к файлу последнего сохранения String filePath = readDataDB(id); - //если данные о файле отсутствуют, создадим новый + // если данные о файле отсутствуют, создадим новый if (filePath == "failed" || filePath == "") { SerialPrint("E", F("LogingDaily"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData); return; } - //считаем количество строк и определяем размер файла + // считаем количество строк и определяем размер файла size_t size = 0; int lines = countJsonObj(filePath, size); SerialPrint("i", F("LogingDaily"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); - //если количество строк до заданной величины и дата не менялась + // если количество строк до заданной величины и дата не менялась if (lines <= points && !hasDayChanged()) { - //просто добавим в существующий файл новые данные + // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData); - //если больше или поменялась дата то создадим следующий файл + // если больше или поменялась дата то создадим следующий файл } else { createNewFileWithData(logData); } @@ -106,20 +121,20 @@ class LogingDaily : public IoTItem { void createNewFileWithData(String &logData) { logData = logData + ","; - String path = "/lgd/" + id + "/" + id + ".txt"; //создадим путь вида /lgd/id/id.txt - //создадим пустой файл - if (writeEmptyFile(path) != "sucсess") { + String path = "/lgd/" + id + "/" + id + ".txt"; // создадим путь вида /lgd/id/id.txt + // создадим пустой файл + if (writeEmptyFile(path) != "success") { SerialPrint("E", F("LogingDaily"), "'" + id + "' file writing error, return"); return; } - //запишем в него данные - if (addFile(path, logData) != "sucсess") { + // запишем в него данные + if (addFile(path, logData) != "success") { SerialPrint("E", F("LogingDaily"), "'" + id + "' data writing error, return"); return; } - //запишем путь к нему в базу данных - if (saveDataDB(id, path) != "sucсess") { + // запишем путь к нему в базу данных + if (saveDataDB(id, path) != "success") { SerialPrint("E", F("LogingDaily"), "'" + id + "' db file writing error, return"); return; } @@ -128,7 +143,7 @@ class LogingDaily : public IoTItem { void addNewDataToExistingFile(String &path, String &logData) { logData = logData + ","; - if (addFile(path, logData) != "sucсess") { + if (addFile(path, logData) != "success") { SerialPrint("i", F("LogingDaily"), "'" + id + "' file writing error, return"); return; }; @@ -221,7 +236,7 @@ class LogingDaily : public IoTItem { } } - //просто максимальное количество точек + // просто максимальное количество точек int calculateMaxCount() { return 86400; } diff --git a/src/modules/virtual/LogingDaily/modinfo.json b/src/modules/virtual/LogingDaily/modinfo.json index 45623902..c34cdc81 100644 --- a/src/modules/virtual/LogingDaily/modinfo.json +++ b/src/modules/virtual/LogingDaily/modinfo.json @@ -14,7 +14,8 @@ "int": 1, "logid": "t", "points": 365, - "column": 0 + "telegram": 0, + "test": 0 } ], "about": { @@ -23,7 +24,7 @@ "authorGit": "https://github.com/DmitryBorisenko33", "specialThanks": "@itsid1 @Valiuhaaa Serg", "moduleName": "LogingDaily", - "moduleVersion": "3.0", + "moduleVersion": "3.1", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 @@ -34,7 +35,8 @@ "int": "Интервал логирования в мнутах, частота проверки смены суток в минутах. Не рекомендуется менять", "logid": "ID накопительной величины которую будем логировать", "points": "Максимальное количество точек", - "column": "Режим тестирования - график будет обновляться не раз в сутки, а кадый заданный в int интервал. Суточные столбики - 0, Минутные столбики - 1" + "telegram": "График будет отправлять в телеграм репорт с расходами каждый день", + "test": "Параметр необходим для разработчиков. Режим тестирования. График будет обновляться не раз в сутки, а кадый заданный в int интервал." } }, "defActive": true,