Вопрос по правилам: как не запускать правила при первом запуске


#22

Здравствуйте!
Подскажите, пожалуйста, как побороть выполнение сценария Отключение электричества и других подобных при любой перезагрузке движка правил?

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); 
}
  }
});

#23

cbv, добрый день!
А что вы хотите, чтобы при перезагрузке движка правил происходило?


#24

Сейчас при каждом изменении правил в логе и у меня на почте появляется сообщение Отключение электричества…
А мне нужно, чтобы это правило срабатывало только тогда, когда какое-то время действительно не приходят показания от счетчика.


#25

Мне на первый взгляд кажется, что проблема в том, что движок правил после перезагрузки получает retained-сообщение о значении последнего напряжения, потом он еще долго получает оставшиеся retained-значения, прежде чем начинают поступать актуальные mqtt-сообщения с напряжением от счетчика. Попробуйте увеличить таймаут с десяти секунд до минуты, и посмотреть, будет ли отправляться сообщения.


#26

Создал новый js
В котором разместил только такое правило

// время в течение которого ожидается отклик от электрического счетчика
var timer_no_electricity = 60000;
// айди таймера для электрического счетчика
var timer_no_electricity_id = null;
// наличие электричества
var electricity = 1;

defineRule("electricity_control", {
  whenChanged: "milur105_255/Voltage",
  then: function (newValue, devName, cellName) {
    if (newValue) {
      log("New value: " + 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); 
    }
   }
});

