Китайское реле rs-485

Привет
Попалось мне ненужное китайское реле rs485, я его подключил к разъемам WB3.5, команды через minicom шлю, ответы получаю. Как его прикрутить для управления через WB, через виртуальное устройство и движок правил?
Реле типа такого

http://contactless.ru/wiki/index.php/RS-485

Если там Modbus, то http://contactless.ru/wiki/index.php/Драйвер_wb-mqtt-serial

Если нет, то можно как-то так: http://contactless.ru/wiki/index.php/Движок_правил_wb-rules#.D0.9E.D1.82.D0.BF.D1.80.D0.B0.D0.B2.D0.BA.D0.B0_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4_.D0.BF.D0.BE_RS-485

Евгений, спасибо.
Modbus есть, по ссылке прочитал. Но вопрос, как оно будет управляться в плане команд, они везде одинаковые?

Вот тут описание этого реле и его управления.

не подскажете, данный модуль по ощущениям в подразетник лезет?

не подскажете, данный модуль по ощущениям в подразетник лезет?

не знаю, не пробовал. могу в выходные посмотреть ширину и длину, высота реле + 2 мм.

Делаю по примеру, но выдает ошибку
FATAL: Error parsing config file: the device has no channels: Chine
или если убрать со строчки //“device_type” : “Chinese”, комментарий
FATAL: Error parsing config file: Can’t find the template for ‘Chinese’ device type.

    {
 "ports": [
    {
        "path" : "/dev/ttyNSC0",  //псевдофайл, соответствующий порту
        "baud_rate": 9600, //скорость порта, 9600 почти для всех устройств,$
        "parity": "N", //четность
        "data_bits": 8, //битов данных в посылке
        "stop_bits": 1, //количество стоп-битов. Чётность, количество битов$
        "poll_interval": 10, //интервал опроса устройств на порту в миллисе$
        "devices" : [
            {
            "name": "Chine",
            "id": "ch",
            "enable": true,
            //"device_type" : "Chinese", //тип устройства, распознаваемый д$
                "slave_id": 0 //адрес устройства
            }
        ]
    }
]
    }
  1. Внимательно прочитайте документацию Драйвер wb-mqtt-serial — Wiren Board

  2. Вам собственно всё написали в сообщении обо ошибке:

Вы объявили устройство без типа (т.е. нигде нет для него шаблона и каналы надо явно описывать), но не указали ему ни одного канала.

Вы сказали драйверу, чтобы он взял описание из шаблона с названием “Chinese”, а такого шаблона нет.

  1. Лучше всё-таки найти название модели на устройстве, а не называть девайс “Chinese”. Так мы этот шаблон можем добавить в общую библиотеку для всеобщего блага. А когда там какая-то ерунда вместо названия и описания - очевидно не можем.

  2. Код на форуме удобно форматировать тремя символами обратной кавычки (на русской букве ё) до и после блока кода.

Спасибо, я не обратил внимания на ссылку, тогда бы я и не задал вопрос про “@Can’t find the template for ‘Chinese’ device type”
Так я и хочу сделать по модели, просто названия не смог найти, но и для теста мне любое подойдет.

Добрый вечер.
Не могу понять, как сделать. Через serial_tool работает, передаю команду 01 06 00 01 03 00 D8 FA - переключить реле в другой режим, все работает. Добавляю в конфиг и запускаю в режиме отладки, не работает, выдает такую ошибку

