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

Материал из Wiren Board
(не показано 40 промежуточных версий 4 участников)
Строка 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>. Учитывайте это, если используете устаревшие прошивки.
== Описание ==
== Описание ==
Драйвер <code>wb-mqtt-serial</code> служит для работы с подключенными по шине [[RS-485|RS-485]] устройствами через систему [[MQTT|MQTT]]-сообщений.
[[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]]
=== Общая информация ===
''wb-mqtt-serial'' — драйвер master-slave протоколов для устройств, подключённых:
* к шине RS-485 — протокол Modbus RTU и других;
* через Ethernet — протоколы Modbus TCP, Modbus over TCP и другие;
* к разъёмам MOD1–MOD3 — при наличии модулей расширения, использующих обмен по UART.


Полное описание драйвера смотрите [https://github.com/contactless/wb-mqtt-serial в репозитории на Github].
Драйвер опрашивает serial-устройства и публикует данные в топики [[MQTT|MQTT]]-брокера. Устройства настраиваются через [[RS-485:Configuration via Web Interface | веб-интерфейс]].


== Поддерживаемые устройства ==
wb-mqtt-serial использует систему JSON-шаблонов, которые описывают подключённые устройства: тип протокола, номера регистров, название параметров и контролов в веб-интерфейсе контроллера. В стандартной поставке есть шаблоны для всех устройств 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], DLMS/COSEM, СПОДЭС (ГОСТ Р 58940-2020).  
* Электрокарнизами Somfy SDN, WinDeco, Dooya, AM82Smart.


