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

Материал из Wiren Board
(Добавил диаграмму таймаутов опроса, взял на гитхабе)
(не показано 40 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{DISPLAYTITLE: Драйвер wb-mqtt-serial}}
{{DISPLAYTITLE: Драйвер wb-mqtt-serial}}
'''ВНИМАНИЕ:''' драйвер ''wb-mqtt-serial'' ранее назывался ''wb-homa-modbus'', а конфигурационный файл <code>/etc/wb-mqtt-serial.conf</code> как <code>/etc/wb-homa-modbus.conf</code>. Учитывайте это, если используете устаревшие прошивки.
[[Image: wb-mqtt-serial a few protocols.png |500px|thumb|right| Драйвер wb-mqtt-serial может одновременно опрашивать устройства, работающие по разным протоколам: <br> ​1 — виртуальный порт для устройств с протоколом Modbus TCP,<br> 2  — устройство работает по протоколу Modbus RTU,<br> 3 — устройство работает по протоколу DLMS]]
== Описание ==
{{note|note| Драйвер ''wb-mqtt-serial'' ранее назывался ''wb-homa-modbus'', а конфигурационный файл <code>/etc/wb-mqtt-serial.conf</code> <code>/etc/wb-homa-modbus.conf</code>. Учитывайте это, если используете устаревшие прошивки.}}
Драйвер <code>wb-mqtt-serial</code> служит для работы с подключенными по последовательным портам, в том числе [[RS-485|RS-485]], устройствами через систему [[MQTT|MQTT]]-сообщений.