root@wirenboard:/usr/share/wb-mqtt-serial/templates# wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d
Setting up devices at /dev/ttyNSC0
AddDevice: 1_1 (rs485_2ch_12v) @ 1 -- protocol: modbus
AddRegister: <modbus:1:coil: 1>
Connected with code 0
Subscription succeeded.
Adding range: 1 coil(s) @ 1 of slave modbus:1
modbus: read 1 coil(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 coil(s) @ 1 of slave modbus:1
modbus: read 1 coil(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 coil(s) @ 1 of slave modbus:1
{
        "device_type": "rs485_2ch_12v",
        "device":
                {
                    "name": "rs485_2ch_12v",
                    "id": "1",
                    "enabled": true,
                    "slave_id": 01,
                    "channels": [
                        {
                            "name" : "Relay 1",
                            "reg_type" : "coil",
                            "address" : "01 06 00 01 03 00 D8 FA",
                            "type": "switch"
                        }//,
                        //{
                        //    "name" : "Relay 2",
                        //    "reg_type" : "coil",
                        //    "address" : 0002,
                        //    "type": "switch"
                        //}
                    ]
                }
}

/etc/wb-mqtt-serial.conf

{
    "ports": [
        {
            "path": "/dev/ttyNSC0",
            "baud_rate": 9600,
            "parity": "N",
            "data_bits": 8,
            "stop_bits": 1,
            "poll_interval": 5,
            "devices": [
                {

                        "device_type": "rs485_2ch_12v",
                        "slave_id": 1,
                    //"name": "rs485_2ch_12v",
                    //"id": "rs485_2ch_12v",
                    "enable": true
                }
            ]
        }
    ]
}

Просмотрел github, но ответ не нашел :frowning:
https://github.com/contactless/wb-homa-drivers/tree/master/wb-mqtt-serial

так нельзя. Драйвер поддерживает определённые протоколы, в поле адрес пишется адрес, а не непонятно что.

Ваша команда выглядит подозрительно похоже на Modbus RTU, тем не менее:

boger@boger-laptop:~$ sudo modbus_client --debug -mrtu /dev/tty55 -t0x06 -a0x01 -r1 0x0300
Data to write: 0x300
Opening /dev/tty55 at 9600 bauds (E, 8, 1)
[01][06][00][01][03][00][D8][FA]

так что ставьте протокол modbus, адрес 1, тип регистра holding, on_vaue : “0x0300”.

В их инструкции написано Modbus.

Почему holding, on_vaue : “0x0300”, не понял?

Ну тогда вам либо нужно найти инженера, который настроит и объяснит, либо китайское реле кому-нибудь подарить и купить наше, которое за вас настроили.

Добрый вечер.
Внимательно прочитал выши посты и вроде стало понятно, сейчас в отладке такая ошибка
modbus: read 1 holding(s) @ 1 of slave modbus:1
setting device register: <modbus:1:holding: 1> ← 1
modbus: write 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
new val for <modbus:1:holding: 1>: 0
register value change: <modbus:1:holding: 1> ← 0
OnValue: 768; payload: 0
channel Relay 1 device id: rs485_2ch_12v_1 – topic: /devices/rs485_2ch_12v_1/controls/Relay 1 ← 0
modbus: read 1 holding(s) @ 1 of slave modbus:1

“переключатель” в web интерфейсе не меняет своего значения, всегда возвращается обратно.

Это как, не очень понял в описание wb-mqtt-serial такого не увидел.

Сделал настройки как написано выше, но не работает. Кнопка переключается и возвращается обратно или же появляется ошибка " TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1 modbus: read 1 holding(s) @ 1 of slave modbus:1"

root@wirenboard:~# wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d
Setting up devices at /dev/ttyNSC0
AddDevice: Relay_rs485_2ch_12v @ 1 -- protocol: modbus
AddRegister: <modbus:1:holding: 1>
Connected with code 0
Adding range: 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
Subscription succeeded.
new val for <modbus:1:holding: 1>: 1
register value change: <modbus:1:holding: 1> <- 1
OnValue: 768; payload: 0
channel Relay_1 device id: Relay_rs485_2ch_12v -- topic: /devices/Relay_rs485_2ch_12v/controls/Relay_1 <-- 0
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146343972: Wait until 1481146344051
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344074: Wait until 1481146344172
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344195: Wait until 1481146344293
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344315: Wait until 1481146344413
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344437: Wait until 1481146344535
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344558: Wait until 1481146344656
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344678: Wait until 1481146344776
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344799: Wait until 1481146344896
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146344919: Wait until 1481146345017
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345040: Wait until 1481146345137
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345160: Wait until 1481146345258
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345282: Wait until 1481146345378
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345401: Wait until 1481146345499
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345521: Wait until 1481146345619
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345642: Wait until 1481146345740
Connected with code 0
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345763: Wait until 1481146345860
Subscription succeeded.
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146345883: Wait until 1481146345981
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346004: Wait until 1481146346101
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346124: Wait until 1481146346222
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346244: Wait until 1481146346342
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346365: Wait until 1481146346463
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346486: Wait until 1481146346583
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346606: Wait until 1481146346704
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346726: Wait until 1481146346824
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346850: Wait until 1481146346947
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146346970: Wait until 1481146347067
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347090: Wait until 1481146347188
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347211: Wait until 1481146347309
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347331: Wait until 1481146347429
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347455: Wait until 1481146347549
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347572: Wait until 1481146347670
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347693: Wait until 1481146347791
Connected with code 0
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347813: Wait until 1481146347911
Subscription succeeded.
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146347934: Wait until 1481146348032
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348055: Wait until 1481146348153
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348176: Wait until 1481146348274
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348296: Wait until 1481146348394
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348416: Wait until 1481146348514
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348537: Wait until 1481146348635
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348658: Wait until 1481146348755
setting device register: <modbus:1:holding: 1> <- 1
modbus: write 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
new val for <modbus:1:holding: 1>: 0
register value change: <modbus:1:holding: 1> <- 0
OnValue: 768; payload: 0
channel Relay_1 device id: Relay_rs485_2ch_12v -- topic: /devices/Relay_rs485_2ch_12v/controls/Relay_1 <-- 0
1481146348791: Wait until 1481146348884
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146348907: Wait until 1481146349004
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349027: Wait until 1481146349124
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349147: Wait until 1481146349245
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349268: Wait until 1481146349366
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349388: Wait until 1481146349486
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349508: Wait until 1481146349606
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349629: Wait until 1481146349727
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349750: Wait until 1481146349847
Connected with code 0
modbus: read 1 holding(s) @ 1 of slave modbus:1
Subscription succeeded.
1481146349873: Wait until 1481146349968
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146349991: Wait until 1481146350089
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350111: Wait until 1481146350209
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350232: Wait until 1481146350329
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350353: Wait until 1481146350451
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350473: Wait until 1481146350571
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350594: Wait until 1481146350692
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350714: Wait until 1481146350812
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350835: Wait until 1481146350933
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146350956: Wait until 1481146351054
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351077: Wait until 1481146351174
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351197: Wait until 1481146351295
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351319: Wait until 1481146351416
modbus: read 1 holding(s) @ 1 of slave modbus:1
new val for <modbus:1:holding: 1>: 1
register value change: <modbus:1:holding: 1> <- 1
OnValue: 768; payload: 0
channel Relay_1 device id: Relay_rs485_2ch_12v -- topic: /devices/Relay_rs485_2ch_12v/controls/Relay_1 <-- 0
1481146351452: Wait until 1481146351537
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351560: Wait until 1481146351658
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351681: Wait until 1481146351778
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351801: Wait until 1481146351899
Connected with code 0
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146351923: Wait until 1481146352019
Subscription succeeded.
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352042: Wait until 1481146352140
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352163: Wait until 1481146352260
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352283: Wait until 1481146352381
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352403: Wait until 1481146352501
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352524: Wait until 1481146352622
modbus: read 1 holding(s) @ 1 of slave modbus:1
1481146352644: Wait until 1481146352742
setting device register: <modbus:1:holding: 1> <- 1
modbus: write 1 holding(s) @ 1 of slave modbus:1
TRegisterHandler::Flush(): warning: Serial protocol error: failed to write holding @ 1 slave_id is 1(0x1)
modbus: read 1 holding(s) @ 1 of slave modbus:1
new val for <modbus:1:holding: 1>: 1
register value change: <modbus:1:holding: 1> <- 1
OnValue: 768; payload: 0
channel Relay_1 device id: Relay_rs485_2ch_12v -- topic: /devices/Relay_rs485_2ch_12v/controls/Relay_1 <-- 0
1481146353259: Wait until 1481146353305
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
Connected with code 0
Subscription succeeded.
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
Connected with code 0
Subscription succeeded.
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1
TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
modbus: read 1 holding(s) @ 1 of slave modbus:1

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

  1. Положение переключателей;
  2. Скриншот общения с реле с помощью команды modbus_client с ключом --debug:
    а. как вы читаете состояние реле;
    б. как вы изменяете состояние реле
    Для общения с реле используются функции с кодами 0x03 и 0x06, (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers), (0x06) — запись значения в один регистр хранения (Preset Single Register). Так в документации к реле написано. Значит, тип регистра holding.
    Дальше будем по обстоятельствам действовать.

Добрый день.
Спасибо за ответ и готовность помочь.
Завтра буду на месте и постараюсь прислать все ответы, сейчас физически не могу.

  1. а. чтение состояния
root@wirenboard:~# modbus_client --debug -mrtu /dev/ttyNSC0 -b 9600 -s1 -pnone -t0x03 -a0x01 -r1 0x0001
0x0001 Opening /dev/ttyNSC0 at 9600 bauds (N, 8, 1)
[01][03][00][01][00][01][D5][CA]
Waiting for a confirmation...
<01><03><02><00><00><B8><44>
SUCCESS: read 1 of elements:
	Data: 0x0000 
  1. б. изменение состояния
root@wirenboard:~# modbus_client --debug -mrtu /dev/ttyNSC0 -b 9600 -s1 -pnone -t0x06 -a0x01 -r1 0x0300
Data to write: 0x300
Opening /dev/ttyNSC0 at 9600 bauds (N, 8, 1)
[01][06][00][01][03][00][D8][FA]
Waiting for a confirmation...
<01><06><00><01><03><00><D8><FA>
SUCCESS: written 1 elements!

тоже самое через serial_tool

serial_tool on /dev/ttyNSC0: 9600 8N1.0
   Enter your commands below in HEX form. 
   All characters but 0-9,a-f including spaces are ignored.
   Press Control-D or Control-C to leave the application.
   Press [Enter] to print received data
   01 03 00 01 00 01 D5 CA - запрос состояние реле 1
   01 03 02 00 00 B8 44 - выключено
   01 06 00 01 03 00 D8 FA - изменить состояние 
   01 06 00 01 03 00 D8 FA - ответ 
   01 03 00 01 00 01 D5 CA - запрос состояния реле 1
   01 03 02 00 01 79 84 - состояние изменилось

Ну, красота. И реле срабатывает?! А что такое команде в чтения состояния 0x0001 в конце? это остаток от предыдущей команды записи?
Как сейчас всё у вас устроено: вы сконфигурировали порт, написали темплейт для этой зверюги, добавили в порт устройство из темплейта, а виртуальный выключатель не отрабатывает и в логах одни ошибки? Если так, хотел бы попросить вас выслать пока вот прямо самые актуальные: шаблон устройства, конфиг порта.

А как ведет себя виртуальный выключатель, если вы остановили драйвер, включили реле из командной строки, а потом запустили драйвер?

Да, видимо случайно захватил.

Да, крайние разы я делал через вебинтерфейс. Если нажать на “выключатель” он сдвигается в положение On и возвращается обратно. Иногда он переходит в состояние On и остается там, но при этом реле не срабатывает, а в лог начинают падать ошибки.

    Subscription succeeded.
    TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
    modbus: read 1 holding(s) @ 1 of slave modbus:1
    TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
    modbus: read 1 holding(s) @ 1 of slave modbus:1
    TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
    modbus: read 1 holding(s) @ 1 of slave modbus:1
    TModbusDevice::ReadRegisterRange(): failed to read 1 holding(s) @ 1 of slave modbus:1
    modbus: read 1 holding(s) @ 1 of slave modbus:1

Хорошо, пока не могу туда зайти.

Он всегда переходит в состояние OFF.

Реле – единственное устройство, подключенное к WB35?
Попробуйте, пожалуйста, установить strace:
apt-get instal strace
и выполнить команду
strace -f -e read,write,ioctl,open,close -o test.txt wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d во время выполнения которой пощелкайте виртуальным выключателем. Лог будет писаться в файл test.txt довольно быстро, поэтому долго не выполняйте команду, пощелкайте – возникла неисправность, сразу завершайт, а то все место свободное съест. Файл этот в архиве пришлите, пожалуйста, на info@contactless.ru с пометкой “для Kilpio”. Потом проинформируйте меня на форуме, что файл ушел. Спасибо.