mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 20:09:14 +03:00
Merge pull request #217 from biveraxe/ver4dev
Добавляем подсистему реакции на ошибки в сценарии
This commit is contained in:
@@ -16,8 +16,8 @@ class IoTItem {
|
|||||||
virtual void doByInterval();
|
virtual void doByInterval();
|
||||||
virtual IoTValue execute(String command, std::vector<IoTValue>& param);
|
virtual IoTValue execute(String command, std::vector<IoTValue>& param);
|
||||||
|
|
||||||
virtual void regEvent(String value, String consoleInfo);
|
virtual void regEvent(String value, String consoleInfo, bool error = false);
|
||||||
virtual void regEvent(float value, String consoleInfo);
|
virtual void regEvent(float value, String consoleInfo, bool error = false);
|
||||||
|
|
||||||
String getSubtype();
|
String getSubtype();
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ class IoTItem {
|
|||||||
IoTItem* findIoTItem(String name); // поиск экземпляра элемента модуля по имени
|
IoTItem* findIoTItem(String name); // поиск экземпляра элемента модуля по имени
|
||||||
String getItemValue(String name); // поиск плюс получение значения
|
String getItemValue(String name); // поиск плюс получение значения
|
||||||
bool isItemExist(String name); // существует ли айтем
|
bool isItemExist(String name); // существует ли айтем
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных занчений Items
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
||||||
|
|
||||||
class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "utils/TimeUtils.h"
|
#include "utils/TimeUtils.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
void SerialPrint(String errorLevel, String module, String msg);
|
void SerialPrint(String errorLevel, String module, String msg, String itemId = "");
|
||||||
@@ -32,7 +32,7 @@ size_t itemsCount2(String str, const String& separator);
|
|||||||
|
|
||||||
char* stringToChar(String& str);
|
char* stringToChar(String& str);
|
||||||
|
|
||||||
size_t itemsCount(String& str, const char* delim);
|
//size_t itemsCount(String& str, const char* delim);
|
||||||
|
|
||||||
boolean isDigitStr(const String& str);
|
boolean isDigitStr(const String& str);
|
||||||
|
|
||||||
@@ -41,3 +41,5 @@ boolean isDigitDotCommaStr(const String& str);
|
|||||||
String prettyBytes(size_t size);
|
String prettyBytes(size_t size);
|
||||||
|
|
||||||
String uint64ToString(uint64_t input, uint8_t base = 10);
|
String uint64ToString(uint64_t input, uint8_t base = 10);
|
||||||
|
|
||||||
|
String cleanString(String str);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ IoTItem::IoTItem(String parameters) {
|
|||||||
jsonRead(parameters, F("int"), _interval);
|
jsonRead(parameters, F("int"), _interval);
|
||||||
if (_interval == 0) enableDoByInt = false;
|
if (_interval == 0) enableDoByInt = false;
|
||||||
_interval = _interval * 1000;
|
_interval = _interval * 1000;
|
||||||
jsonRead(parameters, F("subtype"), _subtype);
|
jsonRead(parameters, F("subtype"), _subtype, false);
|
||||||
jsonRead(parameters, F("id"), _id);
|
jsonRead(parameters, F("id"), _id);
|
||||||
if (!jsonRead(parameters, F("multiply"), _multiply, false)) _multiply = 1;
|
if (!jsonRead(parameters, F("multiply"), _multiply, false)) _multiply = 1;
|
||||||
if (!jsonRead(parameters, F("plus"), _plus, false)) _plus = 0;
|
if (!jsonRead(parameters, F("plus"), _plus, false)) _plus = 0;
|
||||||
@@ -79,7 +79,7 @@ void IoTItem::setValue(IoTValue Value, bool generateEvent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//когда событие случилось
|
//когда событие случилось
|
||||||
void IoTItem::regEvent(String value, String consoleInfo = "") {
|
void IoTItem::regEvent(String value, String consoleInfo, bool error) {
|
||||||
if (_needSave) {
|
if (_needSave) {
|
||||||
jsonWriteStr_(valuesFlashJson, _id, value);
|
jsonWriteStr_(valuesFlashJson, _id, value);
|
||||||
needSaveValues = true;
|
needSaveValues = true;
|
||||||
@@ -95,8 +95,8 @@ void IoTItem::regEvent(String value, String consoleInfo = "") {
|
|||||||
// if (_global) {
|
// if (_global) {
|
||||||
// SerialPrint("i", F("=>ALLMQTT"), "Broadcast event: ");
|
// SerialPrint("i", F("=>ALLMQTT"), "Broadcast event: ");
|
||||||
// }
|
// }
|
||||||
//отправка события другим устройствам в сети==============================
|
//отправка события другим устройствам в сети если не было ошибки==============================
|
||||||
if (jsonReadBool(settingsFlashJson, "mqttin")) {
|
if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) {
|
||||||
String json = "{}";
|
String json = "{}";
|
||||||
jsonWriteStr_(json, "id", _id);
|
jsonWriteStr_(json, "id", _id);
|
||||||
jsonWriteStr_(json, "val", value);
|
jsonWriteStr_(json, "val", value);
|
||||||
@@ -120,21 +120,20 @@ String IoTItem::getRoundValue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoTItem::regEvent(float regvalue, String consoleInfo = "") {
|
void IoTItem::regEvent(float regvalue, String consoleInfo, bool error) {
|
||||||
value.valD = regvalue;
|
value.valD = regvalue;
|
||||||
|
|
||||||
if (_multiply) value.valD = value.valD * _multiply;
|
if (_multiply) value.valD = value.valD * _multiply;
|
||||||
if (_plus) value.valD = value.valD + _plus;
|
if (_plus) value.valD = value.valD + _plus;
|
||||||
if (_map1 != _map2) value.valD = map(value.valD, _map1, _map2, _map3, _map4);
|
if (_map1 != _map2) value.valD = map(value.valD, _map1, _map2, _map3, _map4);
|
||||||
|
|
||||||
regEvent(getRoundValue(), consoleInfo);
|
regEvent(getRoundValue(), consoleInfo, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoTItem::doByInterval() {}
|
void IoTItem::doByInterval() {}
|
||||||
|
|
||||||
IoTValue IoTItem::execute(String command, std::vector<IoTValue>& param) { return {}; }
|
IoTValue IoTItem::execute(String command, std::vector<IoTValue>& param) { return {}; }
|
||||||
|
|
||||||
//захрена эта хрень? - самому пригодилась сорян Илья
|
|
||||||
String IoTItem::getSubtype() {
|
String IoTItem::getSubtype() {
|
||||||
return _subtype;
|
return _subtype;
|
||||||
}
|
}
|
||||||
@@ -166,7 +165,7 @@ IoTGpio* IoTItem::getGpioDriver() {
|
|||||||
externalVariable::externalVariable(String parameters) : IoTItem(parameters) {
|
externalVariable::externalVariable(String parameters) : IoTItem(parameters) {
|
||||||
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
||||||
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
||||||
Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
//Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
externalVariable::~externalVariable() {
|
externalVariable::~externalVariable() {
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class VariableExprAST : public ExprAST {
|
|||||||
return &(Item->value);
|
return &(Item->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SerialPrint("E", Name, "Элемент не найден или соединение потеряно", Name);
|
||||||
return nullptr; // Item не найден.
|
return nullptr; // Item не найден.
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -145,14 +146,16 @@ class BinaryExprAST : public ExprAST {
|
|||||||
if (RHS == nullptr || LHS == nullptr) return nullptr;
|
if (RHS == nullptr || LHS == nullptr) return nullptr;
|
||||||
|
|
||||||
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
||||||
|
if (rhs == nullptr) return nullptr;
|
||||||
|
|
||||||
if (Op == '=' && LHS->setValue(rhs)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
|
if (Op == '=' && LHS->setValue(rhs)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
|
||||||
return rhs; // иначе возвращаем присвоенное значение справа
|
return rhs; // иначе возвращаем присвоенное значение справа
|
||||||
}
|
}
|
||||||
|
|
||||||
IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда
|
IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда
|
||||||
|
if (lhs == nullptr) return nullptr;
|
||||||
|
|
||||||
|
|
||||||
if (lhs != nullptr && rhs != nullptr) {
|
|
||||||
if (lhs->isDecimal && rhs->isDecimal) {
|
if (lhs->isDecimal && rhs->isDecimal) {
|
||||||
switch (Op) {
|
switch (Op) {
|
||||||
case '>':
|
case '>':
|
||||||
@@ -228,7 +231,7 @@ class BinaryExprAST : public ExprAST {
|
|||||||
}
|
}
|
||||||
return &val;
|
return &val;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return &val;
|
return &val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,6 +324,7 @@ enum SysOp {
|
|||||||
sysop_gethhmm,
|
sysop_gethhmm,
|
||||||
sysop_gethhmmss,
|
sysop_gethhmmss,
|
||||||
sysop_getTime,
|
sysop_getTime,
|
||||||
|
sysop_getRSSI,
|
||||||
sysop_getIP,
|
sysop_getIP,
|
||||||
sysop_mqttPub,
|
sysop_mqttPub,
|
||||||
sysop_getUptime
|
sysop_getUptime
|
||||||
@@ -404,6 +408,10 @@ IoTValue sysExecute(SysOp command, std::vector<IoTValue> ¶m) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case sysop_getRSSI:
|
||||||
|
value.valD = WiFi.RSSI();
|
||||||
|
value.isDecimal = true;
|
||||||
|
break;
|
||||||
case sysop_getIP:
|
case sysop_getIP:
|
||||||
value.valS = jsonReadStr(settingsFlashJson, F("ip"));
|
value.valS = jsonReadStr(settingsFlashJson, F("ip"));
|
||||||
value.isDecimal = false;
|
value.isDecimal = false;
|
||||||
@@ -460,6 +468,8 @@ class SysCallExprAST : public ExprAST {
|
|||||||
operation = sysop_getMonth;
|
operation = sysop_getMonth;
|
||||||
else if (Callee == "getDay")
|
else if (Callee == "getDay")
|
||||||
operation = sysop_getDay;
|
operation = sysop_getDay;
|
||||||
|
else if (Callee == "getRSSI")
|
||||||
|
operation = sysop_getRSSI;
|
||||||
else if (Callee == "getIP")
|
else if (Callee == "getIP")
|
||||||
operation = sysop_getIP;
|
operation = sysop_getIP;
|
||||||
else if (Callee == "mqttPub")
|
else if (Callee == "mqttPub")
|
||||||
@@ -537,7 +547,8 @@ class IfExprAST : public ExprAST {
|
|||||||
return nullptr; //&zeroIotVal;
|
return nullptr; //&zeroIotVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cond_ret->isDecimal && cond_ret->valD) {
|
// если число больше нуля или строка не равна пустой, то считаем условие выполненным
|
||||||
|
if (cond_ret->isDecimal && cond_ret->valD || !(cond_ret->isDecimal) && cond_ret->valS != "") {
|
||||||
if (Then == nullptr) return nullptr;
|
if (Then == nullptr) return nullptr;
|
||||||
res_ret = Then->exec();
|
res_ret = Then->exec();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -44,6 +44,11 @@
|
|||||||
"descr": "Погрузить ESP в глубокий сон. Вывод из сна с перезагрузкой. Для ESP8266 необходимо соединить gpio 16 и RST",
|
"descr": "Погрузить ESP в глубокий сон. Вывод из сна с перезагрузкой. Для ESP8266 необходимо соединить gpio 16 и RST",
|
||||||
"params": ["ЧислоСекунд"]
|
"params": ["ЧислоСекунд"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "getRSSI",
|
||||||
|
"descr": "Получить величину уровня принимаемого сигнала WI-FI.",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "getIP",
|
"name": "getIP",
|
||||||
"descr": "Получить строку IP ESP",
|
"descr": "Получить строку IP ESP",
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ class Loging : public IoTItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void regEvent(String value, String consoleInfo = "") {
|
void regEvent(String value, String consoleInfo, bool error = false) {
|
||||||
String userDate = getItemValue(id + "-date");
|
String userDate = getItemValue(id + "-date");
|
||||||
String currentDate = getTodayDateDotFormated();
|
String currentDate = getTodayDateDotFormated();
|
||||||
//отправляем в график данные только когда выбран сегодняшний день
|
//отправляем в график данные только когда выбран сегодняшний день
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
|
|
||||||
#include "utils/SerialPrint.h"
|
#include "utils/SerialPrint.h"
|
||||||
|
|
||||||
void SerialPrint(String errorLevel, String module, String msg) {
|
void SerialPrint(String errorLevel, String module, String msg, String itemId) {
|
||||||
String tosend;
|
String tosend = prettyMillis(millis());
|
||||||
|
|
||||||
tosend = prettyMillis(millis());
|
|
||||||
|
|
||||||
tosend = tosend + " [" + errorLevel + "] [" + module + "] " + msg;
|
tosend = tosend + " [" + errorLevel + "] [" + module + "] " + msg;
|
||||||
Serial.println(tosend);
|
Serial.println(tosend);
|
||||||
|
|
||||||
|
if (errorLevel == "E") {
|
||||||
|
msg = cleanString(msg);
|
||||||
|
// создаем событие об ошибке для возможной реакции в сценарии
|
||||||
|
if (itemId != "") {
|
||||||
|
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"" + itemId + "_onError\",\"val\":\"" + msg + "\",\"int\":1}"));
|
||||||
|
generateEvent(itemId + "_onError", "1");
|
||||||
|
} else {
|
||||||
|
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onError\",\"val\":\"" + module + " " + msg + "\",\"int\":1}"));
|
||||||
|
generateEvent("onError", "1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isNetworkActive()) {
|
if (isNetworkActive()) {
|
||||||
if (jsonReadInt(settingsFlashJson, F("log")) != 0) {
|
if (jsonReadInt(settingsFlashJson, F("log")) != 0) {
|
||||||
// String pl = "/log|" + tosend;
|
// String pl = "/log|" + tosend;
|
||||||
|
|||||||
@@ -128,18 +128,18 @@ size_t itemsCount2(String str, const String& separator) {
|
|||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t itemsCount(String& str, const char* delim) {
|
// size_t itemsCount(String& str, const char* delim) {
|
||||||
size_t cnt = 0;
|
// size_t cnt = 0;
|
||||||
char* cstr = new char[str.length() + 1];
|
// char* cstr = new char[str.length() + 1];
|
||||||
strcpy(cstr, str.c_str());
|
// strcpy(cstr, str.c_str());
|
||||||
char* token;
|
// char* token;
|
||||||
while ((token = strtok_r(cstr, delim, &cstr))) {
|
// while ((token = strtok_r(cstr, delim, &cstr))) {
|
||||||
cnt++;
|
// cnt++;
|
||||||
// printf("%s\n", token);
|
// // printf("%s\n", token);
|
||||||
}
|
// }
|
||||||
delete[] cstr;
|
// delete[] cstr;
|
||||||
return cnt;
|
// return cnt;
|
||||||
}
|
// }
|
||||||
|
|
||||||
char* stringToChar(String& str) {
|
char* stringToChar(String& str) {
|
||||||
char* mychar = new char[str.length() + 1];
|
char* mychar = new char[str.length() + 1];
|
||||||
@@ -198,3 +198,12 @@ String uint64ToString(uint64_t input, uint8_t base) {
|
|||||||
} while (input);
|
} while (input);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String cleanString(String str) {
|
||||||
|
String clearStr = "";
|
||||||
|
const String allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя.!-+ ";
|
||||||
|
for (size_t i = 0; i < str.length(); i++) {
|
||||||
|
if (allowedChars.indexOf(str.charAt(i)) != -1) clearStr += str.charAt(i);
|
||||||
|
}
|
||||||
|
return clearStr;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user