Wb-mqtt-serial driver: различия между версиями

Материал из Wiren Board
м (Обновил статью)
Строка 56: Строка 56:
Для каждого порта указываются настройки: скорость, четность и т.п., а также протокол: Modbus, Uniel и т.п. Для каждого устройства обязательно указывается его уникальный адрес на шине — <code>slave_id</code>, остальные параметры указываются по необходимости.  
Для каждого порта указываются настройки: скорость, четность и т.п., а также протокол: Modbus, Uniel и т.п. Для каждого устройства обязательно указывается его уникальный адрес на шине — <code>slave_id</code>, остальные параметры указываются по необходимости.  


Доступные параметры, значения по умолчанию и варианты значений перечислены в примере файла <code>/etc/wb-mqtt-serial.conf</code>:
Структура файла:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
{
{
    // опция debug включает или выключает отладочную печать.
// основные настройки драйвера
    // Опция -d командной строки wb-mqtt-serial также
...
    // включает отладочную печать и имеет приоритет над
    // данной опцией.
    "debug": false,


    // Задаёт интервал в секундах, в течение которого неизменяющиеся значения не будут публиковаться в MQTT.
// порты
    // По истечении интервала полученное значение будет опубликовано, даже если оно не изменилось.
    // Если установлен 0, каждое полученное от устройств значение будет опубликовано в MQTT.
    // Если установлено отрицательное значение, то значения будут публиковаться только при изменении. Это поведение по умолчанию.
    "max_unchanged_interval": -1,
 
    // список портов
     "ports": [
     "ports": [
         {
         {
            // тип порта:
// настройки порта
            // - "serial": последовательные порты RS-485 или RS-232. Это значение выбирается по умолчанию.
...
            // - "tcp": serial over TCP/IP. Пакеты, формируемые для работы с последовательными портами, передаются без изменений через TCP/IP.
            // - "modbus tcp": передача по MODBUS TCP. В секции устройств с таким типом порта могут использоваться только те, что поддерживают MODBUS.
            "port_type": "serial",
 
            // устройство, соответствующее порту RS-485 (если выбран тип порта serial)
            "path" : "/dev/ttyNSC0",
 
            // IP адрес или имя хоста (если выбран тип порта TCP или MODBUS TCP)
            "address": "127.0.0.1",
 
            // TCP порт (если выбран тип порта TCP или MODBUS TCP)
            "port": 3000,
 
            // скорость порта
            "baud_rate": 9600,
 
            // паритет - N, O или E (по умолчанию - N)
            "parity": "N",
 
            // количество бит данных (по умолчанию - 8)
            "data_bits": 8,
 
            // количество стоп-бит
            "stop_bits": 2,
 
            // Минимальный интервал опроса каждого регистра
            // по-умолчанию для устройств, подключенных к порту,
            // в миллисекундах
            "poll_interval": 10,
 
            // Максимальное время ответа устройств, подключенных к этому порту, в миллисекундах
            // Если не установлено, то принимается равным 500 мс
            // Этот параметр задан в шаблонах описания устройств, переопределять его можно только в случае некорректной работы с устройствами
            "response_timeout_ms": 100,
 
            // Дополнительная задержка перед каждой отправкой данных в порт в микросекундах
            "guard_interval_us": 1000,
 
            // Таймаут соединения (только для TCP или MODBUS TCP порта).
            // Если в течение указанного времени ни по одному устройству на порту не поступило данных (а также истек "connection_max_fail_cycles"),
            // TCP соединение будет разорвано и произойдет попытка переподключения
            "connection_timeout_ms": 5000,
 
            // Количество неудачных циклов опроса (только для TCP или MODBUS TCP порта)
            // Если в течение указанного количества циклов опроса ни по одному устройству на порту не поступило данных (а также истек "connection_timeout_ms"),
            // TCP соединение будет разорвано и произойдет попытка переподключения
            "connection_max_fail_cycles": 2,
 
            // включить/выключить порт. В случае задания
            // "enabled": false опрос порта и запись значений
            // каналов в устройства на данном порту не происходит.
            // По умолчанию - true.
            "enabled": true,


             // список устройств на данном порту
             // список устройств на данном порту
             "devices" : [
             "devices" : [
                 {
                 {
                    // тип устройства, в системе должен быть корректный шаблон для этого типа
// описание первого устройства на канале
                    "device_type": "MSU34+TLP",
                     "name": "Device 1",
 
...
                    // отображаемое имя устройства. Публикуется как
                    // .../meta/name в MQTT
                     "name": "MSU34+TLP",
 
                    // уникальный идентификатор устройства в MQTT.
                    // каждое элемент в devices должен иметь уникальный id
                    // topic'и, относящиеся в MQTT к данному устройству,
                    // имеют общий префикс /devices/<идентификатор топика>/...
                    "id": "msu34tlp",
 
                    // идентификатор устройства.
                    // Если не указан или указана пустая строка, то используются широковещательные запросы
                    "slave_id": 2,
 
                    // включить/выключить устройство. В случае задания
                    // "enabled": false опрос устройства и запись значений
                    // его каналов не происходит. По умолчанию - true.
                    "enabled": true,
 
                    // протокол передачи устройства, если не задан, то используется "modbus"
                    "protocol": "modbus",
 
                    // максимальное количество считываемых "пустых" регистров.
                    // Драйвер в целях оптимизации может считывать регистры
                    // "пачкой". При этом, если какие-либо регистры не
                    // были включены в конфигурацию, но в целях ускорения
                    // опроса (чтобы не разрывать "пачку") их всё-таки
                    // можно считывать, можно указать значение max_hole_size
                    // больше 0. В данный момент поддерживается только
                    // устройствами Modbus.
                    "max_reg_hole": 10,
 
                    // то же самое, что max_reg_hole, но для однобитовых
                    // регистров (coils и discrete inputs в Modbus). В данный
                    // момент поддерживается только устройствами Modbus.
                    "max_bit_hole": 80,
 
                    // максимальное количество регистров в одной пакетной операции
                    // чтения. В данный момент поддерживается только устройствами
                    // Modbus.
                    "max_read_registers": 10,
 
                    // Минимальный интервал опроса регистров данного устройства в миллисекундах
                    "poll_interval": 10,
 
                    // Максимальное время ответа устройства в миллисекундах.
                    // Если не установлено, то принимается равным 500 мс.
                    // Если значение этого параметра, установленное для порта, больше указанного здесь, используется значение порта.
                    // Этот параметр задан в шаблонах описания устройств, переопределять его можно только в случае некорректной работы с устройством.
                    "response_timeout_ms": 100,
 
                    // Минимально необходимая задержка между посылками в миллисекундах.
                    // Используется в некоторых протоколах для определения границ посылок.
                    // Этот параметр задан в шаблонах описания устройств, переопределять его можно только в случае некорректной работы с устройством.
                    // По умолчанию 20 мс
                    "frame_timeout_ms": 100,
 
                    // Дополнительная задержка перед каждой отправкой данных в порт в микросекундах.
                    // Если не установлено, то используется значение, заданное в соответствующем параметре порта.
                    "guard_interval_us": 0,
 
                    // (При возникновении ошибки) Интервал после последнего успешного обмена данными с устройством,
                    // по истечении которого (а также "device_max_fail_cycles") устройство будет помечено отключенным и будет опрашиваться в ограниченном режиме
                    "device_timeout_ms": 3000,
 
                    // Количество неудачных циклов опроса устройства
                    // Если в течение указанного количества полных циклов опроса ни по одному регистру устройства не поступило данных (а также истек "device_timeout_ms"),
                    // устройство будет помечено отключенным и будет опрашиваться в ограниченном режиме
                    "device_max_fail_cycles": 2,
 
                    // пароль для доступа к устройству, массив байт
                    "password": [1, 2, 3],
 
                    // уровень доступа при опросе устройства,
                    // используется для обмена с счётчиками электроэнергии
                    "access_level": 1,


                     // список каналов устройства
                     // список каналов устройства
                     "channels": [
                     "channels": [
                         {
                         {
                            // имя канала. topic'и, соответствующие каналу,
//описание канала 1
                            // публикуются как
                            // /devices/<идентификатор канала>/controls/<имя канала>
                            "name" : "Temp 1",
 
                            // тип регистра
                            // возможные значения для Modbus:
                            // "coil" - 1 бит, чтение/запись
                            // "discrete" - 1 бит, только чтение
                            // "holding" - 16 бит, чтение/запись, код функции на запись выбирается автоматически, в зависимости от размера
                            // "input" - 16 бит, только чтение
                            // "holding_single" - то же что и holding однако регистры записываются всегда по одному, кодом 06
                            // "holding_multi" - то же что и holding однако регистры записываются всегда кодом 16
                            "reg_type" : "input",
 
                            // адрес регистра
                            "address" : 0,
 
                            // тип элемента управления, например,
                            // "temperature", "text", "switch"
                            // Тип wo-switch задаёт вариант switch,
                            // для которого не производится опрос регистра -
                            // для таких каналов возможна только запись.
                            "type": "temperature",
 
                            // формат канала. Задаётся для регистров типа
                            // "holding" и "input". Возможные значения:
                            // "u16" - беззнаковое 16-битное целое
                            //        (используется по умолчанию)
                            // "s16" - знаковое 16-битное целое
                            // "u8" - беззнаковое 8-битное целое
                            // "s8" - знаковое 8-битное целое
                            // "u32" - беззнаковое 32-битное целое (big-endian).
                            //    (занимает 2 регистра, начиная с указанного)
                            // "s32" - знаковое 32-битное целое (big-endian).
                            //    (занимает 2 регистра, начиная с указанного)
                            // "s64" - знаковое 64-битное целое (big-endian).
                            //    (занимает 4 регистра, начиная с указанного)
                            // "u64" - беззнаковое 64-битное целое (big-endian).
                            //    (занимает 4 регистра, начиная с указанного)
                            //
                            // "float" - число с плаваяющей точкой IEEE 754. 32 bit. (big-endian).
                            //    (занимает 2 регистра, начиная с указанного)
                            // "double" - число с плаваяющей точкой двойной точности IEEE 754. 64 bit. (big-endian).
                            //    (занимает 4 регистра, начиная с указанного)
                            // "char8" - однобайтовый символ в кодировке ASCII
 
                            "format": "s8",
 
                            // Порядок 16-битных слов для каналов, имеющих размер больше 16 бит.
                            // Возможные значения:
                            //  "big_endian" (по-умолчанию): [0xAA 0xBB] [0xCC 0xDD] => 0xAABBCCDD
                            //  "little_endian":  [0xAA 0xBB] [0xCC 0xDD] => 0xCCDDAABB
                            "word_order" : "big_endian",
 
                            // для регистров типа coil и discrete
                            // с типом отображения switch/wo-swich
                            // также допускается задание on_value -
                            // числового значения, соответствующего
                            // состоянию "on" (см. ниже)
 
                            // минимальный интервал опроса данного регистра в миллисекундах
                            "poll_interval": 10,
 
                            // значение, получаемое при последовательном чтении диапазона регистров, если устройство не поддерживает запрашиваемый регистр.
                            // Этот параметр используется некоторыми протоколами, чтобы определить доступность регистров устройства.
                            "unsupported_value": "0xFFFE",
 
                            // максимальное значение регистра, используется для построения интерфейса онлайн-конфигуратора
                            "max": 100,
 
                            // коэффициент, на который умножается значение регистра перед публикацией в MQTT
                            "scale": 0.5,
 
                            // значение, которое прибавляется к значению регистра перед публикацией в MQTT
                            "offset": -12.5,
 
                            // порядок, до которого будет округляться значение после всех преобразований
                            "round_to": 0.1,
 
                            // доступен ли канал для записи через MQTT
                            "readonly": true,
 
                            // значение, которое будет записано в регистр, при записи единицы в on-топик в MQTT
                            "on_value": "0xFF",
 
                            // значение регистра, полученное от устройства, которое обозначает ошибку
                            "error_value": "0xAA"
                        },
                        {
                            // Ещё один канал
                            "name" : "Illuminance",
                            "reg_type" : "input",
                            "address" : 1,
                            "type": "text"
                         },
                         },
                         {
                         {
                            "name" : "Pressure",
//описание канала 2
                            "reg_type" : "input",
                            "address" : 2,
                            "type": "text",
                            "scale": 0.075
                         },
                         },
                        {
...
                            "name" : "Temp 2",
                            "reg_type" : "input",
                            "address" : 3,
                            "type": "temperature",
                            "format": "s8"
                        }
                     ]
                     ]
                 },
                 },
                 {
                 {
                     // ещё одно устройство на канале
                     // описание второго устройства на канале
                     "name": "DRB88",
                     "name": "Device 2",
                     "id": "drb88",
                     ...
                    "enabled": true,
                    "slave_id": 22,


                     // секция инициализации
                     // секция инициализации второго устройства
                     "setup": [
                     "setup": [
                         {
                         {
                             // название регистра (для отладки)
                             // описание регистра настройки
                            // Выводится в случае включённой отладочной печати.
                            "title": "Input 0 type",
                            // адрес holding-регистра
                            "address": 1,
                            // значение для записи
                            "value": 1
                         },
                         },
                        {
                             ...
                             "title": "Input 0 module",
                            "address": 3,
                            "value": 3 // was: 11
                        }
                     ],
                     ],
                    // каналы второго устройства
                     "channels": [
                     "channels": [
                         {
                         {
                             "name" : "Relay 1",
                             //первый канал
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        {
                            "name" : "Relay 2",
                            "reg_type" : "coil",
                            "address" : 1,
                            "type": "switch"
                        },
                        // ...
                        {
                            "name" : "Input 2",
                            "reg_type" : "input",
                            "address" : 1,
                            "type": "switch",
                            // значение, соответствующее состоянию "on"
                            "on_value": 101
                        },
                        {
                            "name" : "Input 3",
                            "reg_type" : "input",
                            "address" : 2,
                            "type": "switch",
                            "on_value": 101
                         },
                         },
                        // ...
                            ...
                     ]
                     ]
                 }
                 }
Строка 387: Строка 109:
         },
         },
         {
         {
             // ещё один порт со своим набором устройств
             // ещё один порт со своим набором устройств          
            "path" : "/dev/ttyNSC1",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 1,
            "poll_interval": 100,
            "enabled": true,
             "devices" : [
             "devices" : [
                 {
                 {
                     "name": "tM-P3R3",
                     ...
                    "id": "tmp3r3",
 
                    "enabled": true,
                    "slave_id": 1,
                     "channels": [
                     "channels": [
                         {
                         ...
                            "name" : "Relay 0",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        // ...
                     ]
                     ]
                 },
                 },
                 // ...
                 ...
             ]
             ]
         }
         }
Строка 417: Строка 124:
}
}
</syntaxhighlight>
</syntaxhighlight>
==== Основные настройки драйвера ====
* debug — опция включает отладочный режим драйвера. Доступные значения: true, false.
* max_unchanged_interval — Задаёт интервал в секундах, в течение которого не изменяющиеся значения не будут публиковаться в MQTT. По истечении интервала значение будет опубликовано, даже если оно не изменилось. Доступны специальные значения:
** <code>0</code> — публиковать все значения;
** <code>-1</code> — публиковать только при изменении, значение по умолчанию.
==== Порты (ports) ====
* port_type — тип порта:
** serial — последовательные порты RS-485 или RS-232, значение по умолчанию.
** tcp — serial over TCP/IP. Пакеты, формируемые для работы с последовательными портами, передаются без изменений через TCP/IP.
** modbus tcp — передача по Modbus TCP. В секции устройств с таким типом порта могут использоваться только те, что поддерживают Modbus.
* path — если выбран тип serial: устройство в системе, которое соответствует порту RS-485.
* address — если выбран тип tcp или modbus tcp: IP-адрес или имя хоста.
* port — если выбран тип tcp или modbus tcp: TCP-порт.
* baud_rate — скорость порта.
* parity — четность:
** N — none, без бита четности. Значение по умолчанию;
** O — odd, нечетный;
** E — even, четный.
* data_bits — количество бит данных, по умолчанию — 8.
* stop_bits — количество стоп-бит, по умолчанию — 2.
* poll_interval — минимальный интервал опроса каждого регистра в миллисекундах.
* response_timeout_ms — максимальное время ответа устройств в миллисекундах. По умолчанию — 500 мс.
* guard_interval_us — дополнительная задержка перед отправкой данных в порт, микросекунды.
* connection_timeout_ms — если выбран тип tcp или modbus tcp: таймаут соединения. Если в течение указанного времени ни по одному из устройств на порту не поступило данных и истек connection_max_fail_cycles — разорвать соединение и переподключиться.
* connection_max_fail_cycles — если выбран тип tcp или modbus tcp: количество неудачных циклов опроса.
* enabled — включает или отключает порт. Доступные значения: ''true'', ''false''. По умолчанию — ''true''.
==== Устройства, их каналы и параметры (devices, channels и setup) ====
Раздел devices содержит описание устройств, подключенных к порту и имеет структуру:
<syntaxhighlight lang="javascript">
"devices" :
[
    {
// описание устройства
...
        "channels" :
        [
            // описание каналов
            ...
        ]                   
    },
    {
// описание второго устройства
...                   
    },
    ...
]
</syntaxhighlight>
Так как для описания устройств мы рекомендуем использовать шаблоны, то подробное описание разделов '''devices''', '''channels''' и '''setup''' вы найдете [[Wb-mqtt-serial templates | в статье о шаблонах]].


=== Редактирование через веб-интерфейс ===
=== Редактирование через веб-интерфейс ===
Строка 661: Строка 421:


Подробнее о возможностях утилиты <code>journalctl</code> можете почитать в [https://habr.com/ru/company/ruvds/blog/533918/ статье на Хабре].
Подробнее о возможностях утилиты <code>journalctl</code> можете почитать в [https://habr.com/ru/company/ruvds/blog/533918/ статье на Хабре].
== Полезные ссылки ==
* [[Wb-mqtt-serial templates| Описание шаблонов и примеры]]
* [https://github.com/wirenboard/wb-mqtt-serial/blob/master/README.md Описание драйвера в репозитории на Github]

Версия 19:15, 1 февраля 2021

ВНИМАНИЕ: драйвер wb-mqtt-serial ранее назывался wb-homa-modbus, а конфигурационный файл /etc/wb-mqtt-serial.conf как /etc/wb-homa-modbus.conf. Учитывайте это, если используете устаревшие прошивки.

Описание

Драйвер wb-mqtt-serial отвечает за работу с подключенными по RS-485 устройствами в контроллере Wiren Board. Он обеспечивает работу с устройствами через систему MQTT-сообщений.

Полное описание драйвера смотрите в репозитории на Github.

Поддерживаемые устройства

Поддерживается работа с:

Поддержка устройств различных протоколов на одной шине

Использовать устройства с разными протоколами на одной шине возможно, но необходимо учитывать особенности конкретных протоколов.

Например, фреймы устройств Unitel начинаются с байта 0xff, а устройств ИВТМ — с байта 0x24. В случае с протоколами Modbus, Меркурий 230 и Милур первым байтом фрейма является идентификатор slave, поэтому при совмещении таких устройств нужно внимательно подходить к выбору slave id.

У устройств Милур slave id по умолчанию равен 0xff, что приведет к конфликту с устройствами Unitel. Также устройства Милур требуют дополнительных задержек при опросе и при использовании на одной шине с другими устройствами могут снизить скорость опроса.

Иногда устройства, работающие на разных протоколах могут конфликтовать между собой: устройства с поддержкой протокола A-BUS не могут работать на одной шине с устройствами Unitel.

Рекомендуем придерживаться проверенной формулы комбинации протоколов на одной шине: Modbus + Милур (slave_id != 0xff) + Uniel. Учитывайте, что сторонние производители устройств могут вносить недокументированные изменения в протокол, поэтому перед покупкой устройства желательно убедиться в работоспособности выбранного решения.

Доработка драйвера для поддержки новых устройств

Вы можете самостоятельно добавить поддержку новых modbus-устройств при помощи шаблонов.

Если у вас возникли проблемы с составлением шаблона или выбранное вами устройство имеет свой протокол обмена данными — свяжитесь с нами и мы постараемся помочь.

Управление драйвером

Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.

Также можно управлять драйвером в ручном режиме — это может быть полезно для поиска ошибок в конфигурационном файле или если вам нужно освободить порт для использования modbus_client.

Для выполнения команд подключитесь к контроллеру по SSH. Доступны команды:

service wb-mqtt-serial stop #остановить драйвер
service wb-mqtt-serial start #запустить драйвер
service wb-mqtt-serial restart #перезапустить драйвер
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу

Файл конфигурации драйвера

Перед использованием драйвер нужно настроить. Конфигурация драйвера хранится в файле /etc/wb-mqtt-serial.conf.

Структура файла

Файл /etc/wb-mqtt-serial.conf имеет структуру порты (ports)устройства (devices)каналы (channels): в файле есть описание физических портов контроллера, внутри них — список устройств подключенных к этому порту, а внутри устройств описаны каналы.

Для каждого порта указываются настройки: скорость, четность и т.п., а также протокол: Modbus, Uniel и т.п. Для каждого устройства обязательно указывается его уникальный адрес на шине — slave_id, остальные параметры указываются по необходимости.

Структура файла:

{
// основные настройки драйвера
...

	// порты
    "ports": [
        {
		// настройки порта
		...

            // список устройств на данном порту
            "devices" : [
                {
					// описание первого устройства на канале
                    "name": "Device 1",
					...

                    // список каналов устройства
                    "channels": [
                        {
							//описание канала 1
                        },
                        {
							//описание канала 2
                        },
							...
                    ]
                },
                {
                    // описание второго устройства на канале
                    "name": "Device 2",
                    ...

                    // секция инициализации второго устройства
                    "setup": [
                        {
                            // описание регистра настройки
                        },
                            ...
                    ],
                    // каналы второго устройства
                    "channels": [
                        {
                            //первый канал
                        },
                            ...
                    ]
                }
            ]
        },
        {
            // ещё один порт со своим набором устройств            
            "devices" : [
                {
                    ...

                    "channels": [
                        ...
                    ]
                },
                ...
            ]
        }
    ]
}

Основные настройки драйвера

  • debug — опция включает отладочный режим драйвера. Доступные значения: true, false.
  • max_unchanged_interval — Задаёт интервал в секундах, в течение которого не изменяющиеся значения не будут публиковаться в MQTT. По истечении интервала значение будет опубликовано, даже если оно не изменилось. Доступны специальные значения:
    • 0 — публиковать все значения;
    • -1 — публиковать только при изменении, значение по умолчанию.

Порты (ports)

  • port_type — тип порта:
    • serial — последовательные порты RS-485 или RS-232, значение по умолчанию.
    • tcp — serial over TCP/IP. Пакеты, формируемые для работы с последовательными портами, передаются без изменений через TCP/IP.
    • modbus tcp — передача по Modbus TCP. В секции устройств с таким типом порта могут использоваться только те, что поддерживают Modbus.
  • path — если выбран тип serial: устройство в системе, которое соответствует порту RS-485.
  • address — если выбран тип tcp или modbus tcp: IP-адрес или имя хоста.
  • port — если выбран тип tcp или modbus tcp: TCP-порт.
  • baud_rate — скорость порта.
  • parity — четность:
    • N — none, без бита четности. Значение по умолчанию;
    • O — odd, нечетный;
    • E — even, четный.
  • data_bits — количество бит данных, по умолчанию — 8.
  • stop_bits — количество стоп-бит, по умолчанию — 2.
  • poll_interval — минимальный интервал опроса каждого регистра в миллисекундах.
  • response_timeout_ms — максимальное время ответа устройств в миллисекундах. По умолчанию — 500 мс.
  • guard_interval_us — дополнительная задержка перед отправкой данных в порт, микросекунды.
  • connection_timeout_ms — если выбран тип tcp или modbus tcp: таймаут соединения. Если в течение указанного времени ни по одному из устройств на порту не поступило данных и истек connection_max_fail_cycles — разорвать соединение и переподключиться.
  • connection_max_fail_cycles — если выбран тип tcp или modbus tcp: количество неудачных циклов опроса.
  • enabled — включает или отключает порт. Доступные значения: true, false. По умолчанию — true.

Устройства, их каналы и параметры (devices, channels и setup)

Раздел devices содержит описание устройств, подключенных к порту и имеет структуру:

"devices" : 
[
    {
		// описание устройства
		...
        "channels" : 
        [
            // описание каналов
            ...
        ]                    
    },
    {
		// описание второго устройства
		...                    
    },
    ...
]

Так как для описания устройств мы рекомендуем использовать шаблоны, то подробное описание разделов devices, channels и setup вы найдете в статье о шаблонах.

Редактирование через веб-интерфейс

Мы рекомендуем изменять конфигурацию драйвера через веб-интерфейс. Процедура настройки подробно описана в статье RS-485:Настройка через веб-интерфейс.

Внесение изменений вручную

Будьте внимательны при редактировании файла конфигурации вручную — в отличие от редактирования через веб-интерфейс, вы можете допустить синтаксическую ошибку и драйвер не запустится.

  1. Ознакомьтесь с инструкцией Просмотр файлов контроллера с компьютера и выберите удобный для вас способ.
  2. Впишите конфигурацию для портов и подключенных устройств в файл. Смотрите примеры.
  3. Чтобы описанные в файле устройства появились в веб-интерфейсе, перезагрузите контроллер или выполните команду:
    service wb-mqtt-serial restart
    

Поиск ошибок

Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду systemctl status wb-mqtt-serial и в последних двух строчках ответа будет подсказка.

В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:

~# systemctl status wb-mqtt-serial
● wb-mqtt-serial.service - MQTT Driver for serial devices
   Loaded: loaded (/lib/systemd/system/wb-mqtt-serial.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2021-01-28 15:10:51 +04; 4s ago
  Process: 23682 ExecStart=/usr/bin/wb-mqtt-serial (code=exited, status=0/SUCCESS)
 Main PID: 23682 (code=exited, status=0/SUCCESS)

Jan 28 15:10:47 wirenboard-A6XXXT2R systemd[1]: Started MQTT Driver for serial devices.
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]: ERROR: [serial] Failed to parse JSON /etc/wb-mqtt-serial.conf:* Line 2, Column 14
Jan 28 15:10:51 wirenboard-A6XXXT2R wb-mqtt-serial[23682]:   Syntax error: value, object or array expected.

Примеры файла конфигурации

В примерах мы описывали устройства в самом файле конфигурации, но при их большом количестве описание устройств можно вынести в шаблоны.

Подключено одно устройство

Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика WB-MAP3E fw2. В примере счетчик подключен к serial-порту /dev/ttyRS485-1, работает по протоколу Modbus и имеет адрес 142.

{
	// отладка выключена
    "debug" : false,
	// список портов
    "ports" : 
    [
        {
			// тип порта
            "port_type" : "serial",			
			// устройство, соответствующее порту RS-485 (если выбран тип порта serial)
            "path" : "/dev/ttyRS485-1",			
			// скорость порта
            "baud_rate" : 9600,
			// количество бит данных
            "data_bits" : 8,
			// количество стоп-бит
            "stop_bits" : 2,
			// паритет - N, O или E
            "parity" : "N",			
			// включить опрос устройства
            "enabled" : true,
			// минимальный интервал опроса каждого регистра в миллисекундах
            "poll_interval" : 10,
			// список устройств на порту /dev/ttyRS485-1
            "devices" : 
            [
                {
					// отображаемое имя устройства
					"name" : "WB-MAP3E fw2",
					// протокол передачи устройства
                    "protocol" : "modbus",
					// идентификатор устройства на шине
                    "slave_id" : "142",
					// список каналов устройства
                    "channels" : 
                    [
                        {
							// адрес регистра
                            "address" : "0x1410",
							// формат канала
                            "format" : "u32",
							// имя канала
                            "name" : "Urms L1",							
                            // тип регистра
                            "reg_type" : "input",
							// порядок, до которого будет округляться значение после всех преобразований
                            "round_to" : 0.001,
							// коэффициент, на который умножается значение регистра перед публикацией в MQTT
                            "scale" : 1.52588e-07,
							// тип элемента управления
                            "type" : "voltage"
                        }
                    ]                    
                }
            ]
        }
    ]
}

Несколько подключенных устройств

Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика WB-MAP3E fw2 и температуру с датчика MSW3.

В примере устройства работают по протоколу Modbus: счетчик WB-MAP3E подключен к serial-порту /dev/ttyRS485-1 с адресом 142, а датчик MSW3 подключен к serial-порту /dev/ttyRS485-2 и имеет адрес 22.

{
	// отладка выключена
    "debug" : false,
	// список портов
    "ports" : 
    [
        {
			// тип порта
            "port_type" : "serial",			
			// устройство, соответствующее порту RS-485 (если выбран тип порта serial)
            "path" : "/dev/ttyRS485-1",			
			// скорость порта
            "baud_rate" : 9600,
			// количество бит данных
            "data_bits" : 8,
			// количество стоп-бит
            "stop_bits" : 2,
			// четность - N, O или E
            "parity" : "N",			
			// включить опрос устройства
            "enabled" : true,
			// минимальный интервал опроса каждого регистра в миллисекундах
            "poll_interval" : 10,
			// список устройств на порту /dev/ttyRS485-1
            "devices" : 
            [
                {
					// отображаемое имя устройства
					"name" : "WB-MAP3E fw2",
					// протокол передачи устройства
                    "protocol" : "modbus",
					// идентификатор устройства на шине
                    "slave_id" : "142",
					// список каналов устройства
                    "channels" : 
                    [
                        {
							// адрес регистра
                            "address" : "0x1410",
							// формат канала
                            "format" : "u32",
							// имя канала
                            "name" : "Urms L1",							
                            // тип регистра
                            "reg_type" : "input",
							// порядок, до которого будет округляться значение после всех преобразований
                            "round_to" : 0.001,
							// коэффициент, на который умножается значение регистра перед публикацией в MQTT
                            "scale" : 1.52588e-07,
							// тип элемента управления
                            "type" : "voltage"
                        }
                    ]                    
                }
            ]
        },
		{
			// тип порта
            "port_type" : "serial",			
			// устройство, соответствующее порту RS-485 (если выбран тип порта serial)
            "path" : "/dev/ttyRS485-2",			
			// скорость порта
            "baud_rate" : 9600,
			// количество бит данных
            "data_bits" : 8,
			// количество стоп-бит
            "stop_bits" : 2,
			// четность - N, O или E
            "parity" : "N",			
			// включить опрос устройства
            "enabled" : true,
			// минимальный интервал опроса каждого регистра в миллисекундах
            "poll_interval" : 10,
			// список устройств на порту /dev/ttyRS485-2
            "devices" : 
            [
                {
					// отображаемое имя устройства
					"name" : "MSW3",
					// протокол передачи устройства
                    "protocol" : "modbus",
					// идентификатор устройства на шине
                    "slave_id" : "22",
					// список каналов устройства
                    "channels" : 
                    [
                        {
							// адрес регистра
                            "address" : "0x0000",
							// формат канала
                            "format" : "s16",
							// имя канала
                            "name" : "Temp",							
                            // тип регистра
                            "reg_type" : "input",
							// порядок, до которого будет округляться значение после всех преобразований
                            "round_to" : 0.5,
							// коэффициент, на который умножается значение регистра перед публикацией в MQTT
                            "scale" : 0.1,
							// тип элемента управления
                            "type" : "temperature"
                        }
                    ]                    
                }
            ]
        }        
    ]
}

Включение отладки

Веб-интерфейс. Флажок Enable debug logging установлен, отладка включена

Иногда нужно включить отладочный режим драйвера. Это можно сделать из командной строки или через веб-интерфейс.

ВНИМАНИЕ: при включенной отладке системный журнал будет быстро расти, поэтому не забудьте отключить отладку, когда необходимость в ней отпадет.

Включение отладки через веб-интерфейс:

  1. Зайдите в веб-интерфейс SettingsConfigsSerial Device Driver Configuration
  2. Установите флажок Enable debug logging
  3. Нажмите на кнопку Save, чтобы сохранить настройки.

Теперь в системный журнал будут записываться отправленные и принятые драйвером пакеты.

Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду journalctl -e -p 7, где -e — отобразить последние записи, а -p 7 задает уровень сообщений, где 7 — это debug.

Пример вывода команды:

~# journalctl -e -p 7
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] channel 'Urms L1' of device 'wb-modbus-0-0' <-- 224.647
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [modbus] read 2 input(s) @ 5136 of device modbus:142
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 0 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Write: 8e 04 14 10 00 02 6a c1
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] Sleep 10000 us
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [port] ReadFrame: 16 04 02 0f 3d 09 12
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [register handler] new val for input @ 3 of device modbus:22: f3d
Jan 29 14:27:24 wirenboard-A6ZZXT2R wb-mqtt-serial[1667]: DEBUG: [serial port driver] register value change: input @ 3 of device modbus:22 <- 39.01

Подробнее о возможностях утилиты journalctl можете почитать в статье на Хабре.

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