Странная работа WBIO-DO-R1G-16 по правилу

Пытаюсь реализовать простой сценарий управления светом по правилу. При каждом нажатии выключателя (фиксируется только переход из false в true - т.е. нажатие) связка WBIO-DI-WD-14 и WBIO-DO-R1G-16 работает весьма странно - я могу только выключить реле (включить не получается). При этом тоже самое правило корректно отрабатывает с другим Modbus устройством вывода.

function light_control(name, device_in, control_in, device_out, control_out) {
	defineRule({
		whenChanged: device_in + "/" + control_in,
		then: function (newValue, devName, cellName) {
            if ( newValue == true )
			if (dev[device_out][control_out] = false){
				dev[device_out][control_out] = true;
			} else {
				dev[device_out][control_out] = false;
			}
		}
	});	
}
light_control("light_3", "wb-gpio", "EXT1_IN11", "r4d1c32_1", "R4D1C32 Out 26");
light_control("light_4", "wb-gpio", "EXT1_IN13", "wb-gpio", "EXT4_K13");

что самое любопытное смена в функции “ЕСЛИ” определения текущего состояния ничего не меняет - все равно только выключение

function light_control(name, device_in, control_in, device_out, control_out) {
	defineRule({
		whenChanged: device_in + "/" + control_in,
		then: function (newValue, devName, cellName) {
            if ( newValue == true )
			if (dev[device_out][control_out] = true){
				dev[device_out][control_out] = false;
			} else {
				dev[device_out][control_out] = true;
			}
		}
	});	
}
light_control("light_3", "wb-gpio", "EXT1_IN11", "r4d1c32_1", "R4D1C32 Out 26");
light_control("light_4", "wb-gpio", "EXT1_IN13", "wb-gpio", "EXT4_K13");

в NodeRED все корректно распознается и работает через wb-gpio, через правило нет.

Wiren Board 7.3.3, bullseye, release staging.07427.cf98af374eb4 (as testing)

куда копать?

Замените правило на:

function light_control(name, device_in, control_in, device_out, control_out) {
	defineRule({
		whenChanged: device_in + "/" + control_in,
		then: function (newValue, devName, cellName) {
        	    	if (newValue){
				dev[device_out][control_out] = !dev[device_out][control_out];
			}
		}
	});	
}

А для чего эта сточка служила в вашем коде?

Ваша правка работает! Спасибо!
Я честно говоря толь начинаю практиковаться в правилах.

 if ( newValue == true )

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

Тут условие без действия. То есть от него ничего не зависит.

Спасибо!
Действительно два if друг за другом
первое бездейственное

1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.