Полный список поддерживаемых устройств можно посмотреть в таблице [[Поддерживаемые устройства#Протестированные устройства сторонних производителей |Протестированные устройства сторонних производителей]].
Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами.


Учитывайте, что сторонние производители устройств могут вносить недокументированные изменения в протокол, поэтому перед покупкой устройства желательно убедиться в работоспособности выбранного решения.
Файлы и папки:
* <code>/etc/wb-mqtt-serial.conf</code> — файл настроек драйвера, редактировать вручную не рекомендуем;
* <code>/usr/share/wb-mqtt-serial/templates</code> — папка с предустановленными шаблонами;
* <code>/etc/wb-mqtt-serial.conf.d/templates</code> — папка для пользовательских шаблонов, которые имеют приоритет над предустановленными.


=== Поддержка устройств различных протоколов на одной шине ===
Если вы добавили свой шаблон или изменили существующий, подождите 20 секунд, а потом перезагрузите страницу конфигуратора в веб-интерфейсе клавишами <kbd>Ctrl</kbd>+<kbd>F5</kbd> или перезапустите сервис: <syntaxhighlight lang="bash>systemctl restart wb-mqtt-confed</syntaxhighlight>


Использовать устройства с разными протоколами на одной шине возможно, но необходимо учитывать особенности конкретных протоколов.
О том, как получить доступ к файлам и папкам, читайте в статье [[View controller files from your computer|Просмотр файлов контроллера с компьютера]].


Например, фреймы устройств Unitel начинаются с байта <code>0xff</code>, а устройств ИВТМ — с байта <code>0x24</code>. В случае с протоколами Modbus, Меркурий 230 и Милур первым байтом фрейма является идентификатор ''slave'', поэтому при совмещении таких устройств нужно внимательно подходить к выбору ''slave id''.  
Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите '''[https://github.com/contactless/wb-mqtt-serial в репозитории на Github]'''.


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


Иногда устройства, работающие на разных протоколах могут конфликтовать между собой.
Поэтому при написании шаблона для сторонних Modbus-устройств, нужно указать параметр ''guard_interval_us'', который рассчитывается по формуле:
 
<syntaxhighlight lang="js">
=== Широковещательные сообщения ===
guard_interval_us = (3.5*11*10^6)/(скорость в бит/с)
Протоколы Меркурий 230, Энергомера ГОСТ МЭК 61107, НЕВА МТ 32х ГОСТ МЭК 61107 поддерживают отправку широковещательных сообщений, если не указывать идентификатор устройства, или указать вместо него пустую строку. Это можно использовать, если на шине только одно устройство такого типа, и его адрес неизвестен.
</syntaxhighlight>
 
Так же этот параметр можно установить через веб-интерфейс:
При этом нельзя на одном порту одновременно использовать широковещательные сообщения Энергомера ГОСТ МЭК 61107 и НЕВА МТ 32х ГОСТ МЭК 61107.
* Guard interval (us) — для порта.
 
* Additional delay before each writing to port (us) — для устройства.
=== Доработка драйвера для поддержки новых устройств ===
 
Вы можете самостоятельно добавить поддержку новых устройств, которые работают по Modbus или по другим известным драйверу протоколам, при помощи [[Драйвер wb-mqtt-serial:Примеры написания шаблонов|шаблонов]].


Если у вас возникли проблемы с составлением шаблона или выбранное вами устройство имеет свой протокол обмена данными [https://wirenboard.com/ru/pages/contacts свяжитесь с нами] и мы постараемся помочь.
Если при чтении регистра устройства возникла ошибка, то соответствующий контрол в веб-интерфейсе  будет окрашен в красный цвет. Аналогично с устройством если оно давно не отвечает, то все его контролы будут окрашены красным.


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


Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
Строка 48: Строка 46:
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
service wb-mqtt-serial stop #остановить драйвер
systemctl stop wb-mqtt-serial # остановить
service wb-mqtt-serial start #запустить драйвер
systemctl start wb-mqtt-serial # запустить
service wb-mqtt-serial restart #перезапустить драйвер
systemctl restart wb-mqtt-serial # перезапустить
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>


== Файл конфигурации драйвера ==
== Диагностика неполадок ==
 
Перед использованием драйвер нужно настроить. Конфигурация драйвера хранится в файле <code>/etc/wb-mqtt-serial.conf</code>.
 
=== Структура файла ===
 
Файл <code>/etc/wb-mqtt-serial.conf</code> имеет структуру <code>порты (ports)</code> → <code>устройства (devices)</code> → <code>каналы (channels)</code>: в файле есть описание физических портов контроллера, внутри них — список подключенных к этому порту устройств, а внутри устройств описаны их каналы.
 
Для каждого порта указываются настройки: скорость, четность и т.п., а также протокол: Modbus, Uniel и т.п. Для каждого устройства обязательно указывается его уникальный адрес на шине — <code>slave_id</code>, остальные параметры указываются по необходимости. Если параметр не указан — будет подставлено значение по умолчанию.
 
Структура файла:
<syntaxhighlight lang="javascript">
{
// основные настройки драйвера
"параметр": "значение",
...
 
// порты
    "ports": [
        {
// настройки порта
"параметр": "значение",
...
 
            // список устройств на этом порту
            "devices" : [
                {
// описание первого устройства на канале
                    "параметр": "значение",
...
 
                    // список каналов устройства
                    "channels": [
                        {
//описание канала 1
"параметр": "значение",
...
                        },
                        {
//описание канала 2
"параметр": "значение",
...
                        },
...
                    ]
                },
                {
                    // описание второго устройства на канале
                    "параметр": "значение",
...
 
                    // секция инициализации второго устройства
                    "setup": [
                        {
                            // описание регистра настройки
                    "параметр": "значение",
...
                        },
                            ...
                    ],
                    // секция параметров второго устройства, значение указанных здесь параметров можно менять в веб-интерфейсе
                    "parameters": {
                        "param1":  {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },
                        "param2":  {
                                    // описание регистра настройки
                                    "параметр": "значение",
                                    ...
                        },                                   
                            ...
                    },
                    // каналы второго устройства
                    "channels": [
                        {
                            //первый канал
                    "параметр": "значение",
...                           
                        },
                            ...
                    ]
                }
            ]
        },
        {
            // ещё один порт со своим набором устройств           
            "devices" : [
                {
                    "параметр": "значение",
...
 
                    "channels": [
    {
                    "параметр": "значение",
...
  }
                    ]
                }
                ...
            ]
        }
    ]
}
</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 | в статье о шаблонах]].
 
=== Редактирование через веб-интерфейс ===
Мы рекомендуем изменять конфигурацию драйвера через веб-интерфейс. Процедура настройки подробно описана в статье [[RS-485:Настройка через веб-интерфейс|RS-485:Настройка через веб-интерфейс]].
 
=== Внесение изменений вручную ===
Будьте внимательны при редактировании файла конфигурации вручную — в отличие от редактирования через веб-интерфейс, вы можете допустить синтаксическую ошибку и драйвер не запустится.
 
# Ознакомьтесь с инструкцией [[Просмотр файлов контроллера с компьютера|Просмотр файлов контроллера с компьютера]] и выберите удобный для вас способ.
#Впишите конфигурацию для портов и подключенных устройств в файл. Смотрите [[#Примеры файла конфигурации | примеры]].
#Чтобы описанные в файле устройства появились в веб-интерфейсе, перезагрузите контроллер или выполните команду:
#: <syntaxhighlight lang="bash">
service wb-mqtt-serial restart
</syntaxhighlight>
 
=== Поиск ошибок ===
Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду <code>systemctl status wb-mqtt-serial</code> и в последних двух строчках ответа будет подсказка.  
Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду <code>systemctl status wb-mqtt-serial</code> и в последних двух строчках ответа будет подсказка.  


В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:
В примере файл конфигурации содержит синтаксическую ошибку во второй строке на 14 позиции:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
~# systemctl status wb-mqtt-serial
# systemctl status wb-mqtt-serial
● wb-mqtt-serial.service - MQTT Driver for serial devices
● wb-mqtt-serial.service - MQTT Driver for serial devices
   Loaded: loaded (/lib/systemd/system/wb-mqtt-serial.service; enabled; vendor preset: enabled)
   Loaded: loaded (/lib/systemd/system/wb-mqtt-serial.service; enabled; vendor preset: enabled)
Строка 294: Строка 69:
</syntaxhighlight>
</syntaxhighlight>


== Примеры файла конфигурации ==
Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:
<syntaxhighlight lang="console">
# wb-mqtt-serial -g
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json:* Line 12, Column 5
  Missing ',' or '}' in object declaration
</syntaxhighlight>


В примерах мы описывали устройства в самом файле конфигурации, но при их большом количестве описание устройств можно вынести в [[Драйвер wb-mqtt-serial:Примеры написания шаблонов | шаблоны]].
Проверить файл конфигурации и шаблоны на ошибки:
<syntaxhighlight lang="console">
# wb-mqtt-serial -j
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json:* Line 8, Column 9
  Missing ',' or '}' in object declaration


=== Подключено одно устройство ===
<3>ERROR: [serial] Can't find template for 'WB-MDM3'
</syntaxhighlight>


Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика [[WB-MAP3E Power Meter | WB-MAP3E fw2]]. В примере счетчик подключен к serial-порту <code>/dev/ttyRS485-1</code>, работает по протоколу [[Протокол Modbus | Modbus]] и имеет адрес <code>142</code>.
При необходимости, можно добавить путь к файлу, который нужно проверить:
 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="javascript">{
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -j
// отладка выключена
    "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"
                        }
                    ]                   
                }
            ]
        }
    ]
}</syntaxhighlight>
 