== Описание ==
Драйвер <code>wb-mqtt-serial</code> отвечает за работу с подключенными по [[RS-485|RS-485]] устройствами в контроллере Wiren Board. Он обеспечивает работу с устройствами через систему [[MQTT|MQTT]]-сообщений.
Полное описание драйвера смотрите [https://github.com/contactless/wb-mqtt-serial в репозитории на Github].
Полное описание драйвера смотрите [https://github.com/contactless/wb-mqtt-serial в репозитории на Github].


==Поддерживаемые устройства==  
== Поддерживаемые устройства ==  
=== Перечень ===
Драйвер поддерживает некоторые устройства, который работают по протоколам:
* [[Modbus | Modbus RTU и Modbus TCP]],
* [http://smart.uniel.ru Uniel],
* [http://www.eksis.ru/catalog/measures-of-relative-humidity-and-temperature/ ИВТМ],
* [https://www.incotexcom.ru/catalogue Меркурий],
* [https://miluris.ru/ Милур],
* [[GOST MEK 61107 | Энергомера ГОСТ МЭК 61107]],
* [[GOST MEK 61107 |НЕВА МТ 32х ГОСТ МЭК 61107]],
* [[DLMS/COSEM | DLMS/COSEM, СПОДЭС (ГОСТ Р 58940-2020)]],
* [[Somfy SDN | Somfy SDN]],
* [[WinDeco | WinDeco]],
* [[Dooya DT82 | Dooya DT82]].
 
Полный список поддерживаемых устройств и особенности подключения, смотрите в таблице [[Supported devices#Таблица | Поддерживаемые контроллером Wiren Board протоколы и устройства]].


Поддерживается работа с:
Учитывайте, что сторонние производители устройств могут вносить недокументированные изменения в протокол, поэтому перед покупкой устройства желательно убедиться в работоспособности выбранного решения.
*Периферийными устройствами Wiren Board с интерфейсом Modbus: модули реле, диммеры, счётчики импульсов, датчики и т.п.
*Устройствами сторонних производителей, работающих по протоколу [[Протокол Modbus|Modbus]].
*Некоторыми устройствами, использующими протоколы ADICON, A-BUS, [http://smart.uniel.ru/ Uniel], [http://www.milur.ru/ Милур], [http://www.eksis.ru/catalog/measures-of-relative-humidity-and-temperature/ ИВТМ], [[Сounters Pulsar | Пульсар]], [http://www.incotexcom.ru/m230art.htm Меркурий 230], [http://www.energomera.ru/ Энергомера ГОСТ МЭК 61107], [https://www.meters.taipit.ru/ НЕВА МТ 32х ГОСТ МЭК 61107]. Полный список поддерживаемых устройств можно посмотреть в таблице [[Поддерживаемые устройства#Протестированные устройства сторонних производителей |Протестированные устройства сторонних производителей]].


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


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


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


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


Рекомендуем придерживаться проверенной формулы комбинации протоколов на одной шине: <code>Modbus + Милур (slave_id != 0xff) + Uniel</code>. Учитывайте, что сторонние производители устройств могут вносить недокументированные изменения в протокол, поэтому перед покупкой устройства желательно убедиться в работоспособности выбранного решения.
=== Широковещательные сообщения ===
[[Image:Broadcast Energometa CE102M.png |400px|thumb|right| Включение широковещательных сообщений в настройках счётчика Энергомера CE102M]]
Протоколы Меркурий 230, Энергомера ГОСТ МЭК 61107, НЕВА МТ 32х ГОСТ МЭК 61107 поддерживают отправку широковещательных сообщений, если не указывать идентификатор устройства, или указать вместо него пустую строку. Это можно использовать, если на шине только одно устройство такого типа, и его адрес неизвестен.
 
При этом нельзя на одном порту одновременно использовать широковещательные сообщения Энергомера ГОСТ МЭК 61107 и НЕВА МТ 32х ГОСТ МЭК 61107.


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


Вы можете самостоятельно добавить поддержку новых modbus-устройств при помощи [[Драйвер wb-mqtt-serial:Примеры написания шаблонов|шаблонов]].
Вы можете самостоятельно добавить поддержку новых устройств, которые работают по Modbus или по другим известным драйверу протоколам, при помощи [[Wb-mqtt-serial templates|шаблонов]].


Если у вас возникли проблемы с составлением шаблона или выбранное вами устройство имеет свой протокол обмена данными — [https://wirenboard.com/ru/pages/contacts свяжитесь с нами] и мы постараемся помочь.
Если у вас возникли проблемы с составлением шаблона или выбранное вами устройство имеет свой протокол обмена данными — [https://wirenboard.com/ru/pages/contacts свяжитесь с нами] и мы постараемся помочь.
Строка 44: Строка 60:
service wb-mqtt-serial restart #перезапустить драйвер
service wb-mqtt-serial restart #перезапустить драйвер
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу
wb-mqtt-serial -j #посмотреть ошибки в конфигурационном файле
</syntaxhighlight>
</syntaxhighlight>


== Файл конфигурации драйвера ==  
== Файл конфигурации драйвера ==  
 
[[Image: wb-mqtt-serial working diagram.png|500px|thumb|right| Диаграмма таймаутов цикла опроса]]
Перед использованием драйвер нужно настроить. Конфигурация драйвера хранится в файле <code>/etc/wb-mqtt-serial.conf</code>.  
Перед использованием драйвер нужно настроить. Конфигурация драйвера хранится в файле <code>/etc/wb-mqtt-serial.conf</code>.  


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


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


Для каждого порта указываются настройки: скорость, четность и т.п., а также протокол: 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",
                     "параметр": "значение",
 
...
                    // отображаемое имя устройства. Публикуется как
                    // .../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",
                     "параметр": "значение",
                    "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
                        }
                     ],
                     ],
                    // секция параметров второго устройства, значение указанных здесь параметров можно менять в веб-интерфейсе
                    "parameters": {
                        "param1":  {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },
                        "param2":  {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },                                   
                            ...
                    },
                    // каналы второго устройства
                     "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: Строка 150:
         },
         },
         {
         {
             // ещё один порт со своим набором устройств
             // ещё один порт со своим набором устройств          
            "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: Строка 169:
}
}
</syntaxhighlight>
</syntaxhighlight>
Пример конфигурационного файла можете посмотреть [https://github.com/wirenboard/wb-mqtt-serial/blob/master/README.md в репозитории].
==== Основные настройки драйвера ====
* 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 и parameters) ====
Раздел '''devices''' содержит описание устройств, подключенных к порту и имеет структуру:
<syntaxhighlight lang="javascript">
"devices" :
[
    {
// описание устройства
...
        "channels" :
        [
            // описание каналов
            ...
        ]                   
    },
    {
// описание второго устройства
...                   
    },
    ...
]
</syntaxhighlight>
Описание устройства '''device''' может быть задано двумя способами: вручную прописать все параметры или задать только несколько параметров, а остальные вынести в шаблон:
<syntaxhighlight lang="javascript">
{
    // По DeviceType драйвер будет искать в папках с шаблонами описаний устройств
    "device_type" : "DeviceType",
    // отображаемое имя устройства. Публикуется как
    // .../meta/name в MQTT
    // По умолчанию name берется из шаблона и добавляется slave_id, т.е.
    // "name" + " " + "slave_id"
    "name" : "somename",
    // уникальный идентификатор устройства в MQTT.
    // каждый элемент в devices должен иметь уникальный id
    // topic'и, относящиеся в MQTT к данному устройству,
    // имеют общий префикс /devices/<идентификатор топика>/...
    // также по умолчанию берется из шаблона с добавлением slave_id:
    // "deviceID" + "_" + slave_id
    "id" : "deviceID",
    // идентификатор slave
    "slave_id" : slaveID,
    // включить/выключить устройство. В случае задания
    // "enabled": false опрос устройства и запись значений
    // его каналов не происходит. По умолчанию - true.
    "enabled" : true,
    // если используется шаблон устройства, определения
    // каналов совмещаются. Если имя (name) в определении
    // канала устройства совпадает с именем канала в шаблоне,
    // свойства каналов из шаблона и определения устройства
    // совмещаются, при этом значения свойств из определения
    // устройства (в файле конфигурации) имеют преимущество.
    // Это можно использовать, например, для задания индивидуальных
    // интервалов опроса каналов. Если канал с таким же
    // именем, как канал в определении устройства, отсутствует
    // в шаблоне, создаётся новый канал.
    "channels": [
        {
            // имя канала. topic'и, соответствующие каналу,
            "name" : "Temp 1",
            "poll_interval": 10000
        }
    ]
}
</syntaxhighlight>
Подробное описание разделов '''device''', '''channels''', '''setup''' и '''parameters''' вы найдете [[Wb-mqtt-serial templates | в статье о шаблонах]].


=== Редактирование через веб-интерфейс ===
=== Редактирование через веб-интерфейс ===
Строка 636: Строка 490:
Иногда нужно включить отладочный режим драйвера. Это можно сделать из [[#Управление драйвером | командной строки]] или через веб-интерфейс.
Иногда нужно включить отладочный режим драйвера. Это можно сделать из [[#Управление драйвером | командной строки]] или через веб-интерфейс.


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


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


Подробнее о возможностях утилиты <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| Описание шаблонов и примеры]]
* [[RS-485:Configuration via Web Interface | Настройка драйвера wb-mqtt-serial в веб-интерфейсе]]
* [https://github.com/wirenboard/wb-mqtt-serial/blob/master/README.md Описание драйвера в репозитории на Github]

Версия 20:26, 1 сентября 2021

Драйвер wb-mqtt-serial может одновременно опрашивать устройства, работающие по разным протоколам:
​1 — виртуальный порт для устройств с протоколом Modbus TCP,
2 — устройство работает по протоколу Modbus RTU,
3 — устройство работает по протоколу DLMS

Описание

Драйвер wb-mqtt-serial ранее назывался wb-homa-modbus, а конфигурационный файл /etc/wb-mqtt-serial.conf/etc/wb-homa-modbus.conf. Учитывайте это, если используете устаревшие прошивки. Драйвер wb-mqtt-serial служит для работы с подключенными по последовательным портам, в том числе RS-485, устройствами через систему MQTT-сообщений.

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

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

Перечень

Драйвер поддерживает некоторые устройства, который работают по протоколам:

Полный список поддерживаемых устройств и особенности подключения, смотрите в таблице Поддерживаемые контроллером Wiren Board протоколы и устройства.

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

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

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

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

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

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

Широковещательные сообщения

Включение широковещательных сообщений в настройках счётчика Энергомера CE102M

Протоколы Меркурий 230, Энергомера ГОСТ МЭК 61107, НЕВА МТ 32х ГОСТ МЭК 61107 поддерживают отправку широковещательных сообщений, если не указывать идентификатор устройства, или указать вместо него пустую строку. Это можно использовать, если на шине только одно устройство такого типа, и его адрес неизвестен.

При этом нельзя на одном порту одновременно использовать широковещательные сообщения Энергомера ГОСТ МЭК 61107 и НЕВА МТ 32х ГОСТ МЭК 61107.

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

Вы можете самостоятельно добавить поддержку новых устройств, которые работают по 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 #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу
wb-mqtt-serial -j #посмотреть ошибки в конфигурационном файле

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

Диаграмма таймаутов цикла опроса

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

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

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

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

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

{
// основные настройки драйвера
"параметр": "значение",
...

	// порты
    "ports": [
        {
		// настройки порта
		"параметр": "значение",
		...

            // список устройств на этом порту
            "devices" : [
                {
					// описание первого устройства на канале
                    "параметр": "значение",
					...

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

                    // секция инициализации второго устройства
                    "setup": [
                        {
                            // описание регистра настройки
		                    "параметр": "значение",
							...
                        },
                            ...
                    ],
                    // секция параметров второго устройства, значение указанных здесь параметров можно менять в веб-интерфейсе
                    "parameters": {
                        "param1":   {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },
                        "param2":   {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },                                    
                            ...
                    },
                    // каналы второго устройства
                    "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 и parameters)

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

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

Описание устройства device может быть задано двумя способами: вручную прописать все параметры или задать только несколько параметров, а остальные вынести в шаблон:

{
    // По DeviceType драйвер будет искать в папках с шаблонами описаний устройств
    "device_type" : "DeviceType",

    // отображаемое имя устройства. Публикуется как
    // .../meta/name в MQTT
    // По умолчанию name берется из шаблона и добавляется slave_id, т.е.
    // "name" + " " + "slave_id"
    "name" : "somename",

    // уникальный идентификатор устройства в MQTT.
    // каждый элемент в devices должен иметь уникальный id
    // topic'и, относящиеся в MQTT к данному устройству,
    // имеют общий префикс /devices/<идентификатор топика>/...
    // также по умолчанию берется из шаблона с добавлением slave_id:
    // "deviceID" + "_" + slave_id
    "id" : "deviceID",

    // идентификатор slave
    "slave_id" : slaveID,

    // включить/выключить устройство. В случае задания
    // "enabled": false опрос устройства и запись значений
    // его каналов не происходит. По умолчанию - true.
    "enabled" : true,

    // если используется шаблон устройства, определения
    // каналов совмещаются. Если имя (name) в определении
    // канала устройства совпадает с именем канала в шаблоне,
    // свойства каналов из шаблона и определения устройства
    // совмещаются, при этом значения свойств из определения
    // устройства (в файле конфигурации) имеют преимущество.
    // Это можно использовать, например, для задания индивидуальных
    // интервалов опроса каналов. Если канал с таким же
    // именем, как канал в определении устройства, отсутствует
    // в шаблоне, создаётся новый канал.
    "channels": [
        {
            // имя канала. topic'и, соответствующие каналу,
            "name" : "Temp 1",
            "poll_interval": 10000
        }
    ]
}

Подробное описание разделов device, channels, setup и parameters вы найдете в статье о шаблонах.

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

Мы рекомендуем изменять конфигурацию драйвера через веб-интерфейс. Процедура настройки подробно описана в статье 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 можете почитать в статье на Хабре.

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