В связи с выходом крупного обновления 5.9.х, приглашаем вас принять участие в вебинаре 09.06.2022 в 15:00. Участвовать

Преобразование входных данных с помощью плагина megad



  • Плагин MegaD имеет широкие возможности для корректировки/расчета входных значений. Имеется как минимум две возможности:

    1. "Формула расчета входного значения" (в свойствах канала плагина переходим на вкладку "Обработка" и видим это поле)
    2. "Функция обработки значения" (в свойствах канала плагина на вкладке "Канал" включаем чек-боксом "Использовать функцию обработки при получении данных от контроллера" и ниже появляется поле "Функция обработки значения")

    В первом варианте происходит обработка значений полученных от плагина на уровне ядра, во втором варианте обработка значений, поступающих от контроллера, выполняется на стороне плагина и результат обработки передается ядру системы.

    Таким образом, входные данные с датчика можно сразу "скорректировать" и у устройства будет отображаться нужное значение.

    Примеры использования "Формула расчета входного значения"
    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 позволяет оставаться системе вентиляции и поддержания микроклимата в стабильном состоянии, то же справедливо для датчика освещенности, который является составляющим элементом системы освещения.


Log in to reply