=== Несколько подключенных устройств ===
 
Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика [[WB-MAP3E Power Meter | WB-MAP3E fw2]] и температуру с датчика [[MSW3]].
 
В примере устройства работают по протоколу [[Протокол Modbus | Modbus]]: счетчик WB-MAP3E подключен к serial-порту <code>/dev/ttyRS485-1</code> с адресом <code>142</code>, а датчик MSW3 подключен к serial-порту <code>/dev/ttyRS485-2</code> и имеет адрес <code>22</code>.
 
<syntaxhighlight lang="javascript">
{
// отладка выключена
    "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"
                        }
                    ]                   
                }
            ]
        }       
    ]
}
</syntaxhighlight>
</syntaxhighlight>


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


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


Включение отладки через веб-интерфейс:
Включение отладки через [[Wiren Board Web Interface|веб-интерфейс]]:
#Зайдите в веб-интерфейс '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''
# Зайдите в веб-интерфейс контроллера
#Установите флажок '''Enable debug logging'''
# Если вы работаете под обычным пользователем, то смените [[RS-485:Configuration via Web Interface#Смена уровня доступа к веб-интерфейсу| уровень доступа]]
#Нажмите на кнопку '''Save''', чтобы сохранить настройки.
# Перейдите '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''
# Установите флажок '''Enable debug logging'''
# Нажмите на кнопку '''Save''', чтобы сохранить настройки.


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


Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду <code>journalctl -e -p 7</code>, где <code>-e</code> — отобразить последние записи, а <code>-p 7</code> задает уровень сообщений, где 7 — это debug.
Чтобы посмотреть debug-вывод драйвера, выполните в консоли контроллера команду <code>journalctl -e -p 7</code>, где <code>-e</code> — отобразить последние записи, а <code>-p 7</code> задает уровень сообщений, где 7 — это debug. Подробнее о параметрах утилиты, читайте в статье [[journalctl]].


