From a1d053c37d6b60f736128e6988099f23c7349fe0 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Sun, 3 Sep 2023 11:42:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=20=D1=8F=D0=B4=D1=80=D0=BE=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BA=D1=86=D0=B8=D1=8E=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=B4=D1=80=D1=83=D0=B3=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=9D=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20=D1=8D=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=BF=D0=BE=D0=BB=D0=B5?= =?UTF-8?q?=20trackingID=20=D1=81=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=98=D0=94=20=D0=BE=D1=82=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=D0=B5=20=D1=82=D1=80=D0=B5=D0=B1=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20-=20=D1=82=D0=B0=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BB=D0=B5=D0=B4=D1=8F=D1=89=D0=B8=D0=B5=20=D1=8D?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=BD=D1=8B=20=D1=80=D0=B0=D1=81=D0=BF=D0=BE=D0=BB=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=D1=82=D1=8C=D1=81=D1=8F=20=D0=BD=D0=B8=D0=B6=D0=B5?= =?UTF-8?q?=20=D0=BE=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTItem.h | 5 +++++ src/EventsAndOrders.cpp | 19 ++++++++++++------- src/classes/IoTItem.cpp | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) 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) {}