WB-rules срабатывают несколько раз


#1

Имеется следующее правило:

defineRule  ("rs485command", {
  whenChanged: "test-rs485/Test!",
  then: function() {
    runShellCommand("service wb-mqtt-serial stop");
    log("Disabling wb-mqtt-serial");
  }
});

defineVirtualDevice("test-rs485", {
  title: "Test-rs485",
    cells: {
    "Test!": {
      type: "switch",
      value: "false",
    },
    }
});

При нажатии на переключатель в лог публикуется сразу два сообщения. Если сделать pushbutton вместо свитча, то публикуется 4 сообщения разом. Если сделать поле text и публиковать туда сообщения, например, через консоль:

mosquitto_pub -t ‘/devices/test-rs485/controls/Test!/on’ -m 1

То все равно правило обрабатывается дважды. С другими написанными правилами такая же ситуация.

В какую сторону нужно копать, чтобы исправить такое поведение?


#2

And, добрый день!
Думаю, у вас работает еще одна копия правила, с другим именем, которую вы затерли новым при редактировании. Попробуйте перезагрузить движок.


#3

Попробовал на всякий случай всё:

mqtt-delete-retained ‘/devices/#’
service wb-rules restart
service mosquitto restart
service wb-mqtt-serial restart
reboot

Без толку. В папке /mnt/data/etc/wb-rules ничего лишнего нет. Только то, что я уже привел, и ещё пара cron’ов.
Вот пример правила, работающего на cron’е:

defineVirtualDevice("GSM-Quality", {
title: "GSM-сигнал",
cells: {
"Качество": {
    type: "text",
    value: "0"},
  }
});

defineRule("GSM-Quality-Rule", {
when: cron("@every 1m"),
then: function() 
{
  runShellCommand("python /csq.py |grep '+CSQ:' | cut -d ' ' -f2 | cut -d ',' -f1 | tr '\n' ' ' | sed -e 's/\s//'", 
 {
  captureOutput: true,
  exitCallback: function (exitCode, capturedOutput) {
    log("Quality rule firing");
    dev["GSM-Quality"]["Качество"] = capturedOutput;
  }
}); 
}
});

Которое тоже выводит в лог дублирующиеся сообщения:
image


#4

Попробуйте изменить правило с кнопкой следующим образом:

var sequence = 0;

defineRule  ("rs485command", {
  whenChanged: "test-rs485/Test!",
  then: function() {
    runShellCommand("service wb-mqtt-serial stop");
    log("Disabling wb-mqtt-serial " + sequence);
    sequence++;
  }
});

defineVirtualDevice("test-rs485", {
  title: "Test-rs485",
    cells: {
    "Test!": {
      type: "switch",
      value: "false",
    },
    }
});

Будет ли последовательно увеличиваться значение счетчика sequence, или будет дублироваться:
image
Хочется понять, это проблема движка или веб-интерфейса.


#5

Хорошая идея. Написал простое правило:

var counter = 0;
defineRule("check", {
when: cron("@every 10s"),
then: function() 
{
  log("Counter: " + counter);
  counter++;
}});

Оно выдает в лог двойные сообщения:

image

С другими правилами похожая картина. Например, правило с кнопкой при нажатии выдает после двух нажатий:
image


#6

Логично предположить, что правила срабатывают один раз-таки. Скажите, а если другой браузер попробовать, такая же картина будет наблюдаться? Какой у вас?


#7

Также написал правило, которое читает значение из топика, увеличивает на единицу и пишет обратно. Оно тоже увеличивает значение по единичке за итерацию.

Что уже позитивно. Если правила выполняются один раз, то они ничего не ломают. Осталось понять, почему дублируются сообщения.

Браузер Chrome 74.0.3729.169 (х64), режим инкогнито не помогает, как и попытка открыть веб-интерфейс в IE - сообщения продолжают дублироваться.


#8

Давайте еще посмотрим, что при включенной отладке
image
пишется в /var/log/messages – одна копия сообщения или две?


#9

Пишется сообщение один раз:

Jun 3 09:57:53 wirenboard-AQRQ5U3C daemon.info wb-rules[559]: INFO: [rule info] 3776
Jun 3 09:58:03 wirenboard-AQRQ5U3C daemon.info wb-rules[559]: INFO: [rule info] 3777

Независимо от того, включена ли отладка.


#10
  1. Пришлите пожалуйста, вывод
    dpkg -s wb-rules

  2. Затем выполните команду
    service wb-rules stop && ps -ef | grep wb-rules
    И пришлите ее вывод.

  3. После этого запустите

/usr/bin/wb-rules -debug -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/ 2>&1 | tee  wbrules.txt

Через секунду-две на экране появятся множественные сообщения типа “GOT MESSAGE: …”
Нажмите Ctrl-C и пришлите получившийся wbrules.txt.

  1. Перезапустите движок правил
    service wb-rules stop

#11
  1. /var/log$ dpkg -s wb-rules

Package: wb-rules
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 5794
Maintainer: Ivan Shvedunov ivan4th@gmail.com
Architecture: armhf
Version: 1.7
Depends: libc6 (>= 2.13)
Breaks: wb-mqtt-confed (<< 1.0.2)
Conffiles:
/etc/init.d/wb-rules 8e78313c448b8ea3f41d1a698c6db63f
/etc/wb-configs.d/13wb-rules 1236e2e4343d949e0a21de865706c00b
/etc/wb-rules/alarms.conf 2051dd214a6232c5e778c50e52d5fb6a
/etc/wb-rules/rules.js 926c30d0fd63e272f6f9ad370dffb1b0
Description: Wiren Board Rule Engine

  1. /var/log$ service wb-rules stop && ps -ef | grep wb-rules

root 4753 4616 0 13:02 ? 00:00:00 grep wb-rules

  1. wbrules.txt (144.9 КБ)

#12

Я понял, что у вас вторая версия веб-интерфейса? А какая конкретно? 11?


#13

Нет, именно на данном контроллере стоит стандартный интерфейс, который шел с устройством.
Вот информация о контроллере:
image


#14

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


#15

And, добрый день! Получилось ли устранить ошибку со второй версией web-интерфейса?


#16

Здравствуйте!

Не было времени обновить интерфейс. Однако ошибка исчезла сама (заметил недавно). Никаких особых действий для её устранения не совершал, только перезагрузка контроллера и разных служб в процессе работы с ним.


#17

Спасибо!
Эх, жалко, не поймали баг! Успехов вам!