У меня есть небольшой скрипт на Python, который переназначает клавиши G на моем Logitech G710 с клавиш по умолчанию 1-6 на клавиши F13-18, который отлично работает при ручном вызове, например:
./script.py /dev/hidraw3
Проблема, с которой я сталкиваюсь, заключается в автоматическом запуске скрипта на плагине устройства. В настоящее время у меня естьудевправило, которое теоретически должно работать, но не работает.
SUBSYSTEM=="hidraw", KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c24d", ATTRS{bInterfaceNumber}=="01", ACTION=="add", RUN+="/usr/local/bin/g710.py %k"
Весь сценарий:
#!/usr/bin/python3
import sys
import hid
def bindkeys(node):
board = hid.device()
board.open_path(sys.argv[1].encode())
board.send_feature_report([9, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0, 0, 0, 0, 0, 0])
print("script fired")
print(board.get_manufacturer_string())
board.close()
def main(args):
bindkeys(args)
if __name__ == '__main__':
main(sys.argv[1].encode())
В чем дело?
решение1
Ну, похоже, что SUBSYSTEM=="hidraw"
слишком далек от , SUBSYSTEM=="usb"
чтобы его можно было использовать ATTRS{bInterfaceNumber}
, поэтому я просто переделал скрипт, чтобы найти нужный узел hidraw и активировать его только при вставке нужного устройства:
#!/usr/bin/python3
import hid
def bindkeys(node):
board = hid.device()
board.open_path(node)
board.send_feature_report([9, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0, 0, 0, 0, 0, 0])
board.close()
def find_g710():
for device in hid.enumerate():
if device['vendor_id'] == 0x046d and device['product_id'] == 0xc24d and device['interface_number'] == 1:
return device['path']
def main():
g710 = find_g710()
bindkeys(g710)
if __name__ == '__main__':
main()
со следующим правилом udev:
SUBSYSTEM=="hidraw", ACTION=="add", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c24d", RUN+="/usr/local/bin/g710.py"