И так, послу бурного обсуждения в чате постараюсь написать все заново и более конкретно:
Кратко предыстория, живу в стройке, ПНР системы провожу после работы по вечерам и ночам. В поселке тоже стройка - часто отключают электричество. Я изучил вдоль и поперек всю документацию по wb-rules и кучу веток форума.
На данный момент, в конкретно рассматриваемой ситуации используем Контроллер+MCM8+любое реле.
Изначально мной было взято типовое правило из Wiki по обработке счетчиков нажатий.
В процессе проживания обнаружил, что после отключения электроэнергии и последующим ее включением - ВСЕ правила, в которых код формата -
whenChanged: "wb-mcm8_20/Input 1 Single Press Counter"
реагируют, то есть у меня включается ВЕСЬ свет дома.
Затем обнаружил, что аналогичная ситуация происходит, когда я меняю какие либо параметры любых устройств в драйвере serial (после нажатия кнопки сохранить - происходить перегрузка драйвера с очисткой и последующим наполнением топиков устройств)
Аналогичная ситуация произошла когда я выключал/включал V-out на контроллере.
После недолгих поисков я понял в чем загвоздка: происходит очистка в null топика, а затем его наполнение (Например, в счетчике было значение 10, я перезагрузил контроллер - в топик прилетело значение null - под этим я подразумеваю полностью пустое значение в топике, потом (после загрузки) подгрузилось обратно значение 10, соответсвенно WhenChanged обработал изменение топика)
Я сделал попытку внедрить в код несколько проверок, но результата не получил. На данный момент у меня в работе используется следующий код:
Спойлер
function buttonSinglePress(name, input, output) {
var topic = input + " Single Press Counter";
var counter = dev[topic];
defineRule({
whenChanged: topic,
then: function(newValue, devName, cellName) {
log.debug("button:{} device:{}, cel:{} val={} counter={}", name, devName, cellName, newValue, counter);
if (newValue > 0 && counter !== null && newValue != counter) {
log.debug("Реле переключено {}", output);
dev[output] = !dev[output];
}
counter = newValue;
}
});
}
buttonSinglePress("tualetvent", "wb-mcm8_138/Input 4", "wb-mr6cu_43/K5");
buttonSinglePress("masterwent", "wb-mcm8_203/Input 4", "wb-mr6cu_26/K3");
buttonSinglePress("garderob", "wb-mcm8_211/Input 4", "wb-mr6cu_44/K6");
buttonSinglePress("spalnya", "wb-mcm8_211/Input 5", "wb-mr6cu_44/K3");
buttonSinglePress("zal1", "wb-mcm8_211/Input 7", "wb-mr6cu_58/K4");
buttonSinglePress("zal2", "wb-mcm8_211/Input 8", "wb-mr6cu_58/K5");
buttonSinglePress("divan2", "wb-mcm8_211/Input 2", "wb-mr6cu_58/K5");
buttonSinglePress("vhod1", "wb-mcm8_138/Input 1", "wb-mr6cu_54/K2");
buttonSinglePress("vhod2", "wb-mcm8_138/Input 2", "wb-mr6cu_54/K3");
buttonSinglePress("kuhnya-stena", "wb-mcm8_138/Input 5", "wb-mr6cu_54/K5");
buttonSinglePress("kuhnya2", "wb-mcm8_138/Input 6", "wb-mr6cu_54/K4");
buttonSinglePress("bra1", "wb-mcm8_203/Input 1", "wb-mr6cu_53/K5");
buttonSinglePress("bra2", "wb-mcm8_203/Input 7", "wb-mr6cu_53/K2");
buttonSinglePress("detskay", "wb-mcm8_138/Input 7", "wb-mr6cu_58/K3");
buttonSinglePress("detskay", "wb-mcm8_138/Input 8", "wb-mr6cu_58/K2");
По сути, от правила я ожидаю, что оно отработает только когда значение счетчика увеличилось (даже если принять редкий пропуск сработки при переполнении счетчика) и не будет реагировать на какие-либо служебны ситуации вроде перегрузки контроллера - возвращаясь к примеру где было 10 - потом null - потом опять 10, ведь по факту “полезное” значение счетчика осталось без изменений.
Проблема сохраняется. Прошу о помощи…