LoRa FS - Структура шаблонов
Описание структуры, параметров и правил для создания и редактирования LoRa-шаблонов
В шаблонах для LoRa описывается состав и формат данных, передаваемых между Node и Gateway, а также технические параметры и общая информация о шаблоне.
Шаблоны хранятся в файловой системе контроллера, выступающего в роли шлюза LoRa Gateway.
- файлы шаблонов имеют расширение
.lr - для доступа к файлам через веб-интерфейс используется вкладка EasyFS
Секции
Файл шаблона разделён на секции (или группы), каждая из которых содержит ряд связанных элементов описания.
LoRa-шаблоны используют синтаксис и структуру (упрощённый вариант), во многом схожую с Modbus-шаблонами.
Типы секций
В LoRa-шаблонах применяется два типа секций:
[main]- базовая секция, может содержать версию шаблона и другую общую информацию[sensors]- секция "датчиков". Секция для описания передаваемых параметров
Секция [main]
Общие параметры шаблона. Может содержать:
- ver - версия шаблона (актуально для шаблонов из каталога)
- type - тип (актуально для авто-сгенерированных шаблонов)
- type=1 - шаблоны от контроллеров Lavritech Node (применяется в файлах вида
loralocalN.lr)
- type=1 - шаблоны от контроллеров Lavritech Node (применяется в файлах вида
Секция [sensors]
Определяет формат передаваемых параметров (например, из списка метрик Node). Все возможные типы связей с системными параметрами (Sensors, GPIO, PWM) описываются через эту секцию.
В одном шаблоне может быть несколько секций этого типа.
Каждая секция описывает состав одного LoRa-пакета.
Секция может содержать следующие элементы:
- fport - если присутствует, то устанавливает фильтр для секции по этому полю LoRa-пакета.
- fport (число от 1 до 223) - позволяет указать виртуальный канал приёма данных
- для авто-сгенерированных шаблонов fport назначается автоматически
- если в шаблоне несколько секций
[sensors]- fport указывать обязательно, он должен быть уникальным для каждого пакета в общей группе пакетов от Node
- mask — список элементов, описывающий порядок и тип передаваемых значений в пакете.
- определяет в каком порядоке и формате расшифровываются данные из пакета.
- элементы в маске перечисляются через запятую. Каждый элемент маски соответствует одному значению.
Дополнительно
Для справки можно также использовать описание формата маски из Modbus-шаблонов.
LoRa-шаблоны частично поддерживают этот синтаксис.
Передача параметров
Здесь показан пример для передачи трёх параметров разных типов: Sensors, GPIO, PWM.
За основу взят сгенерированный шаблон из Node (маска из секции [sensors])
- e2, e1, e2 - в данном случае определяет порядок и количество байт на значение.
- Sensors может передавать как двумя, так и четырьмя байтами, в зависимости от значения
- GPIO - занимают 1 байт
- PWM - 2 байта
- t - указывает тип метрики (тип значения). Здесь показаны основные типы для LoRa.
- t0 - стандартный тип для Sensors-параметров. Таблица возможных типов метрик для Sensors-параметров указана в описании Modbus-шаблонов.
- t1 - тип для GPIO
- t2 - тип для PWM
Формирование маски - поле mask
В процессе применения маски данные из LoRa-пакета преобразуются в значения переменных.
К ним могут быть применены специальные правила для интерпретации (извлечения) значения из пакета, а также некоторые математические операции.
В конце маски для переменной можно указать тип метрики для более удобного вывода её значения на главной странице.
Маски для чтения значений переменных из LoRa-пакета составляются по определённым правилам.
Поле mask может содержать несколько масок для переменных.
Маски для переменных перечисляются в поле mask через запятую.
При написании маски допустимо опускать число "1" (например, маски e1t0 и et0 идентичны)
Параметры
Ниже описаны параметры, которые применяются для формирования маски для переменной:
Примечание. Параметры маски выделены значками:
- обязательный параметр;
- дополнительный параметр
dX - делитель
/10,/100,/1000-
Описание параметра
Добавляет запятую после нужного разряда
Параметр позволяет преобразовать целое значение переменной (после извлечения из пакета) в дробное значение:
- d1 - вывод одного знака после запятой (значение переменной / 10)
- d2 - вывод 2-х знаков после запятой (значение переменной / 100)
- d3 - вывод 3-х знаков после запятой (значение переменной / 1000)
Например, значение 1234 с маской
e2d2дает число 12,34Если необходимо уменьшить точность, и совсем убрать знаки после запятой - нужно вместо параметра d использовать деление через математическое выражение. Например: для 32-разрядной переменной используем конструкцию вида:
e4[/100], вместоe4d2 mX - множитель
x10,x100,x1000-
Описание параметра
Умножает значение переменной на множитель, кратный 10.
Значение множителя определяетX(maxX=9)- m1 - x10
- m2 - x100
- m3 - x1000
- ...
i - параметр указывает, что число имеет знак
f - float переменная
-
Описание параметра
Вывод значений с плавающей запятой из LoRa-пакета
Используются подпараметры fa и fb в зависимости от порядка байт в пакете.
Дополнительно можно указать количество знаков после запятой, по умолчанию 2. l - модификатор типа: приводит 32 bit переменную к 16 bit
e4l-
Описание параметра
e4l - выражение такого вида служит для приведения 32-разрядных значений к 16 разрядам.
При этом старшая часть числа (старшие 16 бит) будет отброшена!Внутреннее пространство переменных прошивки является 32-битным, но есть несколько опций, которые не имеют возможности полноценной работы с 32-битными значениями. Например переменные в опции "Термостат" и передаваемые метрики в опции "Lora" часто используют 16-битные значения. Модификатор "l" может быть полезен, когда нужно адаптировать данные из LoRa-пакета под использование в подобных случаях.
Модификатор l может указываться также после делителя d.
Примеры идентичных масок с использованием модификатора:e4d2l,e4ld2 tX - указывает тип переменной (тип метрики)
-
Список типов метрик
- t0 - неизвестный датчик c положительными (+) целыми значениями - 16 или 32 bit (uint16_t, uint32_t)
- t1 - тип для GPIO (дискретные значения 0/1)
- t2 - тип для PWM (числовые значения)
- t3 - температура (Temperature), °C (поддерживаются отрицательные значения)
- t4 - относительная влажность (Humidity), %RH
- t5 - давление (Pressure), mmHg
- t6 - значение счётчика (Counter)
- t7 - освещённость (Light), люкс (лк, lux)
- t8 - концентрация CO2, ppm (миллионная доля)
- t9 - напряжение (Voltage), В (V)
- t10 - ток (Current), A (поддерживаются отрицательные значения)
- t11 - мощность (Power), Вт (W), (Ватт)
- t12 - энергия (потребление электроэнергии), кВт*ч (Energy) (киловатт-час)
- t14 - неизвестный датчик c знаковыми (+/-) целыми значениями - 16 или 32 bit со знаком (int16_t, int32_t)
- t16 - уровень сигнала (RSSI), Дб (db) (поддерживаются отрицательные значения)
- t17 - заряд батареи (Battery), %
- t18 - вес (Weight)
- t19 - угол (Angle)
- t20 - плодородие (Fertility)
- t21 - расстояние (Distance)
- t22 - радиация (Radiation)
- t24 - частота (Frequency), Гц (Hz)
- t25 - PMS1.0 (наличие частиц размером 0.3–1 мкм), мкг/м3 (mkg/m3)
- t26 - PMS2.5 (наличие частиц размером 1–2.5 мкм), мкг/м3 (mkg/m3)
- t27 - PMS10 (наличие частиц размером 2.5-10 мкм), мкг/м3 (mkg/m3)
- t29 - качество воздуха (концентрация VOC), ppb (миллиардная доля)
Тип указывается в конце маски для переменной, пример:
e2d2t7- освещенность sX - пропуск
Xбайт-
Описание параметра
Иногда в LoRa-пакете необходимы не все данные.
Чтобы пропустить часть байт применяется параметр s с указанием количества байт для пропуска (X).Внимание! sX не сработает, если пропускаемых байт не существует в пакете!
В этом случае нужно будет создать новую секцию[sensors]с другим fport для обработки другого пакета.
Математические выражения
// обычная маска: mask=e2t0,e2t0
// добавляем умножение на коэффициент 1,6 для первой переменной
mask=e2t0[*16/10],e2t0
Для значений переменных, полученных в результате применения маски, существует также возможность пост-обработки в виде применения математических выражений. Для этого в конец маски нужной переменной в квадратных скобках [] добавляется дополнительная логическая группа.
Математические выражения позволяют применять нестандартные множители и смещения - то есть осуществлять пересчёт или корректировку изначальных значений переменных.
В поле mask возможно применение различных выражений для каждой из переменных по-отдельности.
Список доступных операций:
+- сложение-- вычитание*- умножение/- деление%- получение остатка от деления&- наложение битовой маски
Порядок выполнения операций
Математические операции будут производиться последовательно слева-направо.
Рассмотрим выполнение операций на примере:
e2t0[*16/10-45/4]
Операции происходят в следующей последовательности:
- *16
- /10
- -45
- /4
Примеры чтения значения одного бита из байта LoRa-пакета
В LoRa-пакетах часто встречаются байты статуса, где каждый бит имеет своё назначение.
Байт состоит из 8-ми бит (с порядковыми номерами от 0 до 7).
Бит 0 - младший. Бит 7 - старший.
Ниже показаны примеры, как при помощи операций битовой маски и деления отфильтровать значение и прочитать только нужный бит из байта.
- бит 0 -
mask=e1t0[&1] - бит 1 -
mask=e1t0[&2/2] - бит 2 -
mask=e1t0[&4/4] - бит 3 -
mask=e1t0[&8/8] - бит 4 -
mask=e1t0[&16/16] - бит 5 -
mask=e1t0[&32/32] - бит 6 -
mask=e1t0[&64/64] - бит 7 -
mask=e1t0[&128/128]
Назначение MQTT-топиков
Для Sensors-параметров существует возможность использовать уникальные названия MQTT-топиков для метрик.
Для этого в маске в фигурных скобках нужно указать короткий текст.
Расшифровка маски:
- e2t0{temp} - Температура, °C
- e2 - читаем 2 байта
- t0 - тип метрики (стандартный для Sensors)
- temp - имя MQTT топика
- e2t0{hum} - Влажность, %RH
- e2 - читаем 2 байта
- t0 - тип метрики
- hum - имя MQTT топика
- e1t1{relay} - Реле (GPIO)
- e1 - читаем 1 байт
- t1 - тип для GPIO
- relay - имя MQTT топика
- e2t0{temp} - Температура, °C
Подробная расшифровка параметров доступна по значку с вопросом в коде примера выше
Допустим, мы настроили устройство на подключение к MQTT-серверу с логином (пользователем) user

Устройство названо TEST_DEVICE (это название высвечивается на главной, можно поменять во вкладке Main).
На вкладке LoRa настраиваем шаблон для приёма данных от Node.
В итоге на MQTT сервер будут отсылаться данные в следующих топиках:
user/TEST_DEVICE/lora/temp- Температураuser/TEST_DEVICE/lora/hum- Влажностьuser/TEST_DEVICE/lora/relay- Реле
По данным топикам можно будет считать показания датчика в соответствии с правилами преобразований из mask
Указание диапазона для PWM
По умолчанию в веб-интерфейсе слайдеры имеют диапазон значений 0-100.
В шаблоне можно указать своё значение в квадратных скобках для PWM:
Математические выражения
// обычная маска: mask=e2t0,e2t0
// добавляем умножение на коэффициент 1,6 для первой переменной
mask=e2t0[*16/10],e2t0
Для значений переменных, полученных в результате применения маски, существует также возможность пост-обработки в виде применения математических выражений. Для этого в конец маски нужной переменной в квадратных скобках [] добавляется дополнительная логическая группа.
Математические выражения позволяют применять нестандартные множители и смещения - то есть осуществлять пересчёт или корректировку изначальных значений переменных.
В поле mask возможно применение различных выражений для каждой из переменных по-отдельности.
Список доступных операций:
+- сложение-- вычитание*- умножение/- деление%- получение остатка от деления&- наложение битовой маски
Порядок выполнения операций
Математические операции будут производиться последовательно слева-направо.
Рассмотрим выполнение операций на примере:
e2t0[*16/10-45/4]
Операции происходят в следующей последовательности:
- *16
- /10
- -45
- /4
Примеры чтения значения одного бита из байта LoRa-пакета
В LoRa-пакетах часто встречаются байты статуса, где каждый бит имеет своё назначение.
Байт состоит из 8-ми бит (с порядковыми номерами от 0 до 7).
Бит 0 - младший. Бит 7 - старший.
Ниже показаны примеры, как при помощи операций битовой маски и деления отфильтровать значение и прочитать только нужный бит из байта.
- бит 0 -
mask=e1t0[&1] - бит 1 -
mask=e1t0[&2/2] - бит 2 -
mask=e1t0[&4/4] - бит 3 -
mask=e1t0[&8/8] - бит 4 -
mask=e1t0[&16/16] - бит 5 -
mask=e1t0[&32/32] - бит 6 -
mask=e1t0[&64/64] - бит 7 -
mask=e1t0[&128/128]
Примеры шаблонов
Допустим, на стороне Node используется такой список метрик:

[main]
type=1
[sensors]
fport=100
mask=e2t0,e2t0,e2t0,e2t0,e2t0,e2t0,e2t0,e2t0,e2t0,e2t0,e1t1,e1t1,e1t1,e2t2,e2t2,e2t2
[main]
type=1
[sensors]
fport=100
mask=e2t0{d1},e2t0{d2},e2t0{d3},e2t0{c1},e2t0{c2},e2t0{c3},e2t0{c4},e2t0{c5},e2t0{c6},e2t0{d12},e1t1,e1t1,e1t1,e2t2[80],e2t2[80],e2t2[80]
Проверка на соответствие
Перед началом эксплуатации шаблона убедитесь, что состав маски в [sensors] соответствует списку метрик на Node. При расхождении маски и реальных каналов возможны некорректные значения на Gateway.
Комментарии
В шаблонах поддерживаются комментарии. Они должны начинаться с новой строки с символа //