Здравствуйте!
Подскажите, пожалуйста, как побороть выполнение сценария Отключение электричества и других подобных при любой перезагрузке движка правил?
var timer_no_electricity = 10 * 1000;
var timer_no_electricity_id = null;
var electricity = 1;
defineRule("electricity_control", {
whenChanged: "milur105_255/Voltage",
then: function (newValue, devName, cellName) {
if (newValue) {
if (!(electricity)) {
var time = Time.toString(Time.now(), true);
Notify.sendEmail(EMAIL, "Включение электричества: " + time, "Включение электричества: " + time);
log("Включение электричества: " + time);
electricity = 1;
}
if (timer_no_electricity_id) {
clearTimeout(timer_no_electricity_id);
}
timer_no_electricity_id = setTimeout(function () {
var time = Time.toString(Time.now(), true);
Notify.sendEmail(EMAIL, "Отключение электричества: " + time, "Отключение электричества: " + time);
log("Отключение электричества: " + time);
electricity = null;
timer_no_electricity_id = null;
}, timer_no_electricity);
}
}
});
Сейчас при каждом изменении правил в логе и у меня на почте появляется сообщение Отключение электричества…
А мне нужно, чтобы это правило срабатывало только тогда, когда какое-то время действительно не приходят показания от счетчика.
Мне на первый взгляд кажется, что проблема в том, что движок правил после перезагрузки получает retained-сообщение о значении последнего напряжения, потом он еще долго получает оставшиеся retained-значения, прежде чем начинают поступать актуальные mqtt-сообщения с напряжением от счетчика. Попробуйте увеличить таймаут с десяти секунд до минуты, и посмотреть, будет ли отправляться сообщения.
В случае пропадания электропитания на контроллер просто перестают поступать сигналы. Нужно отслеживать задержку с момента поступления последних данных. Насколько я понимаю, данным модулем такую задачу не решить.
Смотрите, задвоение сообщений в логе происходит, похоже, действительно от работы двух экземпляров правил. Проверьте, что в движке правил правило только одно и перезапустите движок правил.
Сообщения о пропадении напряжения, похоже, генерировались старым экземпляром.
в вашем правиле сохраняете текущее время в переменной
создаете новое правило, которое выполняется по функции “текущее время - сохраненное время > таймаута”, в нем отсылаете уведомление + ставите флаг что уведомление отослано и больше отсылать не надо (флаг этот должен сбрасываться в вашем первом правиле)
Спасибо.
Переписал следующим образом, вроде бы срабатывает.
Думаю, на странице документации wb-rules стоит подобный пример отобразить, раз использованный там пример не работает.
var no_electricity_threshold = (3*1000);
var message_electricity_sent=1;
var message_no_electricity_sent=null;
var last_time_electricity_exist=Time.now();
defineRule("last_time_electricity_exist", {
whenChanged: "milur105_255/Voltage",
then: function (newValue, devName, cellName) {
if (newValue) {
last_time_electricity_exist=Time.now();
}
}
});
defineRule("electricity_control", {
asSoonAs: function () {
return (Time.now()-last_time_electricity_exist<no_electricity_threshold)
},
then: function() {
if (!message_electricity_sent) {
var time=Time.toString(Time.now(), true);
Notify.sendEmail(EMAIL, "Включение электричества: " + time, "Включение электричества: " + time);
log("Включение электричества: " + time);
message_electricity_sent=1;
message_no_electricity_sent=null;
}
}
});
defineRule("no_electricity_control", {
asSoonAs: function () {
return (Time.now()-last_time_electricity_exist>no_electricity_threshold)
},
then: function() {
if (!message_no_electricity_sent) {
var time=Time.toString(Time.now(), true);
Notify.sendEmail(EMAIL, "Отключение электричества: " + time, "Отключение электричества: " + time);
log("Отключение электричества: " + time);
message_electricity_sent=null;
message_no_electricity_sent=1;
}
}
});