В 12:56:00 сохранил его.
Вот что в логе:
2019-05-07 12:55:58New value: 222.172
2019-05-07 12:55:59New value: 222.172
2019-05-07 12:56:01New value: 221.797
2019-05-07 12:56:01New value: 221.797
2019-05-07 12:56:02New value: 222.001
2019-05-07 12:56:03New value: 222.001
2019-05-07 12:56:05New value: 222.46
2019-05-07 12:56:05New value: 222.46
2019-05-07 12:56:07New value: 221.666
2019-05-07 12:56:07New value: 221.666
2019-05-07 12:56:08New value: 222.226
2019-05-07 12:56:09New value: 222.226
2019-05-07 12:56:10New value: 223.098
2019-05-07 12:56:11New value: 223.098
2019-05-07 12:56:12New value: 223.472
2019-05-07 12:56:13New value: 223.472
2019-05-07 12:56:15New value: 223.662
2019-05-07 12:56:15New value: 223.662
2019-05-07 12:56:17New value: 223.537
2019-05-07 12:56:17New value: 223.537
2019-05-07 12:56:19New value: 223.059
2019-05-07 12:56:19New value: 223.059
2019-05-07 12:56:21New value: 222.952
2019-05-07 12:56:21New value: 222.952
2019-05-07 12:56:22New value: 222.957
2019-05-07 12:56:23New value: 222.957
2019-05-07 12:56:24New value: 222.41
2019-05-07 12:56:25New value: 222.41
2019-05-07 12:56:26New value: 221.862
2019-05-07 12:56:27New value: 221.862
2019-05-07 12:56:29New value: 222.002
2019-05-07 12:56:29New value: 222.002
2019-05-07 12:56:31New value: 222.377
2019-05-07 12:56:31New value: 222.377
2019-05-07 12:56:32New value: 222.108
2019-05-07 12:56:33New value: 222.108
2019-05-07 12:56:35New value: 222.254
2019-05-07 12:56:35New value: 222.254
2019-05-07 12:56:36New value: 221.973
2019-05-07 12:56:37New value: 221.973
2019-05-07 12:56:38New value: 221.793
2019-05-07 12:56:39New value: 221.793
2019-05-07 12:56:40New value: 221.756
2019-05-07 12:56:41New value: 221.756
2019-05-07 12:56:42New value: 221.893
2019-05-07 12:56:43New value: 221.893
2019-05-07 12:56:44New value: 222.096
2019-05-07 12:56:45New value: 222.096
2019-05-07 12:56:46New value: 222.377
2019-05-07 12:56:47New value: 222.377
2019-05-07 12:56:48New value: 222.297
2019-05-07 12:56:49New value: 222.297
2019-05-07 12:56:50New value: 221.946
2019-05-07 12:56:51New value: 221.946
2019-05-07 12:56:52New value: 221.952
2019-05-07 12:56:53New value: 221.952
2019-05-07 12:56:54New value: 222.02
2019-05-07 12:56:55New value: 222.02
2019-05-07 12:56:56New value: 222.188
2019-05-07 12:56:57New value: 222.188
2019-05-07 12:56:58New value: 222.638
2019-05-07 12:56:59New value: 222.638
2019-05-07 12:57:00Отключение электричества: 2019-05-07 12:56:58
2019-05-07 12:57:00New value: 222.296
2019-05-07 12:57:01Отключение электричества: 2019-05-07 12:56:58
2019-05-07 12:57:01New value: 222.296
2019-05-07 12:57:02New value: 222.407
2019-05-07 12:57:03New value: 222.407
2019-05-07 12:57:04New value: 222.521
2019-05-07 12:57:05New value: 222.521
2019-05-07 12:57:07New value: 222.541
2019-05-07 12:57:07New value: 222.541
2019-05-07 12:57:08New value: 223.622
2019-05-07 12:57:09New value: 223.622
2019-05-07 12:57:11New value: 223.675
2019-05-07 12:57:11New value: 223.675
2019-05-07 12:57:12New value: 223.599
2019-05-07 12:57:13New value: 223.599
2019-05-07 12:57:15New value: 223.978
2019-05-07 12:57:15New value: 223.978
2019-05-07 12:57:17New value: 224.17
2019-05-07 12:57:17New value: 224.17
2019-05-07 12:57:18New value: 223.902
2019-05-07 12:57:19New value: 223.902
2019-05-07 12:57:21New value: 223.303
2019-05-07 12:57:21New value: 223.303
2019-05-07 12:57:23New value: 223.117
2019-05-07 12:57:23New value: 223.117
2019-05-07 12:57:25New value: 222.797
2019-05-07 12:57:25New value: 222.797
2019-05-07 12:57:27New value: 223.084
2019-05-07 12:57:27New value: 223.084
2019-05-07 12:57:28New value: 224.263
2019-05-07 12:57:29New value: 224.263
2019-05-07 12:57:30New value: 224.006
2019-05-07 12:57:31New value: 224.006
2019-05-07 12:57:33New value: 223.83
2019-05-07 12:57:33New value: 223.83
2019-05-07 12:57:35New value: 224.315
2019-05-07 12:57:35New value: 224.315
2019-05-07 12:57:37New value: 223.618
2019-05-07 12:57:37New value: 223.618
2019-05-07 12:57:39New value: 223.697
2019-05-07 12:57:39New value: 223.697
2019-05-07 12:57:41New value: 223.179
2019-05-07 12:57:41New value: 223.179
2019-05-07 12:57:43New value: 223.732
2019-05-07 12:57:43New value: 223.732
2019-05-07 12:57:45New value: 223.762
2019-05-07 12:57:45New value: 223.762
2019-05-07 12:57:47New value: 223.793
2019-05-07 12:57:47New value: 223.793
2019-05-07 12:57:49New value: 223.632
2019-05-07 12:57:49New value: 223.632
2019-05-07 12:57:50New value: 223.516
2019-05-07 12:57:51New value: 223.516
2019-05-07 12:57:53New value: 223.543
2019-05-07 12:57:53New value: 223.543
2019-05-07 12:57:54New value: 223.314
2019-05-07 12:57:55New value: 223.314
2019-05-07 12:57:57New value: 223.039
2019-05-07 12:57:57New value: 223.039
2019-05-07 12:57:59New value: 223.688
2019-05-07 12:57:59New value: 223.688
2019-05-07 12:58:01New value: 224.549
2019-05-07 12:58:01New value: 224.549
2019-05-07 12:58:03New value: 224.331
2019-05-07 12:58:03New value: 224.331
2019-05-07 12:58:05New value: 224.619
2019-05-07 12:58:05New value: 224.619
2019-05-07 12:58:07New value: 224.283
2019-05-07 12:58:07New value: 224.283
2019-05-07 12:58:09New value: 224.357
2019-05-07 12:58:09New value: 224.357
2019-05-07 12:58:11New value: 224.11
2019-05-07 12:58:11New value: 224.11
2019-05-07 12:58:13New value: 224.48
2019-05-07 12:58:13New value: 224.48
2019-05-07 12:58:15New value: 224.343
2019-05-07 12:58:15New value: 224.343
2019-05-07 12:58:17New value: 224.578
2019-05-07 12:58:17New value: 224.578
2019-05-07 12:58:19New value: 224.584
2019-05-07 12:58:19New value: 224.584
2019-05-07 12:58:21New value: 224.535
2019-05-07 12:58:21New value: 224.535
2019-05-07 12:58:23New value: 224.606
2019-05-07 12:58:23New value: 224.606
2019-05-07 12:58:25New value: 224.524
2019-05-07 12:58:25New value: 224.524

