Mercurial > code > home > repos > homeauto
comparison service/piNode/devices.py @ 1071:9a8897fac103
neopixel lib change. factor out pwm setup and try another pwm rate
Ignore-this: 870f68d8297c6387be35b452058f0b97
darcs-hash:3d0aaef22b809485659f0ec829b340e3b312f863
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Thu, 14 Apr 2016 00:13:06 -0700 |
parents | dfb284fb025c |
children | 4685fbd208d1 |
comparison
equal
deleted
inserted
replaced
1070:1630e50d9842 | 1071:9a8897fac103 |
---|---|
7 import pigpio | 7 import pigpio |
8 except ImportError: | 8 except ImportError: |
9 pigpio = None | 9 pigpio = None |
10 import w1thermsensor | 10 import w1thermsensor |
11 try: | 11 try: |
12 import NeoPixel | 12 import neopixel |
13 except ImportError: | 13 except ImportError: |
14 NeoPixel = None | 14 neopixel = None |
15 | |
16 def setupPwm(pi, pinNumber, hz=8000): | |
17 pi.set_mode(pinNumber, pigpio.OUTPUT) | |
18 # see http://abyz.co.uk/rpi/pigpio/cif.html#gpioCfgClock | |
19 # and http://abyz.co.uk/rpi/pigpio/cif.html#gpioSetPWMfrequency | |
20 actual = pi.set_PWM_frequency(pinNumber, hz) | |
21 if actual != hz: | |
22 raise ValueError('pwm actual=%s' % actual) | |
23 pi.set_PWM_dutycycle(pinNumber, 0) | |
15 | 24 |
16 import sys | 25 import sys |
17 | 26 |
18 log = logging.getLogger() | 27 log = logging.getLogger() |
19 ROOM = Namespace('http://projects.bigasterisk.com/room/') | 28 ROOM = Namespace('http://projects.bigasterisk.com/room/') |
190 self.rgb = map(int, [r, g, b]) | 199 self.rgb = map(int, [r, g, b]) |
191 self.value = '#000000' | 200 self.value = '#000000' |
192 | 201 |
193 def setup(self): | 202 def setup(self): |
194 for i in self.rgb: | 203 for i in self.rgb: |
195 self.pi.set_mode(i, pigpio.OUTPUT) | 204 setupPwm(self.pi, i) |
196 self.pi.set_PWM_frequency(i, 200) | |
197 self.pi.set_PWM_dutycycle(i, 0) | |
198 | 205 |
199 def hostStatements(self): | 206 def hostStatements(self): |
200 return [(self.uri, ROOM['color'], Literal(self.value))] | 207 return [(self.uri, ROOM['color'], Literal(self.value))] |
201 | 208 |
202 def outputPatterns(self): | 209 def outputPatterns(self): |
348 | 355 |
349 def hostStateInit(self): | 356 def hostStateInit(self): |
350 self.value = 0 | 357 self.value = 0 |
351 | 358 |
352 def setup(self): | 359 def setup(self): |
353 self.pi.set_mode(self.pinNumber, pigpio.OUTPUT) | 360 setupPwm(self.pi, self.pinNumber) |
354 self.pi.set_PWM_frequency(self.pinNumber, 200) | |
355 self.pi.set_PWM_dutycycle(self.pinNumber, 0) | |
356 | 361 |
357 def outputPatterns(self): | 362 def outputPatterns(self): |
358 return [(self.uri, ROOM['brightness'], None)] | 363 return [(self.uri, ROOM['brightness'], None)] |
359 | 364 |
360 def sendOutput(self, statements): | 365 def sendOutput(self, statements): |
413 | 418 |
414 def hostStateInit(self): | 419 def hostStateInit(self): |
415 px = self.graph.value(self.uri, ROOM['pixels']) | 420 px = self.graph.value(self.uri, ROOM['pixels']) |
416 self.pixelUris = list(self.graph.items(px)) | 421 self.pixelUris = list(self.graph.items(px)) |
417 self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris) | 422 self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris) |
423 colorOrder, stripType = self.getColorOrder(self.graph, self.uri) | |
418 self.replace = {'ledArray': 'leds_%s' % self.pinNumber, | 424 self.replace = {'ledArray': 'leds_%s' % self.pinNumber, |
419 'ledCount': len(self.pixelUris), | 425 'ledCount': len(self.pixelUris), |
420 'pin': self.pinNumber, | 426 'pin': self.pinNumber, |
421 'ledType': 'WS2812', | 427 'ledType': 'WS2812', |
428 'colorOrder': colorOrder | |
422 } | 429 } |
423 self.neo = NeoPixel.NeoPixel(len(self.values)) | 430 self.neo = neopixel.Adafruit_NeoPixel(len(self.values), pin=18, strip_type=stripType) |
424 self.neo.begin() | 431 self.neo.begin() |
425 | 432 |
433 def getColorOrder(self, graph, uri): | |
434 colorOrder = graph.value(uri, ROOM['colorOrder'], | |
435 default=ROOM['ledColorOrder/RGB']) | |
436 head, tail = str(colorOrder).rsplit('/', 1) | |
437 if head != str(ROOM['ledColorOrder']): | |
438 raise NotImplementedError('%r colorOrder %r' % (uri, colorOrder)) | |
439 stripType = getattr(neopixel.ws, 'WS2811_STRIP_%s' % tail) | |
440 return colorOrder, stripType | |
441 | |
426 def _rgbFromHex(self, h): | 442 def _rgbFromHex(self, h): |
427 rrggbb = h.lstrip('#') | 443 rrggbb = h.lstrip('#') |
428 return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] | 444 return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] |
429 | 445 |
430 def sendOutput(self, statements): | 446 def sendOutput(self, statements): |
433 raise ValueError(pred) | 449 raise ValueError(pred) |
434 rgb = self._rgbFromHex(color) | 450 rgb = self._rgbFromHex(color) |
435 if px not in self.values: | 451 if px not in self.values: |
436 raise ValueError(px) | 452 raise ValueError(px) |
437 self.values[px] = Literal(color) | 453 self.values[px] = Literal(color) |
438 self.neo.setPixelColor(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2]) | 454 self.neo.setPixelColorRGB(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2]) |
439 self.neo.show() | 455 self.neo.show() |
440 | 456 |
441 def hostStatements(self): | 457 def hostStatements(self): |
442 return [(uri, ROOM['color'], hexCol) | 458 return [(uri, ROOM['color'], hexCol) |
443 for uri, hexCol in self.values.items()] | 459 for uri, hexCol in self.values.items()] |