Posted by & filed under Hardware, Programming, Projects, Python.

So I got one of these Cheap Chinese HID RGB LEDs the other day. The include software only interfaced with Outlook, sigh. Oh well, lets start poking around.

I found that the drive is for an HID (Human Interface Device) device so I opened python and grabbed pywinusb, which includes a HID helper class.

So again looking at the driver, I found that the vendor-id was 0×1294. This number 4278190081 for the report… I don’t remember how I found it…

But after finding out those two values I started throwing bits at it. I sent 0×0001 and to my surprise, the envlope started glowing green. There are 8 settings, and the mapping is as follows:

  • 0 – off
  • 1 – green
  • 2 – red
  • 3 – blu
  • 4 – teal
  • 5 – yelloish-green
  • 6 – purple
  • 7 – white(ish)

Bam… Disco Party In My Room

import time,random
import pywinusb.hid as hid

def get_device():
    all_devices = hid.HidDeviceFilter(vendor_id = 0x1294).get_devices()
    if len(all_devices)==0:
        print "Can't find target device"
    else:       
        return all_devices[0]
    return null    
    
def set_color(device,color):
    for report in device.find_output_reports():
        if 4278190081 in report:
            report[4278190081] =  [color,0,0,0,0]
            report.send()
                
if __name__ == '__main__':
    try:
        d = get_device()
        d.open()
        
        set_color(d,0)
        color = 0
        
        while True:
            nucolor = color                     # windows has a bad random,
            while color is nucolor:             # i saw a ten streak of 6's
                nucolor = random.randint(1, 7)  # so this forces it to change
            color = nucolor
            print color
            set_color(d,color)

            time.sleep(1)
        
    finally:
        d.close()

    exit()

Ok, Lets now grab my Reddit Inbox.

I quickly found the reddit_api python module, now called PRAW (Python Reddit API Wrapper), but it didn’t quite do what I wanted. [*Disclaimer: This might not be true with newer versions of PRAW]
So I forked it.
My changes include a direct way to access reddits unread message end-point.

With that in hand, we can build a script to check our unread messages.

#configure your details here
user = "" #reddit username
password = "" #reddit password
delay = 60*5 #delay in seconds between checking mail


#dont you dare look down past here!!!

import time
import pywinusb.hid as hid
import reddit

def get_device():
	all_devices = hid.HidDeviceFilter(vendor_id = 0x1294).get_devices()
	if len(all_devices)==0:
		print "Can't find target device"		
	else:		
		return all_devices[0]
	return null
	
	
def set_color(device,color):
	for report in device.find_output_reports():
		if 4278190081 in report:
			report[4278190081] =  [color,0,0,0,0] 
			report.send() 				

				
if __name__ == '__main__':	
	try:
		d = get_device()
		d.open()
		
		set_color(d,0)
		r = reddit.Reddit(user_agent="redmail")
		r.login(user=user,password=password)
		inbox = r.get_inbox()
		
		while True:			
			new = inbox.get_new_messages(force=True)
			if len(new) > 0:
				set_color(d,2)
			else:
				set_color(d,0)				
				
			time.sleep(delay)
		
	finally:
		d.close()

	exit()

And done, Reddit orangered’s on my desk.

The Github project: https://github.com/willwharton/redmail