Пример вывода команды:
Пример вывода команды:
Строка 505: Строка 121:
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
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
</syntaxhighlight>
</syntaxhighlight>
Подробнее о возможностях утилиты <code>journalctl</code> можете почитать в [https://habr.com/ru/company/ruvds/blog/533918/ статье на Хабре].


== Полезные ссылки ==
== Полезные ссылки ==
* [[Wb-mqtt-serial templates| Описание шаблонов и примеры]]
* [[WB FAQ/thirdparty-modbus-devices-conection | Как подключить стороннее Modbus-устройство]]
* [[RS-485:Configuration via Web Interface | Настройка драйвера wb-mqtt-serial в веб-интерфейсе]]
* [https://github.com/contactless/wb-mqtt-serial Описание wb-mqtt-serial на Github]
* [https://github.com/wirenboard/wb-mqtt-serial/blob/master/README.md Описание драйвера в репозитории на Github]
* [[Modbus|Описание протокола Modbus]]
* [[RS-485|Описание шины RS-485]]

Версия 18:31, 8 июля 2022

Описание

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

Общая информация

wb-mqtt-serial — драйвер master-slave протоколов для устройств, подключённых:

  • к шине RS-485 — протокол Modbus RTU и других;
  • через Ethernet — протоколы Modbus TCP, Modbus over TCP и другие;
  • к разъёмам MOD1–MOD3 — при наличии модулей расширения, использующих обмен по UART.

Драйвер опрашивает serial-устройства и публикует данные в топики MQTT-брокера. Устройства настраиваются через веб-интерфейс.

wb-mqtt-serial использует систему JSON-шаблонов, которые описывают подключённые устройства: тип протокола, номера регистров, название параметров и контролов в веб-интерфейсе контроллера. В стандартной поставке есть шаблоны для всех устройств Wiren Board, а также некоторых сторонних устройств: счётчики электроэнергии, частотные преобразователи, холодильные контроллеры и другие.

Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами.

Файлы и папки:

  • /etc/wb-mqtt-serial.conf — файл настроек драйвера, редактировать вручную не рекомендуем;
  • /usr/share/wb-mqtt-serial/templates — папка с предустановленными шаблонами;
  • /etc/wb-mqtt-serial.conf.d/templates — папка для пользовательских шаблонов, которые имеют приоритет над предустановленными.

Если вы добавили свой шаблон или изменили существующий, подождите 20 секунд, а потом перезагрузите страницу конфигуратора в веб-интерфейсе клавишами Ctrl+F5 или перезапустите сервис:

systemctl restart wb-mqtt-confed

О том, как получить доступ к файлам и папкам, читайте в статье Просмотр файлов контроллера с компьютера.

Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите в репозитории на Github.

Особенности

При работе с Modbus-устройствами, драйвер оптимизирует запросы к устройствам: считывает несколько регистров подряд, не выдерживает некоторые задержки, рекомендованные стандартом.

Поэтому при написании шаблона для сторонних Modbus-устройств, нужно указать параметр guard_interval_us, который рассчитывается по формуле:

guard_interval_us = (3.5*11*10^6)/(скорость в бит/с)

Так же этот параметр можно установить через веб-интерфейс:

  • Guard interval (us) — для порта.
  • Additional delay before each writing to port (us) — для устройства.

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

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

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

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

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

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

Диагностика неполадок

Если возникли проблемы с запуском драйвера, например, новое устройство не появилось, то можно узнать причину: выполните команду 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.

Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:

# wb-mqtt-serial -g
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-bac-6000-series.json:* Line 12, Column 5
  Missing ',' or '}' in object declaration

Проверить файл конфигурации и шаблоны на ошибки:

# wb-mqtt-serial -j
<3>ERROR: [serial config] Failed to parse /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json
Failed to parse JSON /usr/share/wb-mqtt-serial/templates/config-wb-mdm3.json:* Line 8, Column 9
  Missing ',' or '}' in object declaration

<3>ERROR: [serial] Can't find template for 'WB-MDM3'

При необходимости, можно добавить путь к файлу, который нужно проверить:

wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -j

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

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

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

При включённой отладке размер системного журнала будет быстро расти, поэтому не забудьте отключить отладку, когда необходимость в ней отпадет.

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

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

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

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

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

~# 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

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