Правило для импульсного счётчика воды

Вы в контрол виртуального устройства (то, что отображается у вас на экране в WEB интерфейсе) публикуете НЕ форматированное значение

dev[deviceName+”/impuls_3”] = newValue + 0.01;

В то время как в лог вы выводите (предварительно считав из контрола не форматированное значение) значение с форматированием “три знака после запятой” т.е. .toFixed(3)

log (“newValue = “, newValue.toFixed(3));
...
log (“сумма = “, (dev[deviceName+”/impuls_3”]).toFixed(3));

Вывод (решение) - опубликуйте в контрол предварительно отформатированное значение.

Рекомендую не использовать переменную newValue на все случаи жизни - это усложняет чтение кода ив какой-то момент времени может сыграть злую шутку (неконтролируемое изменение значения).
Опять же, как рекомендация (чтобы научиться разбираться в подобных проблемах самостоятельно) - не стесняйтесь делить задачу на мелкие шаги и контролировать (log()) каждый шаг, например:

if (newValue === true) {

//  Считать текущее значение контрола
    var CurrentValue = dev[deviceName+”/impuls_3”];

//  Проверим, а что там считалось?
   log (“Из контрола мы считали вот это  = “, CurrentValue);

// инкрементируем значение контрола на величину "шага" 0.01
   var NextStep = CurrentValue + 0.01;

// Посмотрим, а что там получилось и в каком виде представлено?
   log (“Инкрементировали значение на  0.01  и получили вот это  = “, NextStep);

// Ух ты! бардак! А что если отформатировать значение?
   var NextStepFormated = NextStep.toFixed(3) ;

// Проверим, а что там получилось после форматирования?
   log (“Отформатировали полученное значение до трех знаков после запятой = ",  
   NextStepFormated, " Получилось ли то, что ожидали? );

// Если все получилось как надо, то публикуем значение в контрол
   dev[deviceName+”/impuls_3”] = NextStepFormated;

// И что же теперь имеем в контроле? Считаем значение в лог.. 
   log (“Что же в итоге получили? Сумма = “, dev[deviceName+”/impuls_3”] );
}

Это, естественно, отладочный фрагмент кода, который расставит вам все точки над Ё
После этого удалите из кода все лишнее , как минимум вывод в логи - не стоит плодить файлы логов большого размера и содержащие много ненужного в нормальной работе “мусора”, и пользуйтесь.
Комментарии лучше оставлять в коде (если вы еще не супер спец в программировании, который одним взглядом на листинг из полторы тысячи строк легко разберется в логике работы скрипта и за одно обнажить ошибки в коде или логике его работы :slight_smile: )

PS код выше я не проверял - писал сразу в чат “в живую”. Надеюсь все запятые там на месте :slight_smile:

PPS у элементов виртуального устройства есть нет свойства precision (см, например, тему Количество знаков после запятой )- т.е. значение контрола будет “отформатировано” с указанной точностью, но у меня не всегда это срабатывает, поэтому я “по старинке” сам форматирую значения перед выводом их в контролы виртуальных устройств.

PPPS безусловно, приведенный выше код можно сократить буквально до одной/двух строк. Он может стать менее “читаемым” для новичка, но от этого не утратит своей функциональности и заодно сократит размер “портянки” скрипта

Удачи в освоении!