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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()