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

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


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


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


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


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


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


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


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