annotate service/rdf_to_mqtt/rdf_to_mqtt.py @ 1564:ffbebd7902ee

stats page Ignore-this: b59d958287c2381c908ec9583706966 darcs-hash:97af26702e35e41ae4a1e01cb3287cb17878dead
author drewp <drewp@bigasterisk.com>
date Fri, 14 Feb 2020 16:47:10 -0800
parents 71eec31da919
children de145b8129d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 """
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 We get output statements that are like light9's deviceAttrs (:dev1 :color "#ff0000"),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 convert those to outputAttrs (:dev1 :red 255; :green 0; :blue 0) and post them to mqtt.
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 This is like light9/bin/collector.
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 """
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 import json
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 from mqtt_client import MqttClient
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 from docopt import docopt
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
10 from rdflib import Namespace
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 from twisted.internet import reactor
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 import cyclone.web
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
13 from greplin import scales
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
14 from greplin.scales.cyclonehandler import StatsHandler
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 from standardservice.logsetup import log, verboseLogging
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 import rdf_over_http
1563
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
18 from cycloneerr import PrettyErrorHandler
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20 ROOM = Namespace('http://projects.bigasterisk.com/room/')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
22 STATS = scales.collection('/root',
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
23 scales.PmfStat('putRequests'),
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
24 scales.PmfStat('statement'),
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
25 scales.PmfStat('mqttPublish'),
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
26 )
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
27
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 devs = {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 ROOM['kitchenLight']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 'root': 'h801_skylight',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 },
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 ROOM['kitchenCounterLight']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 'root': 'h801_counter',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 },
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 ROOM['livingLampShelf']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 'root': 'sonoff_0/switch/sonoff_basic_relay/command',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 'values': 'binary',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 },
1540
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
39 ROOM['livingLamp1']: {
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
40 'root': 'sonoff_1/switch/sonoff_basic_relay/command',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
41 'values': 'binary',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
42 },
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
43 ROOM['livingLamp2']: {
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
44 'root': 'sonoff_2/switch/sonoff_basic_relay/command',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
45 'values': 'binary',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
46 },
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
47 ROOM['livingLamp3']: {
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
48 'root': 'sonoff_3/switch/sonoff_basic_relay/command',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
49 'values': 'binary',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
50 },
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
51 ROOM['livingLamp4']: {
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
52 'root': 'sonoff_4/switch/sonoff_basic_relay/command',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
53 'values': 'binary',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
54 },
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
55 ROOM['livingLamp5']: {
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
56 'root': 'sonoff_5/switch/sonoff_basic_relay/command',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
57 'values': 'binary',
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
58 },
1563
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
59 ROOM['theater']: {
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
60 'root': 'theater_blaster/ir_out',
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
61 'values': 'theaterOutputs',
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
62 },
1540
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
63 #-t theater_blaster/ir_out -m 'input_game'
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
64 #-t theater_blaster/ir_out -m 'input_bd'
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
65 #-t theater_blaster/ir_out -m 'input_cbl'
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
66 #-t theater_blaster/ir_out -m 'input_pc'
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
67 #-t theater_blaster/ir_out/volume_up -m '{"times":1}'
0c8aa432ec9d more devices
drewp <drewp@bigasterisk.com>
parents: 1539
diff changeset
68 #-t theater_blaster/ir_out/volume_down -m '{"times":1}'
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 }
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71
1563
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
72 class OutputPage(PrettyErrorHandler, cyclone.web.RequestHandler):
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
73 @STATS.putRequests.time()
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 def put(self):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 for stmt in rdf_over_http.rdfStatementsFromRequest(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 self.request.arguments,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 self.request.body,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 self.request.headers):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 self._onStatement(stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
81 @STATS.statement.time()
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82 def _onStatement(self, stmt):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 log.info(f'incoming statement: {stmt}')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 ignored = True
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 for dev, attrs in devs.items():
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 if stmt[0] == ROOM['frontWindow']:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 ignored = ignored and self._publishFrontScreenText(stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 if stmt[0:2] == (dev, ROOM['brightness']):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 log.info(f'brightness request: {stmt}')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 brightness = stmt[2].toPython()
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 if attrs.get('values', '') == 'binary':
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 self._publishOnOff(attrs, brightness)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 else:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95 self._publishRgbw(attrs, brightness)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 ignored = False
1563
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
97 if stmt[0:2] == (dev, ROOM['inputSelector']):
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
98 self._publish(topic=attrs['root'],
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
99 message='input_'+str(stmt[2].toPython()))
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
100 ignored = False
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
101 if stmt[0:2] == (dev, ROOM['volumeChange']):
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
102 delta = int(stmt[2].toPython())
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
103 which = 'up' if delta > 0 else 'down'
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
104 self._publish(topic=f'theater_blaster/ir_out/volume_{which}',
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
105 message=json.dumps({'timed': abs(delta)}))
71eec31da919 more theater output controls
drewp <drewp@bigasterisk.com>
parents: 1541
diff changeset
106 ignored = False
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107 if ignored:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108 log.warn("ignoring %s", stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110 def _publishOnOff(self, attrs, brightness):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 msg = 'OFF'
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112 if brightness > 0:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 msg = 'ON'
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114 self._publish(topic=attrs['root'], message=msg)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 def _publishRgbw(self, attrs, brightness):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 for chan, scale in [('w1', 1),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118 ('r', 1),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
119 ('g', .8),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
120 ('b', .8)]:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
121 self._publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
122 topic=f"{attrs['root']}/light/kit_{chan}/command",
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
123 messageJson={
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
124 'state': 'ON',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
125 'brightness': int(brightness * 255)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
126 })
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
127
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
128 def _publishFrontScreenText(self, stmt):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
129 ignored = True
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
130 for line in ['line1', 'line2', 'line3', 'line4']:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
131 if stmt[1] == ROOM[line]:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
132 ignored = False
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
133 self.settings.mqtt.publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
134 b'frontwindow/%s' % line.encode('ascii'),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
135 stmt[2].toPython())
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
136 return ignored
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
137
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
138 @STATS.mqttPublish.time()
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
139 def _publish(self, topic: str, messageJson: object=None,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
140 message: str=None):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
141 if messageJson is not None:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
142 message = json.dumps(messageJson)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
143 self.settings.mqtt.publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
144 topic.encode('ascii'),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
145 message.encode('ascii'))
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
146
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
147
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
148 if __name__ == '__main__':
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
149 arg = docopt("""
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
150 Usage: rdf_to_mqtt.py [options]
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
151
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
152 -v Verbose
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
153 """)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
154 verboseLogging(arg['-v'])
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
155
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
156 mqtt = MqttClient(clientId='rdf_to_mqtt', brokerPort=1883)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
157
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
158 port = 10008
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
159 reactor.listenTCP(port, cyclone.web.Application([
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
160 (r"/()", cyclone.web.StaticFileHandler,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
161 {"path": ".", "default_filename": "index.html"}),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
162 (r'/output', OutputPage),
1564
ffbebd7902ee stats page
drewp <drewp@bigasterisk.com>
parents: 1563
diff changeset
163 (r'/stats/(.*)', StatsHandler, {'serverName': 'rdf_to_mqtt'}),
1539
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
164 ], mqtt=mqtt, debug=arg['-v']), interface='::')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
165 log.warn('serving on %s', port)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
166
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
167 reactor.run()