Увы, такое условие не отсекает скидывание счетчика в 0 при пропадании питания модуля.
Как оказалось, простое управление светом через правила превращается в сложный код, догадаться до которого практически невозможно.
Мне видится, что на уровне пользователя механизм должен быть простым и понятным: изменился счетчик, произошло срабатывание.
function button(name, input, output) {
defineRule({
whenChanged: input + " Single Press Counter",
then: function (newValue, devName, cellName) {
dev[output] = !dev[output];}
)};
Это все.
В текущем варианте на уровень пользователя ложится довольно низкоуровневые особенности реализации.
А именно, он должен знать и учитывать:
- при перезагрузке mqtt-драйвера топик со счетчиком переходит в COUNT->null → COUNT, что обрабатывается правилом whenChanged, куда приходит newValue=COUNT. Это нужно отсекать вручную. А это оказалось не так просто. так как при старте может еще не быть устройства из которого можно достать текущий счетчик. Это тоже нужно знать
- при потере питания модуля, счетчик сбрасывается на 0. А правилах снова срабатывает whenChanged с newValue=0. Это снова нужно отсекать.
Я постарался написать код, который учтет все эти моменты, но выглядит это как адские костыли.
function buttonSinglePress(name, input, output) {
var topic = input + " Single Press Counter";
var counter = dev[topic];
defineRule({
whenChanged: topic,
then: function(newValue, devName, cellName) {
if (newValue > 0 && counter !== null && newValue != counter) {
dev[output] = !dev[output];
}
counter = newValue;
}
});
}
У меня есть сильное ощущение, что оба эти момента можно учесть на уровне движка правил.
- при перезагрузке драйвера не нотифицировать COUNT->null → COUNT, если значение не изменилось
- при сбросе счетчика в 0 (при потере питания модуля) записывать это значение “втихую” в топик, и не вызывать whenChanged. Наверное тут можно ориентироваться на uptime модуля.
Мне кажется это очень важным, так как мало кто будет писать подобный “безопасный” код, а такие сайд эффекты могут привести к включению света по ночам или непроизвольному открытию ворот в доме.