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

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


Драйвер опрашивает serial-устройства и публикует данные в топики [[MQTT|MQTT]]-брокера. Устройства и порты настраиваются через веб-интерфейс, подробнее в статье [[RS-485:Configuration via Web Interface | Начальное конфигурирование устройств через веб-интерфейс]].
Поддерживается работа с:
*Периферийными устройствами 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]. Полный список поддерживаемых устройств можно посмотреть в таблице [[Поддерживаемые устройства#Протестированные устройства сторонних производителей |Протестированные устройства сторонних производителей]].


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


Если ваше устройство работает по поддерживаемому драйвером протоколу, но в стандартной поставке под него нет шаблона — можете написать шаблон сами: [[Connecting_Third_Party_Devices_to_Wiren_Board | Подключение стороннего Modbus-устройства к контроллеру Wiren Board]].
Использовать устройства с разными протоколами на одной шине возможно, но необходимо учитывать особенности конкретных протоколов.


Файлы и папки:
Например, фреймы устройств Unitel начинаются с байта <code>0xff</code>, а устройств ИВТМ — с байта <code>0x24</code>. В случае с протоколами Modbus, Меркурий 230 и Милур первым байтом фрейма является идентификатор ''slave'', поэтому при совмещении таких устройств нужно внимательно подходить к выбору ''slave id''.  
* <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>
У устройств Милур slave id по умолчанию равен <code>0xff</code>, что приведет к конфликту с устройствами Unitel. Также устройства Милур требуют дополнительных задержек при опросе и при использовании на одной шине с другими устройствами могут снизить скорость опроса.


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


Полное описание драйвера, список поддерживаемых протоколов и примеры шаблонов, смотрите '''[https://github.com/contactless/wb-mqtt-serial в репозитории на Github]'''.
Рекомендуем придерживаться проверенной формулы комбинации протоколов на одной шине: <code>Modbus + Милур (slave_id != 0xff) + Uniel</code>. Учитывайте, что сторонние производители устройств могут вносить недокументированные изменения в протокол, поэтому перед покупкой устройства желательно убедиться в работоспособности выбранного решения.


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


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


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


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


Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
Обычно драйвер запускается автоматически при загрузке контроллера и перезапускается при сохранении файла конфигурации в веб-интерфейсе.
Строка 46: Строка 40:
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
Для выполнения команд подключитесь к контроллеру по [[SSH]]. Доступны команды:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
systemctl stop wb-mqtt-serial # остановить
service wb-mqtt-serial stop #остановить драйвер
systemctl start wb-mqtt-serial # запустить
service wb-mqtt-serial start #запустить драйвер
systemctl restart wb-mqtt-serial # перезапустить
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 #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу
</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": [
                        {
                            // описание регистра настройки
                    "параметр": "значение",
...
                        },
                            ...
                    ],
                    // каналы второго устройства
                    "channels": [
                        {
                            //первый канал
                    "параметр": "значение",
...                           
                        },
                            ...
                    ]
                }
            ]
        },
        {
            // ещё один порт со своим набором устройств           
            "devices" : [
                {
                    "параметр": "значение",
...
 
                    "channels": [
    {
                    "параметр": "значение",
...
  }
                    ]
                }
                ...
            ]
        }
    ]
}
</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) ====
Раздел '''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''' вы найдете [[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="console">
<syntaxhighlight lang="bash">
# 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)
Строка 69: Строка 271:
</syntaxhighlight>
</syntaxhighlight>


Проверить только шаблоны, в том числе и не подключённые в файле конфигурации, можно командой:
== Примеры файла конфигурации ==
<syntaxhighlight lang="console">
 
# wb-mqtt-serial -g
В примерах мы описывали устройства в самом файле конфигурации, но при их большом количестве описание устройств можно вынести в [[Драйвер wb-mqtt-serial:Примеры написания шаблонов | шаблоны]].
<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>
Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика [[WB-MAP3E Power Meter | WB-MAP3E fw2]]. В примере счетчик подключен к serial-порту <code>/dev/ttyRS485-1</code>, работает по протоколу [[Протокол Modbus | Modbus]] и имеет адрес <code>142</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"
                        }
                    ]                   
                }
            ]
        }
    ]
}</syntaxhighlight>
 
=== Несколько подключенных устройств ===


Проверить файл конфигурации и шаблоны на ошибки:
Выведем среднеквадратичное значение напряжения на фазе L1 со счетчика [[WB-MAP3E Power Meter | WB-MAP3E fw2]] и температуру с датчика [[MSW3]].  
<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'
В примере устройства работают по протоколу [[Протокол Modbus | Modbus]]: счетчик WB-MAP3E подключен к serial-порту <code>/dev/ttyRS485-1</code> с адресом <code>142</code>, а датчик MSW3 подключен к serial-порту <code>/dev/ttyRS485-2</code> и имеет адрес <code>22</code>.
</syntaxhighlight>


При необходимости, можно добавить путь к файлу, который нужно проверить:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="bash">
{
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"
                        }
                    ]                   
                }
            ]
        },
{
// тип порта
            "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>


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


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


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


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


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


Пример вывода команды:
Пример вывода команды:
Строка 121: Строка 482:
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/ статье на Хабре].


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

Версия 22:39, 3 февраля 2021

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

Описание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    "channels": [
					    {
		                    "параметр": "значение",
							...
					   }
                    ]
                }
                ...
            ]
        }
    ]
}

Пример конфигурационного файла можете посмотреть в репозитории.

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

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

Порты (ports)

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

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

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

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

Описание устройства 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 вы найдете в статье о шаблонах.

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

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

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