#!/usr/bin/python import argparse import board import neopixel import time from os.path import exists # parse command line arguments # TODO parse multiple LEDs e.g. ./ledctl --led 1 red --led 2 white parser = argparse.ArgumentParser(description='Set LED colors') parser.add_argument('--led', type=int, help='LED number to control, starting at 1') parser.add_argument('color', type=str, help='color or command') args = parser.parse_args(); # initialize LED array leds_max = 1 leds_num = 0 leds_array = neopixel.NeoPixel(board.D18, leds_max) # restore LED array from state file statefile = '/tmp/ledctl.state' if exists(statefile): #print('reading ' + statefile) with open(statefile, 'r') as f: lines = f.readlines() i = 0; for line in lines: values = [ int(number) for number in line.rstrip().split(' ')] if (i < leds_max): leds_array[i] = (values[0], values[1], values[2]); i = i + 1 f.close() # figure out if we want to control a single LED or all of them if args.led: if (args.led < 1) or (args.led > leds_max): parser.error("led must be within range") else: leds_num = args.led; # default color is white leds_color = (255, 255, 255) def rgbval(colorname): switch = { 'on': (255, 255, 255), 'off': (0, 0, 0), 'white': (255, 255, 255), 'black': (0, 0, 0), 'red': (255, 0, 0), 'green': (0, 255, 0), 'blue': (0, 0, 255), 'yellow': (255, 255, 0), 'cyan': (0, 255, 255), 'pink': (255, 0, 255), } return switch.get(colorname, (255, 255, 255)) def hexval(letter): switch = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'a': 10, 'B': 11, 'b': 11, 'C': 12, 'c': 12, 'D': 13, 'd': 13, 'E': 14, 'e': 14, 'F': 15, 'f': 15, } return switch.get(letter, 0) if args.color: #print('color ' + args.color) if args.color[:1] == '#': red = 16 * hexval(args.color[1:2]) + hexval(args.color[2:3]); green = 16 * hexval(args.color[3:4]) + hexval(args.color[4:5]); blue = 16 * hexval(args.color[5:6]) + hexval(args.color[6:7]); leds_color = (red, green, blue); #print ('color %d %d %d' % leds_color) else: leds_color = rgbval(args.color); if (leds_num > 0): #print('setting LED %d' % leds_num) leds_array[leds_num - 1] = leds_color else: #print('setting all LEDs') leds_array.fill(leds_color) # write LED array to state file #print('writing ' + statefile) with open(statefile, 'w') as f: for i in range(leds_max): for c in range(3): f.write ('%d ' % leds_array[i][c]) f.write('\n'); f.close()