mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-31 04:19:15 +03:00
Merge pull request #225 from biveraxe/ver4dev
Пересматриваем модель формирования сетевых событий и их
This commit is contained in:
@@ -17,7 +17,7 @@
|
|||||||
"descr": "Будильник",
|
"descr": "Будильник",
|
||||||
"int": 1,
|
"int": 1,
|
||||||
"val": "*/15 * * * * *",
|
"val": "*/15 * * * * *",
|
||||||
"formatNextAlarm": "dd.mm.yy hh:mm:ss",
|
"formatNextAlarm": "%H:%M:%S",
|
||||||
"needSave": 0,
|
"needSave": 0,
|
||||||
"num": 1
|
"num": 1
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class IoTItem {
|
|||||||
|
|
||||||
IoTValue value; // хранение основного значения, которое обновляется из сценария, execute(), loop() или doByInterval()
|
IoTValue value; // хранение основного значения, которое обновляется из сценария, execute(), loop() или doByInterval()
|
||||||
|
|
||||||
bool iAmDead = false; // признак необходимости удалить объект из базы
|
//bool iAmDead = false; // признак необходимости удалить объект из базы
|
||||||
bool iAmLocal = true; // признак того, что айтем был создан локально
|
bool iAmLocal = true; // признак того, что айтем был создан локально
|
||||||
|
|
||||||
bool enableDoByInt = true;
|
bool enableDoByInt = true;
|
||||||
@@ -78,10 +78,12 @@ String getItemValue(const String& name); // поис
|
|||||||
bool isItemExist(const String& name); // существует ли айтем
|
bool isItemExist(const String& name); // существует ли айтем
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
||||||
|
|
||||||
class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval);
|
||||||
|
|
||||||
public:
|
// class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
||||||
externalVariable(const String& parameters);
|
|
||||||
~externalVariable();
|
// public:
|
||||||
void doByInterval(); // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
// externalVariable(const String& parameters);
|
||||||
};
|
// ~externalVariable();
|
||||||
|
// void doByInterval(); // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
||||||
|
// };
|
||||||
@@ -29,6 +29,10 @@
|
|||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"Виртуальные элементы": [
|
"Виртуальные элементы": [
|
||||||
|
{
|
||||||
|
"path": "src/modules/virtual/Cron",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/virtual/Loging",
|
"path": "src/modules/virtual/Loging",
|
||||||
"active": true
|
"active": true
|
||||||
|
|||||||
@@ -89,8 +89,7 @@ void setup() {
|
|||||||
iotScen.loadScenario("/scenario.txt");
|
iotScen.loadScenario("/scenario.txt");
|
||||||
|
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
|
createItemFromNet("onStart", "1", 1);
|
||||||
generateEvent("onStart", "");
|
|
||||||
|
|
||||||
stInit();
|
stInit();
|
||||||
|
|
||||||
@@ -151,7 +150,9 @@ void loop() {
|
|||||||
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
||||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
(*it)->loop();
|
(*it)->loop();
|
||||||
if ((*it)->iAmDead) {
|
|
||||||
|
//if ((*it)->iAmDead) {
|
||||||
|
if (!((*it)->iAmLocal) && (*it)->getIntFromNet() == -1) {
|
||||||
delete *it;
|
delete *it;
|
||||||
IoTItems.erase(it);
|
IoTItems.erase(it);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -169,22 +169,26 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
|||||||
String valAsStr;
|
String valAsStr;
|
||||||
if (!jsonRead(payloadStr, F("val"), valAsStr, false)) valAsStr = payloadStr;
|
if (!jsonRead(payloadStr, F("val"), valAsStr, false)) valAsStr = payloadStr;
|
||||||
|
|
||||||
IoTItem* itemExist = findIoTItem(id);
|
|
||||||
if (itemExist) {
|
|
||||||
unsigned long interval = 0;
|
unsigned long interval = 0;
|
||||||
jsonRead(payloadStr, F("int"), interval);
|
jsonRead(payloadStr, F("int"), interval);
|
||||||
|
IoTItem* itemExist = findIoTItem(id);
|
||||||
|
if (itemExist) {
|
||||||
itemExist->setInterval(interval); // устанавливаем такой же интервал как на источнике события
|
itemExist->setInterval(interval); // устанавливаем такой же интервал как на источнике события
|
||||||
itemExist->setValue(valAsStr, false); // только регистрируем изменения в интерфейсе без создания цикла сетевых событий
|
itemExist->setValue(valAsStr, false); // только регистрируем изменения в интерфейсе без создания цикла сетевых событий
|
||||||
if (interval) itemExist->setIntFromNet(interval+5); // если пришедший интервал =0, значит не нужно контролировать доверие, иначе даем фору в 5 сек
|
if (interval) itemExist->setIntFromNet(interval+5); // если пришедший интервал =0, значит не нужно контролировать доверие, иначе даем фору в 5 сек
|
||||||
|
|
||||||
// запустим проверку его в сценариях
|
|
||||||
generateEvent(id, valAsStr);
|
|
||||||
SerialPrint("i", F("=>MQTT"), "Received event from other device: '" + devId + "' " + id + " " + valAsStr);
|
|
||||||
} else {
|
} else {
|
||||||
// зафиксируем данные в базе, если локально элемент отсутствует
|
// зафиксируем данные в базе, если локально элемент отсутствует
|
||||||
//itemExist = (IoTItem*)new externalVariable(payloadStr);
|
//itemExist = (IoTItem*)new externalVariable(payloadStr);
|
||||||
//IoTItems.push_back(itemExist);
|
//IoTItems.push_back(itemExist);
|
||||||
|
|
||||||
|
itemExist = new IoTItem(payloadStr);
|
||||||
|
itemExist->setIntFromNet(interval+5); // устанавливаем время жизни 3 сек
|
||||||
|
itemExist->iAmLocal = false;
|
||||||
|
IoTItems.push_back(itemExist);
|
||||||
}
|
}
|
||||||
|
// запустим проверку его в сценариях
|
||||||
|
generateEvent(id, valAsStr);
|
||||||
|
SerialPrint("i", F("=>MQTT"), "Received event from other device: '" + devId + "' " + id + " " + valAsStr);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,8 +113,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
|||||||
configure("/config.json");
|
configure("/config.json");
|
||||||
iotScen.loadScenario("/scenario.txt");
|
iotScen.loadScenario("/scenario.txt");
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
|
createItemFromNet("onStart", "1", 1);
|
||||||
generateEvent("onStart", "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------//
|
//----------------------------------------------------------------------//
|
||||||
|
|||||||
@@ -146,9 +146,12 @@ void IoTItem::setIntFromNet(int interval) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IoTItem::checkIntFromNet() {
|
void IoTItem::checkIntFromNet() {
|
||||||
|
// проверяем элемент на доверие данным.
|
||||||
if (_intFromNet >= 0) {
|
if (_intFromNet >= 0) {
|
||||||
if (_intFromNet == 0) {
|
// если время жизни истекло, то удаляем элемент
|
||||||
SerialPrint("E", "SYS", "The new data did not come from the network. The level of trust is low.", _id);
|
// если это было уведомление не об ошибке или начале работы, то сообщаем, что сетевое событие давно не приходило
|
||||||
|
if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1) {
|
||||||
|
SerialPrint("E", _id, "The new data did not come from the network. The level of trust is low.", _id);
|
||||||
}
|
}
|
||||||
_intFromNet--;
|
_intFromNet--;
|
||||||
}
|
}
|
||||||
@@ -178,19 +181,19 @@ IoTGpio* IoTItem::getGpioDriver() {
|
|||||||
|
|
||||||
//сетевое общение====================================================================================================================================
|
//сетевое общение====================================================================================================================================
|
||||||
|
|
||||||
externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
// externalVariable::externalVariable(const 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() {
|
||||||
Serial.printf("Call from ~externalVariable: Im dead\n");
|
// Serial.printf("Call from ~externalVariable: Im dead\n");
|
||||||
}
|
// }
|
||||||
|
|
||||||
void externalVariable::doByInterval() { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
// void externalVariable::doByInterval() { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
||||||
iAmDead = true;
|
// iAmDead = true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
//=========================================================================================================================================
|
//=========================================================================================================================================
|
||||||
|
|
||||||
@@ -222,6 +225,23 @@ bool isItemExist(const String& name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IoTItem* createItemFromNet(const String& itemId, const String& value, int interval) {
|
||||||
|
String jsonStr = "{\"id\":\"";
|
||||||
|
jsonStr += itemId;
|
||||||
|
jsonStr += "\",\"val\":\"";
|
||||||
|
jsonStr += value;
|
||||||
|
jsonStr += "\",\"int\":";
|
||||||
|
jsonStr += interval;
|
||||||
|
jsonStr += "}";
|
||||||
|
|
||||||
|
IoTItem *tmpp = new IoTItem(jsonStr);
|
||||||
|
tmpp->setIntFromNet(interval); // устанавливаем время жизни 3 сек
|
||||||
|
tmpp->iAmLocal = false;
|
||||||
|
IoTItems.push_back(tmpp);
|
||||||
|
generateEvent(itemId, "1");
|
||||||
|
return tmpp;
|
||||||
|
}
|
||||||
|
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
||||||
|
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
||||||
|
|||||||
@@ -78,15 +78,15 @@ class StringExprAST : public ExprAST {
|
|||||||
class VariableExprAST : public ExprAST {
|
class VariableExprAST : public ExprAST {
|
||||||
String Name;
|
String Name;
|
||||||
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
||||||
bool ItemIsLocal = false;
|
//bool ItemIsLocal = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VariableExprAST(const String &name, IoTItem *item) : Name(name), Item(item) {
|
VariableExprAST(const String &name, IoTItem *item) : Name(name), Item(item) {
|
||||||
if (item) ItemIsLocal = item->iAmLocal;
|
//if (item) ItemIsLocal = item->iAmLocal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setValue(IoTValue *val, bool generateEvent) {
|
int setValue(IoTValue *val, bool generateEvent) {
|
||||||
if (!ItemIsLocal) Item = findIoTItem(Name);
|
//if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||||
if (Item)
|
if (Item)
|
||||||
Item->setValue(*val, generateEvent);
|
Item->setValue(*val, generateEvent);
|
||||||
else
|
else
|
||||||
@@ -97,7 +97,7 @@ class VariableExprAST : public ExprAST {
|
|||||||
|
|
||||||
IoTValue *exec() {
|
IoTValue *exec() {
|
||||||
if (isIotScenException) return nullptr;
|
if (isIotScenException) return nullptr;
|
||||||
if (!ItemIsLocal) Item = findIoTItem(Name);
|
//if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||||
if (Item) {
|
if (Item) {
|
||||||
// if (Item->value.isDecimal)
|
// if (Item->value.isDecimal)
|
||||||
// Serial.printf("Call from VariableExprAST: %s = %f\n", Name.c_str(), Item->value.valD);
|
// Serial.printf("Call from VariableExprAST: %s = %f\n", Name.c_str(), Item->value.valD);
|
||||||
@@ -105,7 +105,7 @@ class VariableExprAST : public ExprAST {
|
|||||||
return &(Item->value);
|
return &(Item->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
SerialPrint("E", Name, "Элемент не найден или соединение потеряно", Name);
|
SerialPrint("E", Name, "The element is not found or the connection is lost", Name);
|
||||||
return nullptr; // Item не найден.
|
return nullptr; // Item не найден.
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -260,12 +260,12 @@ class CallExprAST : public ExprAST {
|
|||||||
std::vector<ExprAST *> Args;
|
std::vector<ExprAST *> Args;
|
||||||
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
IoTItem *Item; // ссылка на объект модуля (прямой доступ к идентификатору указанному в сценарии), если получилось найти модуль по ID
|
||||||
IoTValue ret; // хранение возвращаемого значения, т.к. возврат по ссылке осуществляется
|
IoTValue ret; // хранение возвращаемого значения, т.к. возврат по ссылке осуществляется
|
||||||
bool ItemIsLocal = false;
|
//bool ItemIsLocal = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CallExprAST(const String &callee, String &cmd, std::vector<ExprAST *> &args, IoTItem *item)
|
CallExprAST(const String &callee, String &cmd, std::vector<ExprAST *> &args, IoTItem *item)
|
||||||
: Callee(callee), Cmd(cmd), Args(args), Item(item) {
|
: Callee(callee), Cmd(cmd), Args(args), Item(item) {
|
||||||
if (item) ItemIsLocal = item->iAmLocal;
|
//if (item) ItemIsLocal = item->iAmLocal;
|
||||||
}
|
}
|
||||||
|
|
||||||
IoTValue *exec() {
|
IoTValue *exec() {
|
||||||
@@ -283,7 +283,7 @@ class CallExprAST : public ExprAST {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ItemIsLocal) Item = findIoTItem(Callee); // пробуем найти переменную если она не локальная (могла придти по сети в процессе)
|
//if (!ItemIsLocal) Item = findIoTItem(Callee); // пробуем найти переменную если она не локальная (могла придти по сети в процессе)
|
||||||
if (!Item) return nullptr; // ret = zeroIotVal; // если все же не пришла, то либо опечатка, либо уже стерлась - выходим
|
if (!Item) return nullptr; // ret = zeroIotVal; // если все же не пришла, то либо опечатка, либо уже стерлась - выходим
|
||||||
|
|
||||||
if (Cmd == "getIntFromNet") {
|
if (Cmd == "getIntFromNet") {
|
||||||
|
|||||||
@@ -23,11 +23,9 @@ void SerialPrint(const String& errorLevel, const String& module, const String& m
|
|||||||
cleanString(tosend);
|
cleanString(tosend);
|
||||||
// создаем событие об ошибке для возможной реакции в сценарии
|
// создаем событие об ошибке для возможной реакции в сценарии
|
||||||
if (itemId != "") {
|
if (itemId != "") {
|
||||||
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"" + itemId + "_onError\",\"val\":\"" + tosend + "\",\"int\":1}"));
|
createItemFromNet(itemId + "_onError", tosend, 2);
|
||||||
generateEvent(itemId + "_onError", "1");
|
|
||||||
} else {
|
} else {
|
||||||
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onError\",\"val\":\"" + module + " " + tosend + "\",\"int\":1}"));
|
createItemFromNet("onError", tosend, 2);
|
||||||
generateEvent("onError", "1");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user