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