Открытие ворот при скачке напряжения

Тема уже поднималась.
Прикольно наблюдать как отрываются ворота при скачке напряжения и загрузки контроллера)

Всё таки понимание whenChanged со стороны пользователей звучит как «когда значение изменилось», и несомненно это касается штатной работы контроллера и сервисов в нём.

Мы ждем «валидное» (контроллируемое) изменение счетчиков, в том числе и при переполнении (переходе на 0).

Соотвественно все служебные вещи, такие как перезагрузка контроллера, сервиса mqtt-serial и прочего, не должны триггерить правила wb-rules в части смены значений счетчиков. Давайте отделять зерна от плевел.

Служебная отработка 10->null->10 приводит к двойной сработке 10->null, null->10 из за чего происходит сработка правил. Как пониманию если исклбчить запись null, то из-за смены 10->10 ничего не изменится и правило не сработает = желаемый результат.

Прочие проверки с отвалом устройств логичнее делать через meta/error, а не какими-то вычислениями и предположениями.

1 лайк

Разнес обсуждение по разным темам.
Подскажите пожалуйста, актуальна ли проблема с ложным срабатыванием выходов для вас?

По каналам управления:

button - внешняя кнопка для открытия/остановки/закрытия в помещении
action - канал реле который замыкает кнопку Step-By-Step на приводе

Текст скрипта прилагаю:

Код правила
var button = 'wb-mr6c_103/Input 0 Counter';
var action = 'wb-gpio/EXT4_DIR1';

var opened = 'wb-mio-gpio_98:1/IN7';
var closed = 'wb-mio-gpio_98:1/IN6';

defineVirtualDevice('garage-door', {
	title: 'Гаражные ворота',
	cells: {
		move: {title: 'Открыть-стоп-закрыть', type: 'pushbutton'},
		status: {title: 'Текущий статус', type: 'text', value: 'UNKNOWN', readonly: true},
		sensor_opened: {title: 'Полностью открыты', type: 'switch', value: false, readonly: true},
		sensor_closed: {title: 'Полностью закрыты', type: 'switch', value: false, readonly: true}
	}
});

defineRule('garage-door-state', {
	whenChanged: [opened, closed],
	then: function(state) {

		// тестовое заполнение состояния датчиков
		device = device + '/' + cell;
		device = (device === opened) ? 'opened' : 'closed';

		dev['garage-door']['sensor_' + device] = state;

		// принимаем только положительное значение
		if (!state) return;

		defineAlias('state_opened', opened);
		defineAlias('state_closed', closed);

		dev['garage-door/status'] = (state_opened && !state_closed) ? 'OPEN' : 'CLOSED';
	}
});

defineRule('garage-door-trigger', {
	whenChanged: [button, 'garage-door/move'],
	then: function(state) {
		if (!state) return;
		
		// wb: проблемное место = при перезагрузке сервиса происходит ложное срабатываение, так как правило
		// срабатывает на не валидные значения при служебной процедуре 10 -> null -> 10

		// в качестве временной меры вместо строчки в начале правила поставили такой фильтр:
		// if (state <= 0 || state !== true && state !== parseInt(state, 10)) return;

		defineAlias('state_opened', opened);
		defineAlias('state_closed', closed);
		defineAlias('status', 'garage-door/status');

		if (!state_opened && !state_closed)
		{
			switch (status) {
				case 'OPENING': status = 'STOP-CLOSED'; break;
				case 'CLOSING': status = 'STOP-OPEN'; break;
				case 'STOP-OPEN': status = 'OPENING'; break;
				case 'STOP-CLOSED': status = 'CLOSING'; break;
			}
		}
		else
		{
			status = state_opened ? 'CLOSING' : 'OPENING';
		}

		dev[action] = true;

		setTimeout(function () {
			dev[action] = false;
		}, 500);
	}
});

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

1 лайк