Тема уже поднималась.
Прикольно наблюдать как отрываются ворота при скачке напряжения и загрузки контроллера)
Всё таки понимание whenChanged
со стороны пользователей звучит как «когда значение изменилось», и несомненно это касается штатной работы контроллера и сервисов в нём.
Мы ждем «валидное» (контроллируемое) изменение счетчиков, в том числе и при переполнении (переходе на 0).
Соотвественно все служебные вещи, такие как перезагрузка контроллера, сервиса mqtt-serial
и прочего, не должны триггерить правила wb-rules
в части смены значений счетчиков. Давайте отделять зерна от плевел.
Служебная отработка 10->null->10
приводит к двойной сработке 10->null, null->10
из за чего происходит сработка правил. Как пониманию если исклбчить запись null
, то из-за смены 10->10
ничего не изменится и правило не сработает = желаемый результат.
Прочие проверки с отвалом устройств логичнее делать через meta/error
, а не какими-то вычислениями и предположениями.
Разнес обсуждение по разным темам.
Подскажите пожалуйста, актуальна ли проблема с ложным срабатыванием выходов для вас?
По каналам управления:
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);
}
});
В данный момент проблема решается на глобальном уровне у разработчиков.
По окончанию работ я вас оповещу.
Добрый день!
Наши разработчики исправили проблему с возможным ложным срабатыванием правил. Прошу обновиться на крайнюю прошивку и проверить, устранена ли проблема.
Если проблема будет проявляться, прошу создать новую тему и прикрепить ссылку на данную тему.