Формулы
Для вычисления значений параметров могут быть использованы формулы.
Формула может начинаться с любого арифметического операнда или знака "=".
Если формула начинается с арифметического операнда, то значение параметра вычисляется.
На рисунке 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