У нас есть “устройство” (читаем пишем состояния разделов охраны) название 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 целиком — так сможем точно увидеть текущую структуру правил и предложить решение без зацикливания.
-------- Исходное сообщение --------
От: Alexander Kuznetsov info@wirenboard.com
Дата: 16.09.2026 11:45 (GMT+03:00)
Кому: savick@mail.ru
Тема: [Wiren Board Support] Проблемы с контролами в виртуальных устройствах и виджетах
Пришлите, пожалуйста, текст правила (скрипт wb-rules) для room101/bolid целиком — так сможем точно увидеть текущую структуру правил и предложить решение без зацикливания.
Вот такая зациекленность: правило 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) изменяет отображение элемента без вызова действия. (Вот типично)
-------- Исходное сообщение --------
От: Alexander Kuznetsov info@wirenboard.com
Дата: 30.09.2026 13:09 (GMT+03:00)
Кому: savick@mail.ru
Тема: [Wiren Board Support] Проблемы с контролами в виртуальных устройствах и виджетах