Отправка значения в объект knx без сработки правил wb-rules

Коллеги, оброго дня!

Пытаюсь реализовать синхронизацию значения на физическом устройстве с knx-панелью через wb-rules.

Задача: при изменении одного топика вписать это значение в другой топик без сработки сторонних правил.

Есть следующий код:

(function() {
	function addSyncChannel(source, destination) {
		
		defineAlias('debug', 'wbrules/Rule debugging');

		defineRule('knx-sync.js: {} -> {}'.format(source, destination), {
			whenChanged: source,
			then: function(current) {
				if (debug) log.info('1: {} >> {}', source, current);

				var target = destination.split('/');

				getDevice(target[0]).getControl(target[1]).setValue({value: current, notify: false});

				if (debug) log.info('1: {}/{} << {}', target[0], target[1], current);
			}
		});

		defineRule('knx-sync.js: {} -> {}'.format(destination, source), {
			whenChanged: destination,
			then: function(current) {
				if (debug) log.info('2: {} >> {}', destination, current);

				var target = source.split('/');

				getDevice(target[0]).getControl(target[1]).setValue({value: current, notify: false});

				if (debug) log.info('2: {}/{} << {}', target[0], target[1], current);
			}
		});
	}

	// Добавление связей между физическими устройствами и адресными каналами от knx-панелей.
	// Параметры: топик от knx, топик устройства, опционально - таблица перевода значений,

	addSyncChannel('room/switch_lamp', 'buzzer/enabled'); // работа с вирт. устройством
	addSyncChannel('room/switch_socket', 'wb-gpio/A1_OUT'); // работа с gpio

})();

При его работе происходит двойная сработка, в логе это выглядит так:

2025-06-13 01:04:07  2: buzzer/enabled >> false
2025-06-13 01:04:07  2: room/switch_lamp << false
2025-06-13 01:04:07  1: room/switch_lamp >> false
2025-06-13 01:04:07  1: buzzer/enabled << false

Подскажите как можно решить эту проблему? Есть ли альтернативы setValue?

Добрый день.
Я реализовывал подобное проверкой в самом правиле. Проверял значение в целевом контроле и если оно уже такое же как (мог бы) записать - просто не записывал. notify: false работает только для wb-rules.

1 Like

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

Попытаю удачу опробовать советы из той темы. Может и получится что :wink:

(function() {
	
	var save = [];

	function addSyncChannel(source, destination) {
		defineRule('knx-sync.js: {} -> {}'.format(source, destination), {
			whenChanged: source,
			then: function(value) {
				log.debug('1: {} == {}', source, value);

				save[source] = value;

				if (save[destination] !== value) {
					dev[destination] = save[destination] = value;
					log.debug('1: {} << {}', destination, value);
				}
			}
		});

		save[source] = dev[source];

		defineRule('knx-sync.js: {} -> {}'.format(destination, source), {
			whenChanged: destination,
			then: function(value) {
				log.debug('2: {} == {}', destination, value);

				save[destination] = value;

				if (save[source] !== value) {
					dev[source] = save[source] = value;				
					log.debug('2: {} << {}', source, value);
				}
			}
		});

		save[destination] = dev[destination];
	}

	// Добавление связей между физическими устройствами и адресными каналами от knx-панелей
	
	addSyncChannel('room/switch_lamp', 'buzzer/enabled'); // работа с вирт. устройством
	addSyncChannel('room/switch_socket', 'wb-gpio/A1_OUT'); // работа с gpio

})();

Вроде получилось искомое. Надо проверить на реальном объекте :slight_smile:

Да, как я и описывал - проверять необходимость изменения.

А что ж не используете log.debug()? Или неудобен тем что переключатель включает debug во всех скриптах сразу?

Я не знал о нём) Спасибо, возьму на вооружение🫡