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