Руководство пользователя
Версия 7.6
×

Формулы

 
Для вычисления значений параметров могут быть использованы формулы.
Формула может начинаться с любого арифметического операнда или знака "=".
Если формула начинается с арифметического операнда, то значение параметра вычисляется.
На рисунке 1  формула применяется для настройки параметра IN1.
Финальное значение параметра будет вычислено по формуле IN1 * 0,5.
 
Рисунок 1.
 
На рисунке 2 при получении параметра IN1, описанному датчику будет присвоено значение вычисленное по формуле IN2 *+ 20.
 
Рисунок 2.
 
Простые формулы
Формулы в обработчиках данных строятся на базе синтаксиса языка PHP и исполняются на сервере при обработке данных для конвертации их в нужный формат.
Формула может быть простой и начинаться непосредственно со знака арифметической операции. Поддерживаются операции прибавить ( + ), отнять ( - ), умножить ( * ), разделить ( / )  , так же поддерживаются круглые скобки для обеспечения правильной последовательности выполнения операции.
Например:
*10 - исходное значение будет умножено на 10
/1000 - исходное значение будет разделено на 1000 
/100+7 - исходное значение будет разделено на 100 и к получившемуся результату будет прибавлено 7
/100+(7*3-2)*4 
В формулу могут подставляться данные из других полей данных , скорость и количество спутников.
Для подстановки значений в формулу их нужно поместить в экранирующие символы %%.
Для скорости используется переменная %S% 
Для количества спутников %P%  или %satsinview%
Для unixtimestamp текущего пакета используйте переменную %ts% 
Для unixtimestamp предыдущего пакета переменную %ts1%. Значение текущего датчика может быть подставлено переменной %value% .
Чтобы получить разницу в секундах относительно предыдущего пакета нужно вычислить  %ts1%-%ts%
Для всех остальных значений из пакета устройства берутся названия так как они присылаются драйвером.
Например: %DIN1%     %DIN2%      %HDOP%
 
 
Пример формулы с переменными:
*%DIN1% - умножить исходное значение на значение присылаемое в поле DIN1
/%HDOP% - разделить исходное значение на значение из поля HDOP
 
  • Сложные формулы
Более сложные формулы начинаются со знака = и не используют исходное значение. Но его можно подставить в саму формулу с помощью переменной %value% либо переменной с именем поля. 
Например:
=(1+2) - конечное значение будет равно 3
=(7/%value%) -конечное значение будет равно 7 деленному  на исходное значение 
 
Условные операторы
В формулах могут использоваться условия которые обеспечивают ветвление логики расчета зависящей от значений каких либо параметров или результатов операций.
Нотация условных операторов выглядит так: условие ? значение_если_да  :  значение_если_нет 
 Обычно такую запись называют — тернарный оператор.
Логически это выражение идентично выражению: 
 если условие вернуть значение_если_да иначе вернуть значение_если_нет
 
В условиях могут использоваться  операторы сравнения равно ( == ), больше ( > ), меньше ( < ), больше или равно ( >= ), меньше или равно (  <= ), не равно ( != )  
 
Например:
- если значение поля DIN1 равно 1 то конечное значение будет 22 иначе конечное значение будет равно 33
=(%temp%>30)? %temp%*10 : %temp%*20 - если значение поля temp больше 30 то конечное значение будет равно значению поля temp умноженному на 10 иначе конечное значение будет равно значению поля temp умноженному на 20.
 
Функции
В формулах могут использоваться некоторые PHP функции для преобразования данных.
Это функции unpack, pack, array_sum, substr, round, hex2bin, dechex, hexdec, decbin, number_format, max, min, abs, str_replace, time, strrev, bytesrev, explode, sqrt, acos, asin, cos, sin, pow.
 
Передаваемые этим функциям значения и возвращаемые значения можно прочитать в документации PHP https://www.php.net/manual/ru/function.acos.php
 
Например:
=substr("%FIELD%", 1, 2) - конечное значение будет равно 2 символам из строки передаваемой в поле FIELD начиная с позиции 1
=round(%AIN1%/1000) - конечное значение будет равно округленному значению частного от деления значения поля AIN1 на 1000
 
Деление на 0 
 
Чтобы избежать непредсказуемых разультатов при обработке значений датчиков следует избегать переменных в роли делителя или использовать условные операторы для проверки их на 0
Например:
=1000/%DIN1% - может породить ошибку вычисления в случае если значение поля DIN1 не определено или равно 0. В таком случае формулу нужно переписать так:
=(%DIN1%==0) ? 0 : 1000/%DIN1% - если значение поля DIN1 равно 0 то конечное значение равно 0 иначе конечное значение равно частному от деления 1000 на значение поля DIN1 
 
  • Формула преобразования безнакового числа в число со знаком на примере Tелтоники
     
Если температурный блютуз датчик подключенный к Телтоники (Teltonika EYE Sensor) присылает отрицательную температуру,
то ее можно преобразовать следующей формулой.
=((%BLE_T1%>3000)?((%BLE_T1%-65535)/100):(%BLE_T1%/100))
 
Пример датчика температуры с формулой
 
 
  • =bytesrev('%value%')
    Чтобы перевернуть шестнадцатеричные байты, следует использовать следующую  функцию bytesrev('%value%'):
    Пример
    0123d848010000e5 -> e500000148d82301
     
  • =strrev('%value%')
    Чтобы перевернуть строку, следует использовать следующую  функцию strrev('%value%'):
    Пример
    0123d848010000e5 -> 5e000010848d3210
     
  • =hexdec('%Param1%') - перевод 16-тиричного числа в десятичное.
 Пример:
 PAram1=0A, в этом случае функция вернет значение 10.
 
  • =decbin('%Param1%') - перевод десятичного в двоичное.
substr('%Data%',x,y) - поиск подстроки длиной в "y" в строке "Data" начиная с позиции "x"
Примеры:
Param1=A6B1
substr(decbin(hexdec('%Param1%')),9,1), формула вернет значение 0.
 
  • =explode(',','%value%')[2]
explode — Разбивает строку с помощью разделителя и возвращает массив строк.
=explode('delimiter','%value%')[2]
delimiter - разделитель
value - строка, которую необходимо разделить.
 
 
  • acos - Функция acos возвращает арккосинус числа, то есть угол, косинус которого равен этому числу. Угол измеряется в радианах.
     
  • asin - Функция asin возвращает арксинус числа, то есть угол, синус которого равен этому числу. Угол измеряется в радианах.
     
  • cos -  одна из основных тригонометрических функций, определяемая как отношение прилежащего катета к гипотенузе в прямоугольном треугольнике.
     
  • sin - дна из основных тригонометрических функций, которая для острого угла в прямоугольном треугольнике определяется как отношение противолежащего катета к гипотенузе т.е дна из основных тригонометрических функций, которая для острого угла в прямоугольном треугольнике определяется как отношение противолежащего катета к гипотенузе.
 
 
=strtoupper(substr(unpack('H*',strrev(hex2bin($value)))[1],2,12))
Преобразование последовательности байт little endian в big endian
Последовательность в hex '1500000124286b01'
Преобразование в последовательность 6B2824010000