USB设备持久化
如果你连接了多个USB设备,当你重启树莓派时,设备的顺序可能会变化(ttyUSB0变成ttyUSB1或者其它)。
这里提供了解决方法:
找到USB设备的ID
确保所有需要的USB设备已连接到树莓派
执行以下命令:
sudo lsusb -v | more
将列出的以下几条信息记下来:
*idVendor *idProduct *iSerial
(你可以按空格键向下滚动)
例子
RFXtrx433返回:
idVendor 0x0403 Future Technology Devices International, Ltd idProduct 0x6001 FT232 USB-Serial (UART) IC iProduct 2 RFXtrx433 iSerial 3 07VYAR1X
Aeon ZWave返回:
idVendor 0x10c4 Cygnal Integrated Products, Inc. idProduct 0xea60 CP210x UART Bridge / myAVR mySmartUSB light
你需要'0x'后面的部分。所以,要记下'0403'而不是'0x0403'.
建立规则文件
使用以下命令新建一个规则文件:
sudo nano /etc/udev/rules.d/99-usb-serial.rules
RFX-433
将下面的代码保存到文件中:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="123YAOOW", SYMLINK+="ttyUSB-RFX433-A"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="123YX78C", SYMLINK+="ttyUSB-RFX433-B"
(Put in the values you've written down between the quotes (e.g. replace '0403' with the idVendor of your USB device).
Some devices don't show a serial, you can remove that part in the file, so it looks like this:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-RFX433"
Names should be ttyUSB-UNIQUENAME so you can easily identify them within Domoticz.
AeoTec Z-Stick
Gen2:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="ttyUSB-ZStick-2G"
Gen5:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyUSB-ZStick-5G"
如果没有返回USB设备信息,执行以下命令
sudo mknod /dev/ttyUSB0 c 188 0
sudo mknod /dev/ttyUSB1 c 188 1
然后从头再来。
重启并检查结果
使用以下命令重启(也可以用sudo reboot)
sudo shutdown -r now
重启后你应该有两个端口(ttyUSB21,ttyUSB22),并且它们将始终分配给你在规则文件中配置的设备。
要使用新端口,在Domoticz中,进入 设置 -> 硬件 页面,点击 RFXtrx433,然后在端口下拉菜单中选择新端口'ttyUSB21'。
然后保存
或者,你可以通过以下命令来重载udev规则而不需要重启:
sudo udevadm control --reload
然后断开并重新连接USB设备,看看是否正常。
选择性筛选
当存在更多设备(例如,具有相同的供应商和产品,并且没有序列号)的情况时,可以使用以下命令添加一些其他筛选条件:
udevadm info -a -n /dev/ttyUSBX
Udevadm信息以devpath指定的设备开头,然后向上遍历父设备链。它为每个找到的设备以udev规则格式输出所有可能的属性。 匹配的规则可以由设备的属性和来自单个父设备的属性组成。
然后比较两个设备的输出,找出不通之处并将其添加到99-usb-serial.rules文件中。
下列例子使用de devpath。devpath是总线和端口的序号,例如ATTRS{devpath}=="3.1"。要使层级更加直观,你可以用
lsusb -t
输出
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M
|__ Port 3: Dev 2, If 0, Class=hub, Driver=hub/4p, 480M |__ Port 1: Dev 7, If 0, Class=vend., Driver=pl2303, 12M