Преобразование входных данных с помощью плагина megad
-
Плагин MegaD имеет широкие возможности для корректировки/расчета входных значений. Имеется как минимум две возможности:
- "Формула расчета входного значения" (в свойствах канала плагина переходим на вкладку "Обработка" и видим это поле)
- "Функция обработки значения" (в свойствах канала плагина на вкладке "Канал" включаем чек-боксом "Использовать функцию обработки при получении данных от контроллера" и ниже появляется поле "Функция обработки значения")
В первом варианте происходит обработка значений полученных от плагина на уровне ядра, во втором варианте обработка значений, поступающих от контроллера, выполняется на стороне плагина и результат обработки передается ядру системы.
Таким образом, входные данные с датчика можно сразу "скорректировать" и у устройства будет отображаться нужное значение.
Примеры использования "Формула расчета входного значения"
1.1 Умножение, деление и смещение значения:value/10 value*10 value + 1.5 (есть баг, поэтому пишем Number(value)+1.5) value - 0.69 (есть баг, поэтому пишем Number(value)-0.69)
1.2 В случае не RGB, а китайских GRB-лент для адекватной работы с ними:
[ value[1],value[0],value[2] ]
1.3 Расчет значения с аналогового датчика давления, подключенного к АЦП контроллера MegaD:
((value * 3.47/1024) - 0.5) * 2.8, где: 3.47 - это реальное (нужно измерять) напряжение 3.3В на контроллере MegaD, которое используется в качестве опорного для АЦП.
1.4 "Экзотические" формулы:
( ((840 - Number(value))/840) - 410 ) *100 - расчет значения влажности (в %) для аналогового датчика влажности почвы; 100 - (Number(value) - 20)*100/85 - преобразование расстояния в % для HC-SR04 (value>=20 && value<= 105) ? Math.round(100 - (Number(value) - 20)*100/85) : (value <20 ? 100 : 0) - то же, с округлением в максимумах.
Примеры использования "Функция обработки значения".
По сути это JS-скрипт и он может вернуть значение или undefined. Входные параметры:
val — значение c контроллера
depo — объект, который хранит данные между вызовами функции. Внутри объекта можно создавать любые структуры.2.1 Накопление массива данных, откидывание "бракованных" (максимальное и минимальное значение) и усреднение оставшихся. Актуально для датчиков температуры/влажности/давления/освещенности и т.д., особенно которые участвуют в управлении какими-либо процессами.
function (val, depo) { var avr; if (!depo.res) depo.res = []; depo.res.push(val); //Нужны еще измерения, значение не возвращаем if (depo.res.length < 5) return; //Иначе сортируем и усредняем "средние" значения else{ depo.res.sort(); avr = ((depo.res[1] + depo.res[2] + depo.res[3]) / 3).toFixed(2); } depo.res = []; //Перед следующими измерениями сбрасываем массив return avr; //Возвращаем значение }
2.2 То же, но с расчетом конечного значения. Актуально для датчиков, которые подключены к АЦП контроллера. В примере ниже - формула для аналогового датчика давления:
function (val, depo) { var result; var avr; if (!depo.res) depo.res = []; depo.res.push(val); //Нужны еще измерения, значение не возвращаем if (depo.res.length < 5) return; //Иначе сортируем и усредняем "средние" значения else{ depo.res.sort(); avr = ((depo.res[1] + depo.res[2] + depo.res[3]) / 3).toFixed(2); } result = (((avr * 3.47/1024) - 0.5) * 2.8).toFixed(2); depo.res = []; //Перед следующими измерениями сбрасываем массив return result; //Возвращаем значение }
Чтобы накапливать данные и усреднять значения, я устанавливаю период опроса для большинства датчиков равный 60 секундам. Таким образом, данные накапливаются 5 минут и спустя это время устройству присваивается усредненное за последнюю пятиминутку значение. Оно же пишется в БД, соответственно, БД не "раздувается". Усредненное значение температуры очень актуально для системы отопления (сквозняки, ветер и прочие кратковременные факторы не приводят к резкому уменьшению температуры, соответственно система не замечает этого), усредненное значение влажности или уровня СО2 позволяет оставаться системе вентиляции и поддержания микроклимата в стабильном состоянии, то же справедливо для датчика освещенности, который является составляющим элементом системы освещения.