Merge pull request #217 from biveraxe/ver4dev

Добавляем подсистему реакции на ошибки в сценарии
This commit is contained in:
2022-10-22 23:25:52 +03:00
committed by GitHub
9 changed files with 140 additions and 104 deletions

View File

@@ -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 { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время

View File

@@ -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 = "");

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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> &param) {
#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 {

View File

@@ -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",

View File

@@ -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();
//отправляем в график данные только когда выбран сегодняшний день //отправляем в график данные только когда выбран сегодняшний день

View File

@@ -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;

View File

@@ -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;
}