Mercurial > code > home > repos > homeauto
annotate service/frontDoorLock/front_door_lock.py @ 377:5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
Ignore-this: 87ea28bde75a5b0d35fe89d61f11090a
author | drewp@bigasterisk.com |
---|---|
date | Tue, 11 Dec 2018 19:13:06 -0800 |
parents | |
children | 67cebf7a14de |
rev | line source |
---|---|
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
1 from docopt import docopt |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
2 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
3 from rdflib import Namespace, URIRef, Literal, Graph |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
4 from rdflib.parser import StringInputSource |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
5 from twisted.internet import reactor |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
6 import cyclone.web |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
7 import sys, logging |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
8 from mqtt_client import MqttClient |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
9 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
10 ROOM = Namespace('http://projects.bigasterisk.com/room/') |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
11 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
12 logging.basicConfig() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
13 log = logging.getLogger() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
14 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
15 ctx = ROOM['frontDoorControl'] |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
16 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
17 def rdfGraphBody(body, headers): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
18 g = Graph() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
19 g.parse(StringInputSource(body), format='nt') |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
20 return g |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
21 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
22 def mqttMessageFromState(state): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
23 return { |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
24 ROOM['locked']: b'OFF', |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
25 ROOM['unlocked']: b'ON', |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
26 }[state] |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
27 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
28 def stateFromMqtt(msg): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
29 return { |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
30 'OFF': ROOM['locked'], |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
31 'ON': ROOM['unlocked'], |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
32 }[msg.decode('ascii')] |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
33 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
34 class OutputPage(cyclone.web.RequestHandler): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
35 def put(self): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
36 arg = self.request.arguments |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
37 if arg.get('s') and arg.get('p'): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
38 subj = URIRef(arg['s'][-1]) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
39 pred = URIRef(arg['p'][-1]) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
40 obj = URIRef(self.request.body) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
41 stmt = (subj, pred, obj) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
42 else: |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
43 g = rdfGraphBody(self.request.body, self.request.headers) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
44 assert len(g) == 1, len(g) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
45 stmt = g.triples((None, None, None)).next() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
46 self._onStatement(stmt) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
47 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
48 def _onStatement(self, stmt): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
49 if stmt[0:2] == (ROOM['frontDoorLock'], ROOM['state']): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
50 self.settings.mqtt.publish("frontdoor/switch/strike/command", |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
51 mqttMessageFromState(stmt[2])) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
52 self.settings.masterGraph.patchObject(ctx, |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
53 stmt[0], stmt[1], stmt[2]) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
54 return |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
55 log.warn("ignoring %s", stmt) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
56 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
57 if __name__ == '__main__': |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
58 arg = docopt(""" |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
59 Usage: front_door_lock.py [options] |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
60 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
61 -v Verbose |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
62 """) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
63 log.setLevel(logging.WARN) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
64 if arg['-v']: |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
65 from twisted.python import log as twlog |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
66 twlog.startLogging(sys.stdout) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
67 log.setLevel(logging.DEBUG) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
68 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
69 masterGraph = PatchableGraph() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
70 mqtt = MqttClient(brokerPort=10010) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
71 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
72 def toGraph(payload): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
73 log.debug('toGraph %r', payload) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
74 masterGraph.patchObject(ctx, ROOM['frontDoorLock'], ROOM['state'], |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
75 stateFromMqtt(payload)) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
76 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
77 mqtt.subscribe("frontdoor/switch/strike/state").subscribe(on_next=toGraph) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
78 port = 10011 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
79 reactor.listenTCP(port, cyclone.web.Application([ |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
80 (r"/graph", CycloneGraphHandler, {'masterGraph': masterGraph}), |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
81 (r"/graph/events", CycloneGraphEventsHandler, |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
82 {'masterGraph': masterGraph}), |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
83 (r'/output', OutputPage), |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
84 ], mqtt=mqtt, masterGraph=masterGraph, debug=arg['-v']), interface='::') |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
85 log.warn('serving on %s', port) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
86 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
87 reactor.run() |