mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Добавляем в ядро реакцию одного элемента от другого
Необходимо просто добавить в конфигурацию элемента поле trackingID с указанием ИД отслеживаемого элемента важное требование - такие следящие элементы должны располагаться ниже отслеживаемых
This commit is contained in:
@@ -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); // поиск экземпляра элемента модуля по имени
|
||||
|
||||
@@ -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<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||
(*it)->onRegEvent(eventIoTItem); // прямой хук
|
||||
|
||||
// распространяем событие через хуки
|
||||
for (std::list<IoTItem*>::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, ",");
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
Reference in New Issue
Block a user