Не выполняется смена состояния реле в setTimeOut

Почему не выполняется присваивание состояния 0 внутри правила через dev[devName][cellName] = 0?

defineRule({
	whenChanged: ["wb-mr6c_4/K1", "wb-mr6c_4/K2", "wb-mr6c_4/K4", "wb-mr6c_4/K5"],
	then: function (newValue, devName, cellName) {
		var cellNum = cellName[cellName.length-1]; //Номер сработавшего реле

		if (vent_timer_id[cellNum-1]) vent_timer_id[cellNum-1] = clearTimeout(vent_timer_id[cellNum-1]);

		if (newValue) {
			vent_timer_id[cellNum-1] = setTimeout(function() {
				dev[devName][cellName] = 0; // <--- не выключается реле
				vent_timer_id[cellNum-1] = null;
			}, 10000);
		}

		if (cellName == "K1") {
			log("[ПРАЧЕЧНАЯ]: Влажность {}%. Положение вентилятора: {}", dev[data.laundry_humidity], data.switch_status[Number(newValue)]);
		} else{
			var floor = Math.ceil(cellNum / 2);
			log("[САНУЗЕЛ {} эт]: Положение вентилятора: {}", floor, data.switch_status[Number(newValue)]);
		}
	}
});

Доброго времени!

Попробуйте написать false вместо 0 в строке, где выключается реле.

1 Like
defineRule({
	whenChanged: ["wb-mr6c_4/K1", "wb-mr6c_4/K2", "wb-mr6c_4/K4", "wb-mr6c_4/K5"],
	then: function (newValue, devName, cellName) {
		var cellNum = cellName[cellName.length-1]; //Номер сработавшего реле

		if (vent_timer_id[cellNum-1]) vent_timer_id[cellNum-1] = clearTimeout(vent_timer_id[cellNum-1]);

		if (newValue) {
			vent_timer_id[cellNum-1] = setTimeout(function(devName, cellName, cellNum) {
				dev[devName][cellName] = 0; //есть небольшая особенность с зонами видимости
				vent_timer_id[cellNum-1] = null;
			}, 10000, devName, cellName, cellNum);
		}

		if (cellName == "K1") {
			log("[ПРАЧЕЧНАЯ]: Влажность {}%. Положение вентилятора: {}", dev[data.laundry_humidity], data.switch_status[Number(newValue)]);
		} else{
			var floor = Math.ceil(cellNum / 2);
			log("[САНУЗЕЛ {} эт]: Положение вентилятора: {}", floor, data.switch_status[Number(newValue)]);
		}
	}
});

Фунция срабатыват тогда когда переменные отработали и их может удалить сборщик мусора, поэтому лучше в вид параметров передать.

1 Like

С зоной видимости в этом случае проблем нет, берутся аргументы функции, потому там на каждую лямбду своё окружение. Но вообще да, иногда на это стоит обращать внимание.

таки сработало. Спасибо.

Имеет смысл всегда присваивать boolean

а в каких случаях стоит передавать аргументы параметрами в setTimeOut ? Просто в моем случае и без этого сработало. Может всегда передавать и не думать?))

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

В JS это всё не очень очевидно устроено, я всё время в документацию залезаю, чтобы что-то такое уточнить. Если хочется разобраться в теме, можно поискать в интернете “javascript замыкания” и разницу между var, let и const.

В случае, как у вас, по идее можно так и продолжать делать :slight_smile:

1 Like

Спасибо за совет. Учту