Добавляем в ядро реакцию одного элемента от другого

Необходимо просто добавить в конфигурацию элемента поле trackingID с указанием ИД отслеживаемого элемента
важное требование - такие следящие элементы должны располагаться ниже отслеживаемых
This commit is contained in:
2023-09-03 11:42:21 +03:00
parent 646128b999
commit a1d053c37d
3 changed files with 31 additions and 7 deletions

View File

@@ -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); // поиск экземпляра элемента модуля по имени

View File

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

View File

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