macro keys for Razer BlackWidow Ultimate

I bought a new keyboard, a Razer BlackWidow Ultimate Elite. All keys will operate until the macro keys M1 to M5.

xev gives no output for this keys. Is there a way to use keys with Ubuntu?

% lsusb | grep Razer
Bus 007 Device 003: ID 1532:011a Razer USA, Ltd

Solution 1:

First, we need a little Python3 script, taken from here (Please go and give @Sergey an upvote ;))

I have replaced the product id with my product id 011a

#!/usr/bin/python3

import usb
import sys

VENDOR_ID = 0x1532  # Razer
PRODUCT_ID = 0x011a  # BlackWidow Ultimate Elite

USB_REQUEST_TYPE = 0x21  # Host To Device | Class | Interface
USB_REQUEST = 0x09  # SET_REPORT

USB_VALUE = 0x0300
USB_INDEX = 0x2
USB_INTERFACE = 2

LOG=sys.stderr.write

class blackwidow(object):
  kernel_driver_detached = False

  def __init__(self):
    self.device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)

    if self.device is None:
      raise ValueError("Device {}:{} not found\n".format(VENDOR_ID, PRODUCT_ID))
    else:
      LOG("Found device {}:{}\n".format(VENDOR_ID, PRODUCT_ID))

    if self.device.is_kernel_driver_active(USB_INTERFACE):
      LOG("Kernel driver active. Detaching it.\n")
      self.device.detach_kernel_driver(USB_INTERFACE)
      self.kernel_driver_detached = True

    LOG("Claiming interface\n")
    usb.util.claim_interface(self.device, USB_INTERFACE)

  def __del__(self):
    LOG("Releasing claimed interface\n")
    usb.util.release_interface(self.device, USB_INTERFACE)

    if self.kernel_driver_detached:
      LOG("Reattaching the kernel driver\n")
      self.device.attach_kernel_driver(USB_INTERFACE)

    LOG("Done.\n")

  def bwcmd(self, c):
    from functools import reduce
    c1 = bytes.fromhex(c)
    c2 = [ reduce(int.__xor__, c1) ]
    b = [0] * 90
    b[5:5+len(c1)] = c1
    b[-2:-1] = c2
    return bytes(b)

  def send(self, c):
    def _send(msg):
      USB_BUFFER = self.bwcmd(msg)
      result = 0
      try:
        result = self.device.ctrl_transfer(USB_REQUEST_TYPE, USB_REQUEST, wValue=USB_VALUE, wIndex=USB_INDEX, data_or_wLength=USB_BUFFER)
      except:
        sys.stderr.write("Could not send data.\n")

      if result == len(USB_BUFFER):
        LOG("Data sent successfully.\n")

      return result

    if isinstance(c, list):
#      import time
      for i in c:
        print(' >> {}\n'.format(i))
        _send(i)
#        time.sleep(.05)
    elif isinstance(c, str):
        _send(c)

###############################################################################

def main():
    init_new  = '0200 0403'
    init_old  = '0200 0402'
    pulsate = '0303 0201 0402'
    bright  = '0303 0301 04ff'
    normal  = '0303 0301 04a8'
    dim     = '0303 0301 0454'
    off     = '0303 0301 0400'

    bw = blackwidow()
    bw.send(init_old)

if __name__ == '__main__':
    main()

To start the script, we need pyusb for Python3

sudo pip3 install --upgrade pip
sudo pip3 install pyusb

Save the Python script as init_blackwidow.py and set the execution rights. Now start the script with

sudo ./init_blackwidow.py

Now you can check the keycodes with xev


… until the next reboot :\

But we can use /etc/rc.local and udev:

  1. Copy the script init_blackwidow.py into /usr/local/bin

  2. Add the line below in /etc/rc.local, before the line exit 0

    /usr/local/bin/init_blackwidow.py
    

    Now you should have something like this

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    /usr/local/bin/init_blackwidow.py
    
    exit 0
    
  3. Create a new rule

    SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="011a", RUN+="/usr/local/bin/init_blackwidow.py"
    

    in

    /etc/udev/rules.d/99-razer_blackwidow.rules
    
  4. Restart udev

    sudo service udev restart
    

    and enjoy …

Solution 2:

As an alternative to the good anwser of A.B. :


Easy install of razer chroma drivers

The following project has support for many Razer chroma drivers. It also activates the Mx keys.

https://github.com/pez2001/razer_chroma_drivers


MacroW - A simple macro player/recorder.

There is an on-the-fly macro recorder/ playback for the M1,M2,M3,M4 and M5 keys called MacroW. MacroW is very simple to use (IMHO as dev). If you managed to activate your Mx keys and want to try MacroW you can check it out:

https://github.com/igorbb/MacroW

I would love to get some feedback/ help on it.