diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index 772a3052..869a56f1 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -60,6 +60,7 @@ class IoTItem { virtual void onMqttRecive(String& topic, String& msg); virtual void onMqttWsAppConnectEvent(); virtual void onModuleOrder(String& key, String& value); + virtual void onTrackingValue(IoTItem* item); // момент, когда ядро заметило изменение отслеживаемого значения // делаем доступным модулям отправку сообщений в телеграм virtual void sendTelegramMsg(bool often, String msg); @@ -71,6 +72,8 @@ class IoTItem { virtual void clearHistory(); virtual void setTodayDate(); + bool isTracking(IoTItem* item); // проверка на отслеживание + protected: bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash String _subtype = ""; @@ -90,6 +93,8 @@ class IoTItem { int _numDigits = 1; // количество целых значений, не значимые позиции заменяются нулем в строковом формате bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира + + IoTValue* _trackingValue = nullptr; // указатель на значение родительского элемента изменение которого отслеживается }; IoTItem* findIoTItem(const String& name); // поиск экземпляра элемента модуля по имени diff --git a/src/EventsAndOrders.cpp b/src/EventsAndOrders.cpp index 20416471..4099d1a2 100644 --- a/src/EventsAndOrders.cpp +++ b/src/EventsAndOrders.cpp @@ -51,16 +51,21 @@ void handleEvent() { if (eventBuf.length()) { String event = selectToMarker(eventBuf, ","); SerialPrint("i", F("EVENT"), event); - String enentIdName = selectToMarker(event, " "); + String eventIdName = selectToMarker(event, " "); + IoTItem* eventIoTItem = findIoTItem(eventIdName); + + if (eventIoTItem) + // распространяем событие через хуки + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { + (*it)->onRegEvent(eventIoTItem); // прямой хук - // распространяем событие через хуки - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - (*it)->onRegEvent(findIoTItem(enentIdName)); - } + // вызов хука при условии отслеживания изменения + if ((*it)->isTracking(eventIoTItem)) (*it)->onTrackingValue(eventIoTItem); + } //здесь нужно пропускать данное событие через условия сценариев - //и если оно есть в условии сценария и совподает - iotScen.exec(enentIdName); + //и если оно есть в условии сценария и совпадает + iotScen.exec(eventIdName); eventBuf = deleteBeforeDelimiter(eventBuf, ","); } diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 28557848..4a4b5988 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -36,6 +36,13 @@ IoTItem::IoTItem(const String& parameters) { jsonRead(parameters, F("needSave"), _needSave, false); if (_needSave && jsonRead(valuesFlashJson, _id, valAsStr, false)) // пробуем достать из сохранения значение элемента, если указано, что нужно сохранять setValue(valAsStr, false); + + // проверяем нужно ли отслеживать значение другого элемента + String trackingID = ""; + IoTItem* item = nullptr; + if (jsonRead(parameters, F("trackingID"), trackingID, false) && (item = findIoTItem(trackingID)) != nullptr) { + _trackingValue = &(item->value); + } } void IoTItem::loop() { @@ -181,6 +188,13 @@ void IoTItem::onRegEvent(IoTItem* item) {} void IoTItem::onMqttRecive(String& topic, String& msg) {} void IoTItem::onMqttWsAppConnectEvent() {} void IoTItem::onModuleOrder(String& key, String& value) {} +void IoTItem::onTrackingValue(IoTItem* item) { + setValue(item->getValue(), false); +} + +bool IoTItem::isTracking(IoTItem* item) { + return &(item->value) == _trackingValue; +} // делаем доступным модулям отправку сообщений в телеграм void IoTItem::sendTelegramMsg(bool often, String msg) {}