Mercurial > code > home > repos > homeauto
diff service/piNode/devices.py @ 183:634d6e477953
get piNode working, for motionsensor at least
Ignore-this: 53f16373acb0613e01fdf3e98d8425f2
author | drewp@bigasterisk.com |
---|---|
date | Sun, 31 May 2015 22:53:21 -0700 |
parents | 9fff29ebca71 |
children | 40000fafad94 |
line wrap: on
line diff
--- a/service/piNode/devices.py Sun May 31 00:56:55 2015 -0700 +++ b/service/piNode/devices.py Sun May 31 22:53:21 2015 -0700 @@ -1,8 +1,15 @@ from __future__ import division -import pigpio -import time + +import time, logging from rdflib import Namespace, RDF, URIRef, Literal +try: + import pigpio +except ImportError: + pigpio = None + + +log = logging.getLogger() ROOM = Namespace('http://projects.bigasterisk.com/room/') class DeviceType(object): @@ -15,16 +22,16 @@ but two sensors on the same onewire bus makes only one device (which yields more statements). """ - for row in graph.query("""SELECT ?dev ?pinNumber WHERE { + for row in graph.query("""SELECT ?dev ?gpioNumber WHERE { ?board :hasPin ?pin . - ?pin :pinNumber ?pinNumber; + ?pin :gpioNumber ?gpioNumber; :connectedTo ?dev . ?dev a ?thisType . } ORDER BY ?dev""", initBindings=dict(board=board, thisType=cls.deviceType), initNs={'': ROOM}): - yield cls(graph, row.dev, pi, int(row.pinNumber)) + yield cls(graph, row.dev, pi, int(row.gpioNumber)) def __init__(self, graph, uri, pi, pinNumber): self.graph, self.uri, self.pi = graph, uri, pi @@ -34,7 +41,7 @@ return { 'uri': self.uri, 'className': self.__class__.__name__, - 'pinNumber': self.pinNumber, + 'pinNumber': getattr(self, 'pinNumber', None), 'outputPatterns': self.outputPatterns(), 'watchPrefixes': self.watchPrefixes(), 'outputWidgets': self.outputWidgets(), @@ -114,6 +121,61 @@ (self.uri, ROOM['seesRecently']), ] + +@register +class RgbStrip(DeviceType): + deviceType = ROOM['RgbStrip'] + + @classmethod + def findInstances(cls, graph, board, pi): + for row in graph.query("""SELECT DISTINCT ?dev ?r ?g ?b WHERE { + ?board + :hasPin ?rpin; + :hasPin ?gpin; + :hasPin ?bpin . + ?dev a :RgbStrip; + :redChannel ?rpin; + :greenChannel ?gpin; + :blueChannel ?bpin . + ?rpin :gpioNumber ?r . + ?gpin :gpioNumber ?g . + ?bpin :gpioNumber ?b . + } ORDER BY ?dev""", + initBindings=dict(board=board), + initNs={'': ROOM}): + log.debug('found rgb %r', row) + yield cls(graph, row.dev, pi, row.r, row.g, row.b) + + def __init__(self, graph, uri, pi, r, g, b): + self.graph, self.uri, self.pi = graph, uri, pi + self.rgb = map(int, [r, g, b]) + + def setup(self): + for i in self.rgb: + self.pi.set_mode(i, pigpio.OUTPUT) + self.pi.set_PWM_frequency(i, 200) + self.pi.set_PWM_dutycycle(i, 0) + + def outputPatterns(self): + return [(self.uri, ROOM['color'], None)] + + def sendOutput(self, statements): + assert len(statements) == 1 + assert statements[0][:2] == (self.uri, ROOM['color']) + + rrggbb = statements[0][2].lstrip('#') + rgb = [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] + + for (i, v) in zip(self.rgb, rgb): + self.pi.set_PWM_dutycycle(i, v) + + def outputWidgets(self): + return [{ + 'element': 'output-rgb', + 'subj': self.uri, + 'pred': ROOM['color'], + }] + def makeDevices(graph, board, pi): out = [] for dt in sorted(_knownTypes, key=lambda cls: cls.__name__):