OpenHAB

Привязка Arduino к определемнному порту через udev.

Сделал я исполнительную часть для умного дома на ардуино, которая релюшками клацает, так вот сильно раздражает то, что OpenHAB цепляет этот порт ttyUSB0 например и лочит его. Если перегрузить ардуину или передернуть кабель, то ардуина попадает уже на ttyUSB1, а опенхаб вообще про это не в курсе. Частично удалось решить проблему через правило udev.

Сначала смотрим USB-устройства на предмет идентификаторов:

[root@sf-srv rules.d]# lsusb
Protocol spec without prior Class and Subclass spec at line 17406
Bus 001 Device 003: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Находим нашу ардуину, это QinHeng Electronics HL-340 USB-Serial adapter и запоминаем идентификаторы, это 1a86 и 7523. Далее все обычно ищут серийный номер и пишут правило, так вот у меня это никак не работало, тогда я обратил внимание, на то как фильтрует USB VirrtualBox, так вот она использует атрибут product. Узнать его можно так:

[root@sf-srv rules.d]# udevadm info  -a /dev/ttyUSB1 | grep product
    ATTRS{product}=="USB2.0-Serial"
    ATTRS{product}=="UHCI Host Controller"

Наш COM-порт это USB2.0-Serial, теперь можем написать правило для udev:

Создадим файлик 99-usb-serial.rules в каталоге /etc/udev/rules.d с содержимым:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{product}=="USB2.0-Serial", SYMLINK+="arduino"

Теперь в не зависимости от того на каком виртуальном порту будет висеть наша ардуина, всегда будет создан верный симлинк /dev/arduino

[root@sf-srv ~]# file /dev/arduino
/dev/arduino: symbolic link to `ttyUSB1'

Именно его и добавляем в стартовый скрипт openhab:

-Dgnu.io.rxtx.SerialPorts=/dev/ttyS0:/dev/arduino

Вот, теперь если передернуть провод, то порт поменяется, но ссылка на него изменится и устройство будет доступно. Однако это полностью не решает проблему, openhab по прежнему не видит это устройство, без перезагрузки.

Но его можно перезагрузить тем же udev, добавляем еще одну строчку в rules.d

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{product}=="USB2.0-Serial", RUN+="/sbin/service openhab restart"

Может кто знает как можно перезагрузить только дополнение serial?