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?