Modbus RTU <==> MQTT bridge which follows Wiren Board MQTT Conventions. It's designed to be used on Wiren Board family of programmable automation controllers (PACs), although there is nothing that prevents it from running on a arbitrary Linux machine.
Драйвер Modbus запускается командой /etc/init.d/wb-homa-modbus start
По умолчанию запуск драйвера происходит при загрузке системы при
наличии конфигурационного файла /etc/wb-homa-modbus.conf. При
установке пакета конфигурационный файл, в котором не описано ни одного подключенного устройства.
При старте по-умолчанию драйвер завершается с ошибкой. Добавьте устройства в /etc/wb-homa-modbus.conf либо воспользуйтесь онлайн-редактором настроек для начала работы.
Возможен запуск демона вручную, что может быть полезно для работы в отладочном режиме:
# service wb-homa-modbus stop
# wb-homa-modbus -c /etc/wb-homa-modbus.conf -d
Конфигурационный файл построен по трёхуровневой схеме: порты (ports) -> устройства (devices) -> каналы (channels). Конфигурация устройства device может быть задана двумя способами: вручную прописать все параметры или задать только пять параметров:
{
// по DeviceType драйвер будет искать параметры в папке
// /usr/share/wb-homa-modbus/templates
"device_type" : "DeviceType",
// отображаемое имя устройства. Публикуется как
// .../meta/name в MQTT
// По умолчанию name берется из шаблона и добавляется slave_id, т.е.
// "name" + " " + "slave_id"
"name" : "somename",
// уникальный идентификатор устройства в MQTT.
// каждое элемент в devices должен иметь уникальный id
// topic'и, относящиеся в MQTT к данному устройству,
// имеют общий префикс /devices/<идентификатор топика>/...
// также по умолчанию берется из шаблона с добавлением slave_id:
// "deviceID" + "_" + slave_id
"id" : "deviceID",
// идентификатор Modbus slave
"slave_id" : slaveID,
"enabled" : true
// включить/выключить устройство. В случае задания
// "enabled": false опрос устройства и запись значений
// его каналов не происходит. По умолчанию - true.
}
Структура папки templates такова, что в каждом файле приведены параметры для одного типа устройств. Также можно совместить первый способ со вторым, к вышеприведенным 5 параметрам дописать конфигурацию для каналов, которые не прописаны в соответствующем файле в папке templates. См. также: пример конфигурационного файла с использованием шаблонов.
Ниже приведён пример конфигурационного файла /etc/wb-homa-modbus.conf
{
// опция debug включает или выключает отладочную печать.
// Опция -d командной строки wb-homa-modbus также
// включает отладочную печать и имеет приоритет над
// данной опцией.
"debug": false,
// список портов
"ports": [
{
// устройство, соответствующее порту RS-485
"path" : "/dev/ttyNSC0",
// скорость порта
"baud_rate": 9600,
// паритет - N, O или E (по умолчанию - N)
"parity": "N",
// количество бит данных (по умолчанию - 8)
"data_bits": 8,
// количество стоп-бит
"stop_bits": 2,
// интервал опроса устройств на порту в миллисекундах
"poll_interval": 10,
// включить/выключить порт. В случае задания
// "enabled": false опрос порта и запись значений
// каналов в устройства на данном порту не происходит.
// По умолчанию - true.
"enabled": true,
// список устройств на данном порту
"devices" : [
{
// отображаемое имя устройства. Публикуется как
// .../meta/name в MQTT
"name": "MSU34+TLP",
// уникальный идентификатор устройства в MQTT.
// каждое элемент в devices должен иметь уникальный id
// topic'и, относящиеся в MQTT к данному устройству,
// имеют общий префикс /devices/<идентификатор топика>/...
"id": "msu34tlp",
// идентификатор Modbus slave
"slave_id": 2,
// включить/выключить устройство. В случае задания
// "enabled": false опрос устройства и запись значений
// его каналов не происходит. По умолчанию - true.
"enabled": true,
// список каналов устройства
"channels": [
{
// имя канала. topic'и, соответствующие каналу,
// публикуются как
// /devices/<идентификатор канала>/controls/<имя канала>
"name" : "Temp 1",
// тип регистра Modbus.
// возможные значения:
// "coil" - 1 бит, чтение/запись
// "discrete" - 1 бит, только чтение
// "holding" - 16 бит, чтение/запись
// "input" - 16 бит, только чтение
"reg_type" : "input",
// адрес регистра Modbus
"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 регистра, начиная с указанного)
"format": "s8"
// для регистров типа coil и discrete
// с типом отображения switch/wo-swich
// также допускается задание on_value -
// числового значения, соответствующего
// состоянию "on" (см. ниже)
},
{
// Ещё один канал
"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"
},
// ...
]
},
// ...
]
}
]
}
В драйвере wb-homa-modbus реализована поддержка некоторых устройств Uniel (smart.uniel.ru). Эти устройства используют собственный протокол, отличный от Modbus-RTU.
Поддерживаются устройства: UCH-M111RX/0808 (модуль реле), UCH-M131RC/0808 (фазовый диммер на 220В), UCH-M141RC/0808 (диммер светодиодных лент), UCH-M121RX/0808 (модуль реле с встроенной логикой, работа не проверялась).
Для работы устройств необходимо выставить тип "uniel" для порта, работа с устройствами Modbus на одном порте не поддерживается.
Все типы регистров (input, holding, coil) равнозначны и соответствуют однобайтным регистрам ("параметрам") протокола Uniel, чтение и запись которых производится через команды 0x05 и 0x06. Допустимые значения адреса регистров: 0-255 ("0x00"-"0xff").
Дополнительно поддерживаются регистры, доступные на запись через команду 0x0A, а на чтение через команду 0x05. Такие регистры обозначаются следующим образом:
"address": "0x0100WWRR"
здесь WW - шестнадцатиречный адрес регистра (параметра) для записи с помощью команды 0x0A, RR - шестнадцатиречный адрес регистра (параметра) для чтения командой 0x05.
Пример (чтение по адресу 0x41, запись командой 0x0A по адресу 0x01):
{
"name" : "LED 1",
"reg_type": "holding",
"address": "0x01000141",
"type": "range",
"max": "0xff"
},
Для устройств типа "uniel" также существуют шаблоны конфигурации, для примера в приведенном ниже файле приведены разные варианты записи параметров, первое устройство задано через шаблон, второй device через шаблон, но параметры "name" и "id" заданы, и также можно добавить конфиг для канала, который добавится к тем, что есть в шаблоне(но он не должен описывать тот же канал что уже есть в шаблоне), и параметры третьего устройства записаны явно. Шаблоны для устройств типа "uniel" также находятся в папке /usr/share/wb-homa-modbus/templates/
См. также: пример конфигурационного файла.
Modbus-RTU
| Device | device_type | id_prefix | name_prefix |
|---|---|---|---|
| "Разумный дом" четырёхканальный диммер светодиодов DDL4 | DDL24 | ddl24 | DDL24 |
| "Разумный дом" релейный модуль DRB88 | DRB88 | drb88 | DRB88 |
| "ICP DAS" модуль управления освещением LC-103 | LC-103 | lc-103 | LC-103 |
| "Разумный дом" MSU24 | MSU24 | msu24 | MSU24 |
| "Разумный дом" MSU21 | MSU21 | msu21 | MSU21 |
| "Разумный дом" MSU34+TLP | MSU34 | msu34tlp | MSU34+TLP |
| "Разумный дом" MSU34+TLHP | MSU34TLHP | msu34tlhp | MSU34+TLHP |
| "ICP DAS" модуль ввода-вывода TM-P3R3 | TM-P3R3 | TM-P3R3 | tmp3r3 |
| "Kvadro" модуль подключения термометров 1-wire | kvadro-1wire | kvadro-1wire | Kvadro 1-Wire |
| PD561Z-9SY счётчик электроэнергии | PD561Z | pd561z | pd561z |
| SDM220 счётчик электроэнергии | SDM220 | sdm220 | sdm220 |
| Wiren Board RGB-диммер WB-MRGB | WB-MRGB | WB-MRGB | wb-mrgb |
| Wiren Board Релейный модуль WB-MRM2 | WB-MRM2 | WB-MRM2 | wb-mrm2 |
| Wiren Board Релейный модуль WB-MR11 | WB-MR11 | WB-MR11 | wb-mr11 |
| Wiren Board модуль дискретных/счётных входов WB-MCM16 | WB-MCM16 | WB-MCM16 | wb-mcm16 |
| Device | device_type | id_prefix | name_prefix |
|---|---|---|---|
| Модуль управления освещением UCH-M111RX/0808 | UCH-M111RX | uchm111rx | UCH-M111RX 0808 |
| Модуль управления автоматикой UCH-M121RX/0808 | UCH-M121RX | uchm121rx | UCH-M121RX 0808 |
| Диммер светодиодных ламп UCH-M141RC/0808 | UCH-M141RC | uchm141rc | UCH-M141RC 0808 |