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

Материал из Wiren Board
м (A.Degtyarev переименовал страницу Драйвер wb-mqtt-serial в Wb-mqtt-serial driver без оставления перенаправления: Часть переводимой страницы Драйвер wb-mqtt-serial.)
м (Обновил статью, требует правок)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE: Драйвер wb-mqtt-serial}}
<translate>
<!--T:1-->
'''Внимание!''' Драйвер ''wb-mqtt-serial'' ранее назывался ''wb-homa-modbus'', а конфигурационный файл <code>/etc/wb-mqtt-serial.conf</code> как <code>/etc/wb-homa-modbus.conf</code>. Учитывайте это, если используете устаревшие прошивки.


<!--T:2-->
'''ВНИМАНИЕ:''' Драйвер ''wb-mqtt-serial'' ранее назывался ''wb-homa-modbus'', а конфигурационный файл <code>/etc/wb-mqtt-serial.conf</code> как <code>/etc/wb-homa-modbus.conf</code>. Учитывайте это, если используете устаревшие прошивки.
'''Драйвер wb-mqtt-serial''' отвечает за работу с подключёнными по [[Special:MyLanguage/RS-485|RS-485]] устройствами в Wiren Board. Он обеспечивает работу с подключёнными устройствами через систему [[Special:MyLanguage/MQTT|MQTT]]-сообщений. В этой статье даётся упрощённое описание драйвера, полное смотрите [https://github.com/contactless/wb-mqtt-serial в описании драйвера на нашем Github].


==Поддерживаемые устройства== <!--T:3-->
== Описание ==
'''Драйвер wb-mqtt-serial''' отвечает за работу с подключенными по [[RS-485|RS-485]] устройствами в Wiren Board. Он обеспечивает работу с подключенными устройствами через систему [[MQTT|MQTT]]-сообщений. В этой статье даётся упрощённое описание драйвера, полное смотрите [https://github.com/contactless/wb-mqtt-serial в описании драйвера на нашем Github].


<!--T:4-->
==Поддерживаемые устройства==
В настоящее время поддерживается работа с:
*[[Периферийные устройства с интерфейсом RS-485 серии WB-xxxx|Периферийные устройства Wiren Board]] с интерфейсом Modbus RTU: модули реле, счётчики импульсов, датчики.
*Иные устройства, работающие по протоколу Modbus RTU — [[Устройства с интерфейсом Modbus|подробнее]].
*Приборы учёта электроэнергии, в том числе Меркурий 2XX, [http://milur.ru/index.php?page=milur-305 Милур 305], Энергомера CE301 и CE303, Нева МТ 323 и 324.
*Устройства компании [https://razumdom.ru/catalog/modbus_rtu/ Разумный дом] с интерфейсом Modbus RTU: датчики, релейные модули, диммеры светодиодных лент и т. д.
*Диммеры и релейные модули компании [http://www.uniel.ru/ru/catalog/1639 Uniel], а также другие устройства, работающие по протоколу ADICON / A-BUS / Uniel.
*Датчики ЭКСИС серии ИВТМ (включены в Госреестр измерений). Поддерживается [http://www.eksis.ru/technical-support/exchange-protocol/ протокол ИВТМ], список протестированных устройств смотрите в таблице ниже.
*Счётчики воды и тепла «Пульсар».


Модели устройств, проверенных непосредственно в лаборатории, находятся в списке [[Поддерживаемые устройства#Протестированные устройства сторонних производителей]].
Поддерживается работа с:
*Периферийными устройствами Wiren Board с интерфейсом Modbus RTU: модули реле, диммеры, счётчики импульсов, датчики и т.п.
*Устройствами сторонних производителей, работающих по протоколу [[Протокол Modbus|Modbus RTU]].
*Некоторыми устройствами, использующими протоколы ADICON / A-BUS / Uniel, Милур, ИВТМ, Пульсар, Меркурий 230, Энергомера ГОСТ МЭК 61107, НЕВА МТ 32х ГОСТ МЭК 61107. Полный список поддерживаемых устройств можно посмотреть в таблице [[Поддерживаемые устройства#Протестированные устройства сторонних производителей |Протестированные устройства сторонних производителей]].


=== Поддержка устройств различных протоколов на одной шине === <!--T:5-->
=== Поддержка устройств различных протоколов на одной шине ===  


<!--T:6-->
Использовать устройства с разными протоколами на одной шине возможно, но необходимо учитывать особенности конкретных протоколов.
Использовать устройства с разными протоколами на одной шине возможно, но необходимо учитывать особенности конкретных протоколов.


<!--T:7-->
Фреймы устройств Unitel начинаются с байта <code>0xff</code>, а устройств ИВТМ — с байта <code>0x24</code>. В случае с протоколами Modbus, Меркурий 230 и Милур первым байтом фрейма является идентификатор ''slave'', поэтому при совмещении таких устройств нужно внимательно подходить в выбору ''slave id''.  
Например, фреймы устройств Uniel начинаются с байта 0xff, устройств ИВТМ — с байта 0x24 ('$'), в случае же протоколов Modbus, Меркурий 230 и Милур первым байтом фрейма является идентификатор slave, поэтому при совмещении подобных устройств следует внимательно подходить к выбору slave id — у устройств Милур, например, slave id по умолчанию равен 0xff, что приводит к конфликту с устройствами Uniel. Устройства Милур требуют дополнительных задержек при опросе (заданы в шаблоне) и при использовании на одной шине с другими устройствами могут снизить скорость опроса. Некоторые устройства, поддерживающие дополнительные протоколы, могут оказаться несовместимыми с теми или иными протоколами на той же шине, например, было замечено, что устройства с поддержкой протокола A-BUS производства «Разумный дом» не могут работать на одной шине с устройствами Uniel. Работа устройств ИВТМ на одной шине с устройствами, работающими по другим протоколам, не проверялась. Проверенная рабочая комбинация: Modbus + Milur (slave_id != 0xff) + Uniel на одной шине.


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


<!--T:9-->
Иногда устройства, работающие на разных протоколах могут конфликтовать между собой: устройства с поддержкой протокола A-BUS не могут работать на одной шине с устройствами Unitel.  
В качестве отправной точки смотрите статью [[Драйвер wb-mqtt-serial:Примеры написания шаблонов|Драйвер wb-mqtt-serial:Примеры написания шаблонов]], для дальнейшей поддержки [mailto:info@contactless.ru свяжитесь с нами].


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


<!--T:11-->
=== Доработка драйвера для поддержки новых устройств ===
Конфигурация драйвера задаётся в файле <code>/etc/wb-mqtt-serial.conf</code>. Если такой файл создан, драйвер запускается при загрузке контроллера автоматически. Также драйвером можно управлять в ручном режиме из консоли:
 
Вы можете самостоятельно добавить поддержку новых modbus-устройств при помощи [[Драйвер wb-mqtt-serial:Примеры написания шаблонов|шаблонов]].
 
Если у вас возникли проблемы с составлением шаблона или выбранное вами устройство имеет свой протокол обмена данными — [https://wirenboard.com/ru/pages/contacts свяжитесь с нами] и мы постараемся помочь.
 
==Конфигурирование и запуск драйвера==
 
Если файл конфигурации создан, то драйвер запускается автоматически при загрузке контроллера.
 
Драйвером можно управлять в ручном режиме — для этого нужно подключиться к контроллеру по [[SSH]]. Доступные команды:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
service wb-mqtt-serial stop #остановить драйвер
service wb-mqtt-serial stop #остановить драйвер
service wb-mqtt-serial start #запустить драйвер
service wb-mqtt-serial start #запустить драйвер
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 #запустить драйвер в отладочном режиме с указанием пути к конфигурационному файлу
</syntaxhighlight>
</syntaxhighlight>


== Конфигурационный файл драйвера == <!--T:12-->
== Файл конфигурации драйвера ==  


<!--T:13-->
Перед использованием драйвер нужно настроить. Конфигурация драйвера хранится в файле <code>/etc/wb-mqtt-serial.conf</code>. Вы можете [[RS-485:Настройка через веб-интерфейс|редактировать конфигурацию драйвера через веб-интерфейс]] или вручную.
Для работы драйвера нужно отредактировать файл <code>/etc/wb-mqtt-serial.conf</code>. Обычный пользователь может воспользоваться способом [[RS-485:Настройка через веб-интерфейс|RS-485:Настройка через веб-интерфейс]], который тоже приводит к правильному заполнению файла конфигурации. Однако отредактировать файл можно и вручную, для этого:
#Ознакомьтесь с инструкцией [[Special:MyLanguage/Просмотр файлов контроллера с компьютера|Просмотр файлов контроллера с компьютера]]
#Файл <code>/etc/wb-mqtt-serial.conf</code> имеет структуру ''порты (ports) → устройства (devices)'': в файле есть описания физических портов контроллера, а внутри них — список устройств, которые подключены к этому порту.
#:Для каждого порта указываются настройки (скорость, чётность и т.п.), а также протокол (Modbus, RTU, etc.)
#:Для каждого устройства обязательно указывается его уникальный адрес на шине — ''slave_id''. Также можно указать другие необязательные параметры — смотрите полное описание формата [https://github.com/wirenboard/wb-mqtt-serial/blob/master/README.md в описании драйвера на нашем Github].
#Впишите конфигурацию для портов и подключённых устройств в файл, используя примеры ниже.
#Перезагрузите устройство или выполните из консоли команду
#: <syntaxhighlight lang="bash">
service wb-mqtt-serial restart
</syntaxhighlight>
#:Она перезапустит драйвер, и подключённое устройство появится в веб-интерфейсе.
#Если устройство не появилось, выполните команду <syntaxhighlight lang="bash">tail /var/log/messages</syntaxhighlight> или откройте файл <code>/var/log/messages</code> и промотайте его до конца. Если там будет строчка такого типа:
#:<code>May  6 17:50:58 wirenboard user.notice modbus: FATAL: Error parsing config file: Failed to parse JSON: * Line <b>15</b>, Column 17</code>
#:- ищите ошибку в 15-й строке конфигурационного файла.


===Пример конфигурации для [[Special:MyLanguage/WB-MRM2 Реле 2х канальное | модуля реле WB-MRM2]], подключённого к изолированному порту (RS-485-ISO) Wiren Board 4=== <!--T:14-->
=== Структура файла ===  


<!--T:15-->
Файл <code>/etc/wb-mqtt-serial.conf</code> имеет структуру <code>порты (ports)</code> → <code>устройства (devices)</code> → <code>каналы (channels)</code>: в файле есть описание физических портов контроллера, внутри них — список устройств подключенных к этому порту, а внутри устройств описаны каналы.
<syntaxhighlight lang="javascript">{
    "ports": [
        {
            "path" : "/dev/ttyNSC0",  //псевдофайл, соответствующий порту
            "baud_rate": 9600, //скорость порта, 9600 почти для всех устройств, но проверьте документацию к ним
            "parity": "N", //четность
            "data_bits": 8, //битов данных в посылке
            "stop_bits": 2, //количество стоп-битов. Чётность, количество битов и стоп-битов тоже редко меняются
            "poll_interval": 10, //интервал опроса устройств на порту в миллисекундах
            "devices" : [
                {
                    "device_type" : "WB-MRM2", //тип устройства, распознаваемый драйвером
                    "slave_id": 25 //адрес устройства
                }
            ]
        }
    ]
}</syntaxhighlight>
 
<!--T:16-->
Полный список поддерживаемых типов устройств см. в статье [[Special:MyLanguage/Поддерживаемые устройства|Поддерживаемые устройства]], а также [https://github.com/contactless/wb-homa-drivers/blob/master/wb-homa-modbus/README.md#%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2-device_type здесь].


=== Пример конфигурационного файла для нескольких подключённых устройств === <!--T:17-->
Для каждого порта указываются настройки: скорость, чётность и т.п., а также протокол: Modbus, RTU и т.п.


<!--T:18-->
Для каждого устройства обязательно указывается его уникальный адрес на шине — <code>slave_id</code>. Все доступные параметры и варианты значений перечислены в примере файла <code>/etc/wb-mqtt-serial.conf</code>:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
<!--T:19-->
// Configuration options
{
{
    // опция debug включает или выключает отладочную печать.
    // Опция -d командной строки wb-mqtt-serial также
    // включает отладочную печать и имеет приоритет над
    // данной опцией.
     "debug": false,
     "debug": false,
    // Задаёт интервал в секундах, в течение которого неизменяющиеся значения не будут публиковаться в MQTT.
    // По истечении интервала полученное значение будет опубликовано, даже если оно не изменилось.
    // Если установлен 0, каждое полученное от устройств значение будет опубликовано в MQTT.
    // Если установлено отрицательное значение, то значения будут публиковаться только при изменении. Это поведение по умолчанию.
    "max_unchanged_interval": -1,
    // список портов
     "ports": [
     "ports": [
         {
         {
             "path" : "/dev/ttyNSC1",
            // тип порта:
            // - "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,
             "baud_rate": 9600,
            // паритет - N, O или E (по умолчанию - N)
             "parity": "N",
             "parity": "N",
            // количество бит данных (по умолчанию - 8)
             "data_bits": 8,
             "data_bits": 8,
            // количество стоп-бит
             "stop_bits": 2,
             "stop_bits": 2,
             "poll_interval": 0,
 
            // Минимальный интервал опроса каждого регистра
            // по-умолчанию для устройств, подключенных к порту,
            // в миллисекундах
             "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,
             "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": [
                        {
                            // имя канала. topic'и, соответствующие каналу,
                            // публикуются как
                            // /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",
                            "reg_type" : "input",
                            "address" : 2,
                            "type": "text",
                            "scale": 0.075
                        },
                        {
                            "name" : "Temp 2",
                            "reg_type" : "input",
                            "address" : 3,
                            "type": "temperature",
                            "format": "s8"
                        }
                    ]
                },
                {
                    // ещё одно устройство на канале
                     "name": "DRB88",
                     "name": "DRB88",
                     "id": "drb88",
                     "id": "drb88",
                     "enabled": true,
                     "enabled": true,
                     "slave_id": "0x23",
                     "slave_id": 22,
    "device_type" : "DRB88"
 
                 },
                    // секция инициализации
                    "setup": [
                        {
                            // название регистра (для отладки)
                            // Выводится в случае включённой отладочной печати.
                            "title": "Input 0 type",
                            // адрес holding-регистра
                            "address": 1,
                            // значение для записи
                            "value": 1
                        },
                        {
                            "title": "Input 0 module",
                            "address": 3,
                            "value": 3 // was: 11
                        }
                    ],
                    "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
                        },
                        // ...
                    ]
                 }
            ]
        },
        {
            // ещё один порт со своим набором устройств
            "path" : "/dev/ttyNSC1",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 1,
            "poll_interval": 100,
            "enabled": true,
            "devices" : [
                 {
                 {
                     "slave_id": "0x26",
                    "name": "tM-P3R3",
    "device_type" : "MSU24"
                    "id": "tmp3r3",
                    "enabled": true,
                     "slave_id": 1,
                    "channels": [
                        {
                            "name" : "Relay 0",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        // ...
                    ]
                 },
                 },
                // ...
            ]
        }
    ]
}
</syntaxhighlight>
=== Внесение изменений вручную ===
# Ознакомьтесь с инструкцией [[Просмотр файлов контроллера с компьютера|Просмотр файлов контроллера с компьютера]] и выберите удобный для вас способ.
#Впишите конфигурацию для портов и подключенных устройств в файл.
#Чтобы описанные в файле устройства появились в веб-интерфейсе, перезагрузите контроллер или выполните команду:
#: <syntaxhighlight lang="bash">
service wb-mqtt-serial restart
</syntaxhighlight>
#Если устройство не появилось — можно посмотреть в системном лог-файле причину. Для этого выполните команду:
#:<syntaxhighlight lang="bash">tac /var/log/messages | grep wb-mqtt-confed</syntaxhighlight>, если файл содержит ошибки — это можно увидеть в сообщении:
#:<code>Jan 27 17:40:07 wirenboard-A6XXXT2R daemon.info wb-mqtt-confed[516]: ERROR: Failed to validate config file /etc/wb-mqtt-serial.conf: invalid character 'F' looking for beginning of value</code>.
== Примеры файла конфигурации ==
=== Одно устройство на шине RS-485 ===
Выведем среднеквадратичное значение напряжения на фазе 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" :
            [
                 {
                 {
                     "slave_id": "0x31",
// отображаемое имя устройства
    "device_type" : "MSU34"
"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]].
 
В примере счетчик WB-MAP3E подключен к serial-порту <code>/dev/ttyRS485-1</code>, работает по протоколу [[Протокол Modbus | Modbus]] и имеет адрес <code>142</code>, а датчик MSW3 подключен к serial-порту <code>/dev/ttyRS485-2</code>, работает по протоколу [[Протокол Modbus | Modbus]] и имеет адрес <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" :
            [
                 {
                 {
                     "slave_id": "0x04",
// отображаемое имя устройства
    "device_type" : "LC-103"
"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"
                        }
                    ]                   
                 }
            ]
        },
{
{
    "device_type" : "DDL24",
// тип порта
    "slave_id" : "0x20"
            "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" :
            [
                 {
                 {
                  "enabled": true,
// отображаемое имя устройства
                  "slave_id": "0x06",
"name" : "MSW3",
    "device_type" : "WB-MRM2"  
// протокол передачи устройства
              },
                    "protocol" : "modbus",
      {
// идентификатор устройства на шине
                "slave_id" : 16,
                    "slave_id" : "22",
"device_type" : "WB-MRGB"
// список каналов устройства
      }
                    "channels" :
                    [
                        {
// адрес регистра
                            "address" : "0x0000",
// формат канала
                            "format" : "s16",
// имя канала
                            "name" : "Temp",
                            // тип регистра
                            "reg_type" : "input",
// порядок, до которого будет округляться значение после всех преобразований
                            "round_to" : 0.5,
// коэффициент, на который умножается значение регистра перед публикацией в MQTT
                            "scale" : 0.1,
// тип элемента управления
                            "type" : "temperature"
                        }
                    ]                   
                }
             ]
             ]
         },
         }      
{
    "path" : "/dev/ttyNSC0",
    "type": "uniel",
    "poll_interval": 10,
    "enabled": true,
    "devices" : [
{
    "device_type" : "UCH-M141RC",
    "slave_id": 1
}
    ]
}
     ]
     ]
}
}
</syntaxhighlight>
</syntaxhighlight>
</translate>


== Включение отладки через веб-интерфейс ==
== Включение отладки через веб-интерфейс ==
Заходим в веб-интерфейс '''Configs - Serial Device Driver Configuration'''
Заходим в веб-интерфейс '''Settings''' → '''Configs''' → '''Serial Device Driver Configuration'''
[[Файл:Serial Web config.png|400px|thumb|center|Вид интерфейса]]
[[Файл:Serial Web config.png|400px|thumb|center|Вид интерфейса]]
Ставим галочку '''Enable debug logging'''
Ставим флажок '''Enable debug logging'''
[[Файл:Serial_Web_config_Enable_debug.png ‎|400px|thumb|center|Включение Debug]]
[[Файл:Serial_Web_config_Enable_debug.png ‎|400px|thumb|center|Включение Debug]]
После нажатия кнопки '''Save'''
После нажатия кнопки '''Save'''
В файл /var/log/messages будут записываться отправленные и принятые пакеты [[%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_Modbus | Modbus]].
В файл /var/log/messages будут записываться отправленные и принятые пакеты [[%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_Modbus | Modbus]].
<blockquote>Не забудьте '''отключить''' отладку. Иначе логи займут все доступное место.</blockquote>
 
'''ВНИМАНИЕ: '''Не забудьте отключить отладку. Иначе логи займут все доступное место.

Версия 13:57, 28 января 2021


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

Описание

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

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

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

  • Периферийными устройствами Wiren Board с интерфейсом Modbus RTU: модули реле, диммеры, счётчики импульсов, датчики и т.п.
  • Устройствами сторонних производителей, работающих по протоколу Modbus RTU.
  • Некоторыми устройствами, использующими протоколы ADICON / A-BUS / Uniel, Милур, ИВТМ, Пульсар, Меркурий 230, Энергомера ГОСТ МЭК 61107, НЕВА МТ 32х ГОСТ МЭК 61107. Полный список поддерживаемых устройств можно посмотреть в таблице Протестированные устройства сторонних производителей.

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

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

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

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

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

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

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

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

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

Конфигурирование и запуск драйвера

Если файл конфигурации создан, то драйвер запускается автоматически при загрузке контроллера.

Драйвером можно управлять в ручном режиме — для этого нужно подключиться к контроллеру по 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, RTU и т.п.

Для каждого устройства обязательно указывается его уникальный адрес на шине — slave_id. Все доступные параметры и варианты значений перечислены в примере файла /etc/wb-mqtt-serial.conf:

{
    // опция debug включает или выключает отладочную печать.
    // Опция -d командной строки wb-mqtt-serial также
    // включает отладочную печать и имеет приоритет над
    // данной опцией.
    "debug": false,

    // Задаёт интервал в секундах, в течение которого неизменяющиеся значения не будут публиковаться в MQTT.
    // По истечении интервала полученное значение будет опубликовано, даже если оно не изменилось.
    // Если установлен 0, каждое полученное от устройств значение будет опубликовано в MQTT.
    // Если установлено отрицательное значение, то значения будут публиковаться только при изменении. Это поведение по умолчанию.
    "max_unchanged_interval": -1,

    // список портов
    "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" : [
                {
                    // тип устройства, в системе должен быть корректный шаблон для этого типа
                    "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": [
                        {
                            // имя канала. topic'и, соответствующие каналу,
                            // публикуются как
                            // /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",
                            "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": [
                        {
                            // название регистра (для отладки)
                            // Выводится в случае включённой отладочной печати.
                            "title": "Input 0 type",
                            // адрес holding-регистра
                            "address": 1,
                            // значение для записи
                            "value": 1
                        },
                        {
                            "title": "Input 0 module",
                            "address": 3,
                            "value": 3 // was: 11
                        }
                    ],
                    "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
                        },
                        // ...
                    ]
                }
            ]
        },
        {
            // ещё один порт со своим набором устройств
            "path" : "/dev/ttyNSC1",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 1,
            "poll_interval": 100,
            "enabled": true,
            "devices" : [
                {
                    "name": "tM-P3R3",
                    "id": "tmp3r3",
                    "enabled": true,
                    "slave_id": 1,
                    "channels": [
                        {
                            "name" : "Relay 0",
                            "reg_type" : "coil",
                            "address" : 0,
                            "type": "switch"
                        },
                        // ...
                    ]
                },
                // ...
            ]
        }
    ]
}

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

  1. Ознакомьтесь с инструкцией Просмотр файлов контроллера с компьютера и выберите удобный для вас способ.
  2. Впишите конфигурацию для портов и подключенных устройств в файл.
  3. Чтобы описанные в файле устройства появились в веб-интерфейсе, перезагрузите контроллер или выполните команду:
    service wb-mqtt-serial restart
    
  4. Если устройство не появилось — можно посмотреть в системном лог-файле причину. Для этого выполните команду:
    tac /var/log/messages | grep wb-mqtt-confed
    
    , если файл содержит ошибки — это можно увидеть в сообщении:
    Jan 27 17:40:07 wirenboard-A6XXXT2R daemon.info wb-mqtt-confed[516]: ERROR: Failed to validate config file /etc/wb-mqtt-serial.conf: invalid character 'F' looking for beginning of value.

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

Одно устройство на шине RS-485

Выведем среднеквадратичное значение напряжения на фазе 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.

В примере счетчик WB-MAP3E подключен к serial-порту /dev/ttyRS485-1, работает по протоколу Modbus и имеет адрес 142, а датчик MSW3 подключен к serial-порту /dev/ttyRS485-2, работает по протоколу Modbus и имеет адрес 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"
                        }
                    ]                    
                }
            ]
        }        
    ]
}

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

Заходим в веб-интерфейс SettingsConfigsSerial Device Driver Configuration

Вид интерфейса

Ставим флажок Enable debug logging

Включение Debug

После нажатия кнопки Save В файл /var/log/messages будут записываться отправленные и принятые пакеты Modbus.

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