annotate service/rdf_to_mqtt/rdf_to_mqtt.py @ 1539:8c410b493da4

more renaming, build updates Ignore-this: 94a0df55a1d8a74d90ec84bb7351d3ef darcs-hash:c75b289c837213f294a22de94cd86b0348d4123f
author drewp <drewp@bigasterisk.com>
date Mon, 10 Feb 2020 23:56:42 -0800
parents
children 0c8aa432ec9d
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
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10 from rdflib import Namespace, Literal
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
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 from standardservice.logsetup import log, verboseLogging
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 import rdf_over_http
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 ROOM = Namespace('http://projects.bigasterisk.com/room/')
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 devs = {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 ROOM['kitchenLight']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 'root': 'h801_skylight',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 'ctx': ROOM['kitchenH801']
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 },
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 ROOM['kitchenCounterLight']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 'root': 'h801_counter',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 'ctx': ROOM['kitchenH801']
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 },
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 ROOM['livingLampShelf']: {
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 'root': 'sonoff_0/switch/sonoff_basic_relay/command',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 'ctx': ROOM['sonoff_0'],
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 'values': 'binary',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 },
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
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 class OutputPage(cyclone.web.RequestHandler):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 def put(self):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 for stmt in rdf_over_http.rdfStatementsFromRequest(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 self.request.arguments,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 self.request.body,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 self.request.headers):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 self._onStatement(stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 def _onStatement(self, stmt):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 log.info(f'incoming statement: {stmt}')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 ignored = True
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 for dev, attrs in devs.items():
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 if stmt[0] == ROOM['frontWindow']:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 ignored = ignored and self._publishFrontScreenText(stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52 if stmt[0:2] == (dev, ROOM['brightness']):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 log.info(f'brightness request: {stmt}')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 brightness = stmt[2].toPython()
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 if attrs.get('values', '') == 'binary':
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 self._publishOnOff(attrs, brightness)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 else:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 self._publishRgbw(attrs, brightness)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 # try to stop saving this; let the device be the master usually
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 self.settings.masterGraph.patchObject(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62 attrs['ctx'],
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 stmt[0], stmt[1], stmt[2])
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 ignored = False
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 if ignored:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 log.warn("ignoring %s", stmt)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 def _publishOnOff(self, attrs, brightness):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 msg = 'OFF'
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70 if brightness > 0:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 msg = 'ON'
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 self._publish(topic=attrs['root'], message=msg)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 def _publishRgbw(self, attrs, brightness):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 for chan, scale in [('w1', 1),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 ('r', 1),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 ('g', .8),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 ('b', .8)]:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 self._publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80 topic=f"{attrs['root']}/light/kit_{chan}/command",
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81 messageJson={
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82 'state': 'ON',
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 'brightness': int(brightness * 255)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 })
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 def _publishFrontScreenText(self, stmt):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 ignored = True
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 for line in ['line1', 'line2', 'line3', 'line4']:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 if stmt[1] == ROOM[line]:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 ignored = False
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91 self.settings.mqtt.publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 b'frontwindow/%s' % line.encode('ascii'),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 stmt[2].toPython())
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 return ignored
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 def _publish(self, topic: str, messageJson: object=None,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 message: str=None):
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98 if messageJson is not None:
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
99 message = json.dumps(messageJson)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 self.settings.mqtt.publish(
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101 topic.encode('ascii'),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102 message.encode('ascii'))
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 if __name__ == '__main__':
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 arg = docopt("""
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107 Usage: rdf_to_mqtt.py [options]
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 -v Verbose
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110 """)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 verboseLogging(arg['-v'])
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 mqtt = MqttClient(clientId='rdf_to_mqtt', brokerPort=1883)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115 port = 10008
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 reactor.listenTCP(port, cyclone.web.Application([
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 (r"/()", cyclone.web.StaticFileHandler,
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118 {"path": ".", "default_filename": "index.html"}),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
119 (r'/output', OutputPage),
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
120 ], mqtt=mqtt, debug=arg['-v']), interface='::')
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
121 log.warn('serving on %s', port)
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
122
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
123 for dev, attrs in devs.items():
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
124 masterGraph.patchObject(attrs['ctx'],
8c410b493da4 more renaming, build updates
drewp <drewp@bigasterisk.com>
parents:
diff changeset
125 dev, ROOM['brightness'], Literal(0.0))
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 reactor.run()