0
Answered

IR.EVENT_TAG_CHANGE - как заблокировать повторное срабатывание

Oleg Starikov 5 years ago in Tips and Tricks updated by Vladimir Ovchinnikov (expert) 5 years ago 3

Добрый день!

на базе примера в указанной статье https://dev.iridi.com/CloudMQTT

делаю связку между драйвером HDL и MQTT

все работает, но смущает следующий момент в данной схеме:

- отправляю изменения в драйвер1

- слушатель видит это и делает запись в драйвер 2

- но т.к. драйвер2 тоже изменился, происходит запись в драйвер 1 

- после этого схема успокоилась

задача вроде для школьника, но не могу сообразить, что добавить в скрипт, что бы не допустить повторного изменения драйвера, от которого было инициировано изменение?


//начало скрипта

var driver1 = IR.GetDevice("MQTT-OPENHAB"); // name of a driver 1
var driver2 = IR.GetDevice("HDL"); // name of a driver 2

var gatemap = {

"2-2 левый реле:котельная" : "MQTT_Kotelnaya",
"MQTT_Kotelnaya" : "2-2 левый реле:котельная",

};

IR.AddListener(IR.EVENT_TAG_CHANGE, driver1, function(name, value) {


if (gatemap[name]) {
driver2.Set(gatemap[name], value);
IR.Log("изменение в драйвере 1"+name+" Значение"+value);
}
});
IR.AddListener(IR.EVENT_TAG_CHANGE, driver2, function(name, value) {

if (gatemap[name]) {
driver1.Set(gatemap[name], value);
IR.Log("изменения в драйвере 2"+name+" Значение"+value)
}
});

// конец скрипта

Заранее спасибо

+1
Under review

Добрый день.

Если в проекте нет глобального слушателя, то можете использовать IR.EVENT_GLOBAL_TAG_CHANGE. Он реагирует только на изменение и не сработает, если пришло значение, равное текущему.

Другой вариант: объявить переменную, в которую записывать значение перед отправкой во второй драйвер. Для второго драйвера через условный оператор проверяйте значение - если оно совпадает с тем, что в переменной, то не отправлять его.

Добрый день, Владимир!
все вроде бы получилось, работает

добавил в скрип, что то похожее, что Вы порекомендовали

if ((IR.GetVariable("Drivers.HDL.Tags."+name))!=(IR.GetVariable("Drivers.MQTT-OPENHAB.Tags."+gatemap[name])))
{
driver1.Set(gatemap[name], value);

}

можно закрывать мой вопрос

спасибо

Answered

Рады помочь.