Проблемы с контролами в виртуальных устройствах и виджетах

В продолжении темы при работе с BOLID C2000-ПП

У нас есть “устройство” (читаем пишем состояния разделов охраны) название bolid

Создаем виртуальное устройство название room101 в котором два контрола: текст и переключатель. Вешаем событие на изменение состояния whenChanged: [“bolid/zone1”] и меняем текст в room101 в соответствии со значением - это все работает. Далее вешаем событие на переключатель whenChanged: [“room101/control”] и пишем в bolid/zone1 некие значения поставить/снять соответственно 24/109 - и тут тоже работает. НО если снять или поставить помещение на охрану с пульта охраны или карой или с клавиатуры системы … то переключатель не меняет свое положение это вроде и логично … тогда отслеживаем нужное состояние в whenChanged: [“bolid/zone1”] и пытаемся записать в [“room101/control”] соответственно true/false. но при записи срабатывает событие [“room101/control”] и производит запись в регистр. Вроде бы и ничего НО … дело в том что система когда пишешь в регистр поставить на охрану возвращает в него разные статусы с некой последовательностью и периодичностью в том числе и предыдущий статус и мы ловим снять с охраны … переключатель пишет в устройство снять с охраны - болид ок снимаю предыдущий поставить … и все … зацикливается. К чему все это … как изменить отображение контрола не вызывая срабатывания события. Это касается и других .. например range.

Добрый день.

Пришлите, пожалуйста, текст правила (скрипт wb-rules) для room101/bolid целиком — так сможем точно увидеть текущую структуру правил и предложить решение без зацикливания.

Отправлено с устройства Galaxy

-------- Исходное сообщение --------
От: Alexander Kuznetsov info@wirenboard.com
Дата: 16.09.2026 11:45 (GMT+03:00)
Кому: savick@mail.ru
Тема: [Wiren Board Support] Проблемы с контролами в виртуальных устройствах и виджетах

Кто-то ответил на ваш пост.

| Alexander_Kuznetsov Wiren Board Team
September 16 |

  • | - |

Добрый день.

Пришлите, пожалуйста, текст правила (скрипт wb-rules) для room101/bolid целиком — так сможем точно увидеть текущую структуру правил и предложить решение без зацикливания.

(attachments)

ruleBolid.docx (15.1 KB)

Вот такая зациекленность: правило ruleStatus при статусах 6191/27951 пишет в control, а это триггерит ruleArm, которое шлёт команду обратно в bolid — зацикливание.

Добавим флаг syncing — выставляется перед программной записью в control и проверяется в ruleArm, чтобы не отправлять команду обратно, если изменение вызвано синхронизацией статуса, а не пользователем.

function BolidRoom(devname, roomtitle, fzone) {

  var ruleArm = devname + "_setArm";
  var ruleStatus = devname + "_setStatus";
  var syncing = false;   // <-- добавили

  var controls = { /* без изменений */ };
  var stat = { /* без изменений */ };

  defineVirtualDevice(devname, controls);

  defineRule(ruleArm, {
    whenChanged: [devname + "/control"],
    then: function(newValue, devName, cellName) {
      if (syncing) return;              // <-- игнорируем эхо статуса
      dev[fzone] = newValue ? 24 : 109;
    }
  });

  defineRule(ruleStatus, {
    whenChanged: [fzone],
    then: function(newValue, devName, cellName) {
      dev[devname + "/status"] = newValue;
      getControl(devname + "/alarm").setTitle({ru: stat[newValue]});
      dev[devname + "/alarm"] = (newValue == 815);

      syncing = true;                   // <-- помечаем
      if(newValue == 6191){ dev[devname + "/control"] = true; };
      if(newValue == 27951){ dev[devname + "/control"] = false; };
      syncing = false;                  // <-- снимаем
    }
  });
};

Это не работает. Ничего не изменилось. Также зацикливается

Коллега, по регламенту техническая поддержка не занимается написанием скриптов и их откладкой. А с учетом того, что у вас специализированное оборудование, интересная организация данных в его регистрах, да и сам объект не у меня перед глазами, отладку можно смело отнести к категории высокой сложности. Буквально вчера я оформил советы, как писать/отлаживать скрипты, используя наш ИИ: Примеры правил - Wiren Board

Проведите откладку по месту с его помощью.

Типично - при изменении состояния (значения) проверяют - отличается ли текущее от нового. Если не отличается - просто не записывают новое.

Типично - это событие click - отрабатывает когда взаимодействуют с элементом. А установка свойств (true/folse; enable/disable) изменяет отображение элемента без вызова действия. (Вот типично)

false

Добрый день! Вам удалось отладить сприкт при содействии с ИИ?

Не совсем. Все равно свитч передергивается.

Отправлено с устройства Galaxy

-------- Исходное сообщение --------
От: Alexander Kuznetsov info@wirenboard.com
Дата: 30.09.2026 13:09 (GMT+03:00)
Кому: savick@mail.ru
Тема: [Wiren Board Support] Проблемы с контролами в виртуальных устройствах и виджетах

Кто-то ответил на ваш пост.

| Alexander_Kuznetsov Wiren Board Team
September 30 |

  • | - |

Добрый день! Вам удалось отладить сприкт при содействии с ИИ?

Поробуйте, все же, разделить этот регистр отдельно на два топика mqtt - состояние и управление.