Mercurial > code > home > repos > homeauto
comparison 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 |
comparison
equal
deleted
inserted
replaced
182:9fff29ebca71 | 183:634d6e477953 |
---|---|
1 from __future__ import division | 1 from __future__ import division |
2 import pigpio | 2 |
3 import time | 3 import time, logging |
4 from rdflib import Namespace, RDF, URIRef, Literal | 4 from rdflib import Namespace, RDF, URIRef, Literal |
5 | 5 |
6 try: | |
7 import pigpio | |
8 except ImportError: | |
9 pigpio = None | |
10 | |
11 | |
12 log = logging.getLogger() | |
6 ROOM = Namespace('http://projects.bigasterisk.com/room/') | 13 ROOM = Namespace('http://projects.bigasterisk.com/room/') |
7 | 14 |
8 class DeviceType(object): | 15 class DeviceType(object): |
9 deviceType = None | 16 deviceType = None |
10 @classmethod | 17 @classmethod |
13 return any number of instances of this class for all the separately | 20 return any number of instances of this class for all the separately |
14 controlled devices on the board. Two LEDS makes two instances, | 21 controlled devices on the board. Two LEDS makes two instances, |
15 but two sensors on the same onewire bus makes only one device | 22 but two sensors on the same onewire bus makes only one device |
16 (which yields more statements). | 23 (which yields more statements). |
17 """ | 24 """ |
18 for row in graph.query("""SELECT ?dev ?pinNumber WHERE { | 25 for row in graph.query("""SELECT ?dev ?gpioNumber WHERE { |
19 ?board :hasPin ?pin . | 26 ?board :hasPin ?pin . |
20 ?pin :pinNumber ?pinNumber; | 27 ?pin :gpioNumber ?gpioNumber; |
21 :connectedTo ?dev . | 28 :connectedTo ?dev . |
22 ?dev a ?thisType . | 29 ?dev a ?thisType . |
23 } ORDER BY ?dev""", | 30 } ORDER BY ?dev""", |
24 initBindings=dict(board=board, | 31 initBindings=dict(board=board, |
25 thisType=cls.deviceType), | 32 thisType=cls.deviceType), |
26 initNs={'': ROOM}): | 33 initNs={'': ROOM}): |
27 yield cls(graph, row.dev, pi, int(row.pinNumber)) | 34 yield cls(graph, row.dev, pi, int(row.gpioNumber)) |
28 | 35 |
29 def __init__(self, graph, uri, pi, pinNumber): | 36 def __init__(self, graph, uri, pi, pinNumber): |
30 self.graph, self.uri, self.pi = graph, uri, pi | 37 self.graph, self.uri, self.pi = graph, uri, pi |
31 self.pinNumber = pinNumber | 38 self.pinNumber = pinNumber |
32 | 39 |
33 def description(self): | 40 def description(self): |
34 return { | 41 return { |
35 'uri': self.uri, | 42 'uri': self.uri, |
36 'className': self.__class__.__name__, | 43 'className': self.__class__.__name__, |
37 'pinNumber': self.pinNumber, | 44 'pinNumber': getattr(self, 'pinNumber', None), |
38 'outputPatterns': self.outputPatterns(), | 45 'outputPatterns': self.outputPatterns(), |
39 'watchPrefixes': self.watchPrefixes(), | 46 'watchPrefixes': self.watchPrefixes(), |
40 'outputWidgets': self.outputWidgets(), | 47 'outputWidgets': self.outputWidgets(), |
41 } | 48 } |
42 | 49 |
112 return [ | 119 return [ |
113 (self.uri, ROOM['sees']), | 120 (self.uri, ROOM['sees']), |
114 (self.uri, ROOM['seesRecently']), | 121 (self.uri, ROOM['seesRecently']), |
115 ] | 122 ] |
116 | 123 |
124 | |
125 @register | |
126 class RgbStrip(DeviceType): | |
127 deviceType = ROOM['RgbStrip'] | |
128 | |
129 @classmethod | |
130 def findInstances(cls, graph, board, pi): | |
131 for row in graph.query("""SELECT DISTINCT ?dev ?r ?g ?b WHERE { | |
132 ?board | |
133 :hasPin ?rpin; | |
134 :hasPin ?gpin; | |
135 :hasPin ?bpin . | |
136 ?dev a :RgbStrip; | |
137 :redChannel ?rpin; | |
138 :greenChannel ?gpin; | |
139 :blueChannel ?bpin . | |
140 ?rpin :gpioNumber ?r . | |
141 ?gpin :gpioNumber ?g . | |
142 ?bpin :gpioNumber ?b . | |
143 } ORDER BY ?dev""", | |
144 initBindings=dict(board=board), | |
145 initNs={'': ROOM}): | |
146 log.debug('found rgb %r', row) | |
147 yield cls(graph, row.dev, pi, row.r, row.g, row.b) | |
148 | |
149 def __init__(self, graph, uri, pi, r, g, b): | |
150 self.graph, self.uri, self.pi = graph, uri, pi | |
151 self.rgb = map(int, [r, g, b]) | |
152 | |
153 def setup(self): | |
154 for i in self.rgb: | |
155 self.pi.set_mode(i, pigpio.OUTPUT) | |
156 self.pi.set_PWM_frequency(i, 200) | |
157 self.pi.set_PWM_dutycycle(i, 0) | |
158 | |
159 def outputPatterns(self): | |
160 return [(self.uri, ROOM['color'], None)] | |
161 | |
162 def sendOutput(self, statements): | |
163 assert len(statements) == 1 | |
164 assert statements[0][:2] == (self.uri, ROOM['color']) | |
165 | |
166 rrggbb = statements[0][2].lstrip('#') | |
167 rgb = [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] | |
168 | |
169 for (i, v) in zip(self.rgb, rgb): | |
170 self.pi.set_PWM_dutycycle(i, v) | |
171 | |
172 def outputWidgets(self): | |
173 return [{ | |
174 'element': 'output-rgb', | |
175 'subj': self.uri, | |
176 'pred': ROOM['color'], | |
177 }] | |
178 | |
117 def makeDevices(graph, board, pi): | 179 def makeDevices(graph, board, pi): |
118 out = [] | 180 out = [] |
119 for dt in sorted(_knownTypes, key=lambda cls: cls.__name__): | 181 for dt in sorted(_knownTypes, key=lambda cls: cls.__name__): |
120 out.extend(dt.findInstances(graph, board, pi)) | 182 out.extend(dt.findInstances(graph, board, pi)) |
121 return out | 183 return out |