Pushbutton: Двойное выполнение функции

Добрый день,

Столкнулся с проблемой при написании правил. При вот таком простом скрипте:

var nt = 1;

defineVirtualDevice("test_button", {
  title: "Test Button",
  cells: {
    enabled: {
      type: "pushbutton",
      value: false
    }
  }
});

defineRule("test",{
  whenChanged: "test_button/enabled",
  then: function (newValue, devName, cellName) {
    log.info("nt = " + nt);
    nt = nt + 1
  }
});

при нажатии на кнопку лог выдает вот такой вывод:

2021-10-25 20:59:52nt = 1
2021-10-25 20:59:52nt = 1
2021-10-25 20:59:52nt = 2
2021-10-25 20:59:52nt = 2

Вопросов два:

  1. Почему-то все выводы в лог дублируются (вообще все, включая инициализацию правил). Некритично, но просто интересно.
  2. При нажатии на кнопку (обычное одинарное нажатие мышкой) функция почему-то выполняется дважды. Вот это критично.

Подскажите плз в какую сторону копать.

Wirenboard 5.8, fw 201903120759, релиз: wb-2108

Добрый день.
Воспроизвожу, на таком же релизе.

Ну на эталонном релизе-то, наверное, вряд-ли такая явная проблема будет, тут скорее всего что-то не то в моем экземпляре. Возможно, что-то в конфигах осталось от предыдущих версий после обновления (заливал образ через WebUI).

Скажите что прислать, для диагностики, либо могу организовать доступ к контроллеру, если нужно

Не восспроизводится, да. Но искусстевенно запустив два экземпляра wb-rules - получилось. Проверьте, сколько процессв движка правил выполняется, закройте их и перезапустите сервис.

wb-rules - всего один процесс:

root@wirenboard-ACP6FPZO:~# ps aux | grep -i wb-rules
root    870 10.5  8.2 891156 10080 ?        Sl   15:28   1:10 /usr/bin/wb-rules -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
root   5086  0.0  1.2   2664  1504 pts/0    S+   15:39   0:00 grep -i wb-rules

пробовал сделать:
service wb-rules stop
нажимаю на кнопку - нет реакции. Т.е. wb-rules, получается, остановлен.
service wb-rules start
нажимаю на кнопку - опять 4 раза выводится, как в исходном собщении. :slightly_frowning_face:

Перезагрузку контроллера, само собой, делал.

Может, дело в том, что в вызове wb-rules два раза участвует каталог /etc/wb-rules?

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

@BrainRoot, так сможете как-то помочь с двойным выполнением функции?
Где еще можно поискать проблему? Что проверить?

Попробую еще воспроизвести, но в понедельник.

Немного подробностей, возможно, поможет навести на мысль где косяк:

  • Двойное выполнение функции - только для кнопки. Т.е., например, функция на переключателе или по таймеру cron выполняется один раз (только вывод в лог задвоен), галка “Включить отладку” никак не влияет на вывод.
  • При сохранении правила уведомление ‘defineRule: test’ выводится в лог аж 4 раза, два плюс два с задержкой между парами 0,5-1 сек. Это только при включенной галке “Включить отладку”. Если галку снять, то definerule ни разу не выводится.

Добрый день.
Залил еще раз “чистую” 202108301515_stable_emmc_wb58.img
использую приведенный скрипт:

//11_01_test_01.js
var nt = 1;

log.info("script start");

defineVirtualDevice("test_button", {
  title: "Test Button",
  cells: {
    enabled: {
      type: "pushbutton",
      value: false
    }
  }
});

defineRule("test",{
  whenChanged: "test_button/enabled",
  then: function (newValue, devName, cellName) {
    log.info(newValue, devName, cellName);
    log.info("nt = " + nt);
    nt = nt + 1
  }
});

В логах:

2021-11-02 14:10:12script start

2021-11-02 14:10:16false test_button enabled

2021-11-02 14:10:16nt = 1

2021-11-02 14:10:17false test_button enabled

2021-11-02 14:10:17nt = 2

2021-11-02 14:10:17false test_button enabled

2021-11-02 14:10:17nt = 3

Три нажатия.
Подпишитесь на топик кнопки, там при однократном нажатии - что?
У меня - штатно

mosquitto_sub -v -t /devices/test_button/#
/devices/test_button/controls/enabled/meta/type pushbutton
/devices/test_button/controls/enabled/meta/order 1
/devices/test_button/meta/name Test Button
/devices/test_button/controls/enabled/on 1
/devices/test_button/controls/enabled 1

Вот мой вывод при простом однократном нажатии:

root@wirenboard-ACP6FPZO:~# mosquitto_sub -v -t /devices/test_button/#
/devices/test_button/meta/name Test Button
/devices/test_button/controls/enabled/meta/type pushbutton
/devices/test_button/controls/enabled/meta/order 1
/devices/test_button/controls/enabled/on 1
/devices/test_button/controls/enabled/on 1
/devices/test_button/controls/enabled 1
/devices/test_button/controls/enabled 1
/devices/test_button/controls/enabled 1
/devices/test_button/controls/enabled 1

То есть wb-rules явно не при чем. Публикуется интерфейсом дважды.
А если вручную опубликовать “1” в топик /devices/test_button/controls/enabled/on - отработает скрипт 1 раз?
Что за браузер используется?

Браузер Chrome, с последними обновлениями.
При ручной публикации:

root@wirenboard-ACP6FPZO:~# mosquitto_sub -v -t /devices/test_button/#
/devices/test_button/meta/name Test Button
/devices/test_button/controls/enabled/meta/type pushbutton
/devices/test_button/controls/enabled/meta/order 1
/devices/test_button/controls/enabled/on 1
/devices/test_button/controls/enabled 1
/devices/test_button/controls/enabled 1

Выполняется 1 раз, остается только задвоенный вывод в лог.

Возможно ли проблема в том, что настроен мост с другим MQTT брокером?

Ага, вот это - да, может быть причиной. Остановите мост для теста.

Мда, точно, без моста вывод точно как у Вас.

Тогда непонятно что не так с мостом. Настраивал по инструкции: MQTT — Wiren Board
Второй брокер - Mosquitto (add-on в Home assistant). Настройки моста в WB:

connection wb_hassio
address <myadress>
remote_username <myuser>
remote_password <mypassword>
notifications true
notification_topic /clientnotification/wb_hasio_status

clientid wirenboard
#try_private false
start_type automatic
topic # both

Мост работает, в Homeassistant настроек не делал, кроме создания логина/пароля.

Тут, воспроизведу, но оно и так понятно - публикуется дважды в /on

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

Вежливое напоминание.
Со своей стороны не получилось найти причину, почему наличие mqtt-моста приводит к двойному выполнению функции на кнопке, но одинарному на, например, переключателе.

Я думал - понятно, что с такой настройкой отражается все. Включая RPC даже. То есть просто возникает “эхо”.

1 Like