Обращаю внимание, что в логе все почему-то повторяется по 2 раза.


#27

Такое ощущение, что у вас 2 правила работают. А вообще, зачем вам для таких уведомлений правило писать? Используйте лучше алерты.


#28

Что такое алерт?


#29

Через алармы, то есть, пардон:
https://wirenboard.com/wiki/index.php/Модуль_уведомлений


#30

В случае пропадания электропитания на контроллер просто перестают поступать сигналы. Нужно отслеживать задержку с момента поступления последних данных. Насколько я понимаю, данным модулем такую задачу не решить.


#31

Смотрите, задвоение сообщений в логе происходит, похоже, действительно от работы двух экземпляров правил. Проверьте, что в движке правил правило только одно и перезапустите движок правил.

Сообщения о пропадении напряжения, похоже, генерировались старым экземпляром.


#32

Правило такое 100% только одно.
Задвоение происходит по всей видимости со всеми правилами.


#33

Движок правил перезапустили?


#34

Да, конечно
2019-05-07 14:31:01add your rules to /etc/wb-rules/
2019-05-07 14:31:01add your rules to /etc/wb-rules/
2019-05-07 14:31:05New value: 223.624
2019-05-07 14:31:05New value: 223.624
2019-05-07 14:31:05New value: 223.611
2019-05-07 14:31:05New value: 223.611
2019-05-07 14:31:06New value: 224.188
2019-05-07 14:31:06New value: 224.188
2019-05-07 14:31:08New value: 224.205
2019-05-07 14:31:08New value: 224.205
2019-05-07 14:31:10New value: 223.847
2019-05-07 14:31:10New value: 223.847
2019-05-07 14:31:12New value: 223.661
2019-05-07 14:31:12New value: 223.661
2019-05-07 14:31:13New value: 222.983
2019-05-07 14:31:14New value: 222.983
2019-05-07 14:31:16New value: 223.68
2019-05-07 14:31:16New value: 223.68
2019-05-07 14:31:18New value: 223.522
2019-05-07 14:31:18New value: 223.522


#35

Забыл уточнить, это лог из браузера.
Сейчас зашел в /var/log/messages.
Там без дублей


#36

Попробуйте так, без таймеров:

  • в вашем правиле сохраняете текущее время в переменной
  • создаете новое правило, которое выполняется по функции “текущее время - сохраненное время > таймаута”, в нем отсылаете уведомление + ставите флаг что уведомление отослано и больше отсылать не надо (флаг этот должен сбрасываться в вашем первом правиле)

#37

Спасибо.
Переписал следующим образом, вроде бы срабатывает.
Думаю, на странице документации 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;
      }
    }
});

#38

Добрый день! Скажите пожалуйста, какой конкретно пример из нашей документации не срабатывает?


#39

Добрый!

Правило, которое обсуждали выше


Написано по агалогии с
https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules#.D0.94.D0.B5.D1.82.D0.B5.D0.BA.D1.82.D0.BE.D1.80_.D0.B4.D0.B2.D0.B8.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F_c_.D1.82.D0.B0.D0.B9.D0.BC.D0.B0.D1.83.D1.82.D0.BE.D0.BC


#40

Спасибо! Посмотрим, поправим.