Вызов функций внутри и вне defineRule с изменением состояния контролов

  1. Могу ли я вызвать функцию внутри объявленного правила и изменить значение контрола (виртуального и/или реального) прямо в самой функции?

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

defineAlias('stairs1_relay', "wb-mr6c_16/K1");
var light_stairs1_timer_id = null;

//Управнение светом на площадке 1 по датчику движения
defineRule({
	whenChanged: ['stairs1_detector'],
	then: function (newValue, devName, cellName) {
		// если сработал датчик движения и освещение сумеречное и не период с 0 до 7
		if ( !newValue ) {
			if (!stairs1_relay) {
				log("[Площадка 1эт]: Сработал датчик движения!");
				stairs1_relay = true; // включаем свет на площадке 1эт
			}

			if (light_stairs1_timer_id) light_stairs1_timer_id = clearTimeout(light_stairs1_timer_id);

			light_stairs1_timer_id = setTimeout(function() {
				stairs1_relay = false;
				light_stairs1_timer_id = null;
			}, light_short_timer * 60000);
		}
	}
});


//Можно его оптимизировать так, вынеся колбэк в отдельную функцию?

defineRule({
	whenChanged: ['stairs1_detector'],
	then: function (newValue, devName, cellName) {
		// если сработал датчик движения и освещение сумеречное и не период с 0 до 7
		if ( !newValue ) {
			if (!stairs1_relay) {
				log("[Площадка 1эт]: Сработал датчик движения!");
				stairs1_relay = true; // включаем свет на площадке 1эт
			}

			light_stairs1_timer_id = setTimer(stairs1_relay, light_stairs1_timer_id);
		}
	}
});

var setTimer = function(relay, timerId) {
	if (timerId) timerId = clearTimeout(timerId);

	timerId = setTimeout(function() {
		dev[relayName] = false; // меняем контрол
		timerId = null;
	}, 3000, relayName);

	return timerId;
  1. Как можно присвоить значения контролам устройств, которые после перезагрузки не сохраняют свои положения и требуется им присвоить значения виртуальных аналогов вне правил? Как это реализовать правильно?

Да, можно.

А вот это - прямо вообще правильно, не надо оставлять таймеры!

Например так:

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

2 лайка

спасибо