mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-27 06:32:19 +03:00
добавляем функцию отправки сообщений в телеграм для дневного графика
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<IoTValue> ¶m)
|
||||
{
|
||||
if (param.size() == 1)
|
||||
{
|
||||
IoTValue execute(String command, std::vector<IoTValue> ¶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;
|
||||
}
|
||||
}
|
||||
@@ -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<IoTItem *>::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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user