Использование jinja2 в шаблонах wb-mqtt-serial.
Описание
Использование Jinja2 в шаблонах wb-mqtt-serial — это метод создания динамических конфигурационных файлов для драйвера устройств Wiren Board. Шаблонизатор Jinja2 позволяет автоматизировать описание однотипных каналов (регистров), уменьшая объем кода и снижая риск возникновения ошибок при ручном копировании.
С помощью циклов, условий и арифметических выражений Jinja2 превращает статический JSON-файл в гибкий инструмент настройки оборудования.
Как хранятся в Wiren Board
В репозитории wb-mqtt-serial шаблоны хранятся в формате Jinja2 для автоматизации описания регистров. При сборке пакета они преобразуются в статический JSON, который устанавливается в /usr/share/wb-mqtt-serial/templates/. Это позволяет разработчикам использовать циклы и условия, а драйверу — работать с готовым конфигом без лишней нагрузки.
Основные возможности и синтаксис
При написании шаблонов наиболее востребованы следующие конструкции:
Циклы (for)
Используются для массового создания каналов с инкрементируемыми параметрами.
{% for i in range(0, 64) -%}
/* Параметры канала */
{% endfor -%}
Переменные и арифметика
Внутри цикла можно обращаться к итератору и производить с ним вычисления (например, для вычисления адреса регистра):
Имена каналов:
"name": "Device {{i}} Brightness"
Адреса регистров:
"write_address": "{{256 + i}}"
Условные операторы (if)
Позволяют задавать логику поведения для конкретных элементов (например, активировать по умолчанию только первый канал):
{% set enabled = 'true' if i == 0 else 'false' -%}
"enabled": {{enabled}}
Работа с синтаксисом JSON (запятые)
Одной из особенностей генерации JSON является необходимость отсутствия запятой после последнего элемента списка. В Jinja2 это решается проверкой индекса:
{% set comma = ',' if i != 63 else '' -%}
{
/* Тело объекта */
}{{comma}}
Генерация итогового JSON-файла
Для проверки корректности работы шаблона (рендеринга) и получения чистого JSON-файла используется утилита командной строки j2cli.
Установка утилиты:
sudo apt update && sudo apt install j2cli
Генерация файла: Для преобразования шаблона (например, template.json.jinja) в готовый конфиг выполните:
j2 template.json.jinja -o template.json
Пример реализации
Ниже представлено сравнение: как выглядит задача в обычном JSON и как она решается с помощью Jinja2.
Целевой результат (фрагмент JSON)
[
{
"name": "Device 0 Brightness",
"write_address": "256",
"enabled": true
},
{
"name": "Device 1 Brightness",
"write_address": "257",
"enabled": false
}
/* ... и так далее до 63 ... */
]
Оптимизированный шаблон Jinja2 Использование шаблонизатора позволяет заменить сотни строк кода компактным блоком:
{% for i in range(0, 64) -%}
{% set enabled = 'true' if i == 0 else 'false' -%}
{% set comma = ',' if i != 63 else '' -%}
{
"name": "Device {{i}} Brightness",
"write_address": "{{256 + i}}",
"reg_type": "holding",
"type": "range",
"format": "u16",
"enabled": {{enabled}},
"min": 0,
"max": 254
}{{comma}}
{% endfor -%}