Использование jinja2 в шаблонах wb-mqtt-serial.

From Wiren Board
This is the approved revision of this page, as well as being the most recent.

Описание

Использование 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 -%}

Полезные ссылки