Обновление показателей WBIO-DI-HVD-16

Доброго времени суток!

Для контроля состояний автоматических выключателей (далее АВ) я использую модуль WBIO-DI-HVD-16. Каждый АВ имеет доп контакт, который подаёт дежурное напряжение при определенных положениях на данный модуль.

Так как у меня волшебная щитовая с HMI панелью от EKF (https://support.wirenboard.com/t/wb7-ekf-pro-screen-schetchik-merkurij/26208/30), я на ней отобразил состояние АВ.

  1. создаю устройство с протоколом Modbus.
  2. создаю каналы под необходимые мне АВ.
  3. создаю правило (кусок примера) :
defineRule("EKF control panel QF  monitor", {   
  whenChanged: ["wb-gpio/EXT1_IN1"],
  then: function () {
  if(dev["wb-gpio/EXT1_IN1"] == true) { // читаем данные (есть 220 или нет) со входа WBIO-DI-HVD-16. QF1 (B14) - аварийный доп. контакт
      dev["wb-modbus-1-1/QF1_B14"] = true; 
    } 
  else {
        dev["wb-modbus-1-1/QF1_B14"] = false;
  }
}});

Всё отлично работает, но проблема (скорее дискомфорт) вот в чем:
При перезагрузке панели, сам WB при этом работает, графическое отображение состояния АВ в начальном (выключенном состоянии). Отображение происходит корректно только тогда, когда откроешь щитовую и вкл/выкл любой из АВ (у нас же правило реагирует на изменения, которых, по факту, не происходит при перезагрузке HMI панели, а она при включении отображает начальное значение).

Вопрос: как подать сигнал с WBIO-DI-HVD-16 на “обновление” не прибегая к физической перезагрузке?

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

P.S. Пока только одна “топорная” идея - это поставить реле в WB и через него “перезапускать” дежурное напряжение.

Добрый день.

Можно записать как

  if(dev["wb-gpio/EXT1_IN1"]) { // читаем данные (есть 220 или нет) со входа WBIO-DI-HVD-16. QF1 (B14) - аварийный доп. контакт

Довольно просто. Так как вся логика - событийная - достаточно отследить ошибку “отсутствия устройства”.
То есть если устройство сменило статус на “онлайн” (сбросился топик ошибки - то просто записать в него один раз значения.

Ну и делать по правилу на каждый топик руками - как-то не очень красиво.
Я б так описал:

//04_28_test_02.js

var topicks = {"in1":{"inTopick":"wb-gpio/A1_OUT", "outTopick":"outDevForIN/in1"},
               "in2":{"inTopick":"wb-gpio/A2_OUT", "outTopick":"outDevForIN/in2"},
               "in3":{"inTopick":"wb-gpio/A3_OUT", "outTopick":"outDevForIN/in3"}}

function makeRule(name, inTopick, outTopick ){
  //создадим правило
  defineRule(name+"rule_topiks", {
    whenChanged: inTopick, // топик, при изменении которого сработает правило
    then: function (newValue, devName, cellName) {
      log.debug("devName:{}, cellName:{}, newValue:{}", devName, cellName, newValue); // вывод сообщения в лог
      //установка текущего уровня
      dev[outTopick] = newValue //устанавливаем прямое значение
    }
  });
}

for (i in topicks){
  log.info ("i=", i)
  log.info ("i.inTopick=", topicks[i].inTopick)
  makeRule(i, topicks[i].inTopick, topicks[i].outTopick )
  //log.info ("i.inTopick=", topicks[i].inTopick)
}


//А тут можно сделать правило которое обработает ошибку связи с устройством. Точнее не ошибку а состояние когда ошибка пропала. Появление связи!
//Ну и выполнить банальный цикл:

/*
for (i in topicks){
  dev[topicks[i].outTopick] = dev[topicks[i].inTopick]
  //log.info ("i.inTopick=", topicks[i].inTopick)
}
*/

Ну, так себе. Лишнее реле - да и зачем, если решается программно?
У меня, например по такому ж принципу переписывается конфиг openhasp панели, если она долго не обновляет свои топики и потом появляется на связи.