• 0 Posts
  • 8 Comments
Joined 2 years ago
cake
Cake day: December 20th, 2023

help-circle
  • Edit: Once you “grab” your input device with python-evdev (dev.grab()), the input will be absorbed until it is un-grabed (dev.ungrab()). If you grab your only keyboard input, you’ll be stuck and will need a secondary keyboard to get unstuck.

    I have a bad habit of speculating too much, I’m gonna try to stick to just what I did in case I’m remembering some of the why details incorrectly. I’ll use the details from my device, anywhere you see “Azeron LTD Azeron Keypad”, “16d0”, or “1103”, you need to replace the values with your device-

    Start by finding the info for the input device you want to monitor:

    cat /proc/bus/input/devices | more
    

    This should result in a list of input devices with various details, I used the ‘Name’ to identify mine:

    N: Name="Azeron LTD Azeron Keypad"
    

    When you have found the device, save the vendor ID and product ID for the next step:

    I: Bus=0003 Vendor=16d0 Product=1103 Version=0111
    N: Name="Azeron LTD Azeron Keypad"
    

    Add a udev rule so that you can read the input from the device, and another for python-evdev to create a virtual device. I use link_priority 71 (as seen in the file name). The rule I’m using to let the virtual device be created could be better - this is something you might want to research more for a permanent solution, but this rule can be removed later if you just wanted to test with it:

    sudo nano /etc/udev/rules.d/71-azeron-uaccess.rules
    

    Write the file contents:

    #Access to read from "Azeron LTD Azeron Keypad"
    SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="1103", TAG+="uaccess"
    
    #Access for python-evdev to create a new device
    KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess", MODE="0660"
    

    Restart udev:

    sudo udevadm control --reload-rules && sudo udevadm trigger
    

    At this point, you should have access to the device from python-evdev and also be able to create a virtual device with python-evdev. I don’t know if it will help, but I figured I can add a bit of my code here:

    import evdev, subprocess, re
    from evdev import UInput, InputDevice, ecodes
    from select import select
    
    virtual_device_name = 'python-mouse-device'
    input_mouse = '/dev/input/'
    input_keyboard = '/dev/input/'
    
    # These Regex's may need to be updated per-device. These match 
    # my Azeron Cyro Mouse and Key Inputs.
    input_keyboard_regex = "^.*Azeron_LTD_Azeron_Keypad_2053388B5942.*event-kbd.*"
    input_mouse_regex = "^.*Azeron_LTD_Azeron_Keypad_2053388B5942.*event-mouse.*"
    
    # Get the path to the input devices. These are dynamic, and can change on system reboot.
    devices_by_id = subprocess.run(["ls", "-l", "/dev/input/by-id"], encoding='utf-8', stdout=subprocess.PIPE)
    devices_by_id = devices_by_id.stdout.split('\n')
    
    for device_id in devices_by_id:
        device_match = re.search(input_mouse_regex, device_id)
        if device_match:
            input_mouse = input_mouse + re.search("event[0-9]{1,}", device_match.group()).group()
            
        device_match = re.search(input_keyboard_regex, device_id)
        if device_match:
            input_keyboard = input_keyboard + re.search("event[0-9]{1,}", device_match.group()).group()
    
    if input_mouse == '/dev/input/' or not input_mouse:
        sys.exit("Mouse not found")
    
    if input_keyboard == '/dev/input/' or not input_keyboard:
        sys.exit("Keyboard not found")
    
    #Create the virtual mouse
    ui = UInput.from_device(InputDevice(input_mouse), name=virtual_device_name)
    
    try:
    	#Define the devices
    	devices = map(InputDevice, (input_keyboard, input_mouse))
    	devices = {dev.fd: dev for dev in devices}
    	#for dev in devices.values(): print(dev)
    	
    	#Grab the devices to block their native input
    	for dev in devices.values(): dev.grab()
    
    	#Read and handle events from the devices and translate it to the virtual device
    	r, w, x = select(devices, [], [])
    	for fd in r:
    		for event in devices[fd].read():
    			if event.type == ecodes.EV_MSC and event.code == 4 and event.value == 458767:
    				#remap or add a script to perform
    			#Add more if / elif as needed for different keys or key combinations
    
    			#If you didn't remap the key, pass the input through as normal
    			ui.write(event.type, event.code, event.value)
    finally:
    	for dev in devices.values(): dev.ungrab()
    

    The code above I run as a service, but my explanation is getting a bit long-winded already, so if any of this ends up being helpful, and you actually do want to run it as a background service, if you need help doing that let me know!





  • I’m not familiar with Nobara, but I can at least show how I would install pyUSB for use in Debian:

    If you follow the instructions exactly as in the readme, it will error:

    $ pip install pyusb
    error: externally-managed-environment
    
    × This environment is externally managed
    ╰─> To install Python packages system-wide, try apt install
        python3-xyz, where xyz is the package you are trying to
        install.
        
        If you wish to install a non-Debian-packaged Python package,
        create a virtual environment using python3 -m venv path/to/venv.
        Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
        sure you have python3-full installed.
        
        If you wish to install a non-Debian packaged Python application,
        it may be easiest to use pipx install xyz, which will manage a
        virtual environment for you. Make sure you have pipx installed.
        
        See /usr/share/doc/python3.11/README.venv for more information.
    
    note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
    hint: See PEP 668 for the detailed specification.
    

    Instead, I would create a virtual environment (I’m using virtualenv instead of venv)

    $ virtualenv unihub_test
    

    Then activate the environment and run the install with pip

    $ source ~/unihub_test/bin/activate
    (unihub_test) $ pip install pyusb
    Collecting pyusb
      Using cached pyusb-1.2.1-py3-none-any.whl.metadata (2.2 kB)
    Using cached pyusb-1.2.1-py3-none-any.whl (58 kB)
    Installing collected packages: pyusb
    Successfully installed pyusb-1.2.1
    
    (unihub_test) $ python3
    >>> import usb #this should not error
    >>> exit()
    (unihub_test) $ deactivate
    $ 
    

    Without the actual hub, that’s as far as I can go I think - but maybe this will help give you some options and documentation to explore!


  • Geeze, that’s extremely frustrating… they really switched up the headaches between v1 and v2. I’m sorry I couldn’t be more help! Hopefully you can find a software solution to get it going.

    I don’t mean to repeat troubleshooting you’ve already done with the python script, apologies in advance if this is stuff you’ve already done. If it’s erroring immediately, you may want to double check that you have pyUSB in place and UDEV rules to get access to the device if you’re not running the script as root.

    edit: You may also need to check that your Vendor ID and Product ID match what the script was written for, given that there seem to be some different iterations of Lian Li’s hardware just in general.


  • Sorry for the delayed response - I saw what you meant in the v2 manual about the proprietary connector and thought I would just leave it at that, but I had another thought.

    It sounds like you do have some access to Windows/L-Connect, have you switched the fan profiles to sync with the MB? This should stick after a shutdown and not need to be re-set, you will lose the ability to create fan curves in L-Connect:

    Also, are you connecting the UNI HUB directly to the MB pins, or is it running through a splitter or extender? It looks like the UNI HUB v2 does have a sense pin (the v1 does NOT, that’s the reason for the workaround I have to use); some additional extenders and splitters are missing the sense pin, so even though you can control the fan speed from BIOS, you can’t see the RPMs in BIOS so it might look like it’s not recognized.