annotate service/frontDoorLock/front_door_lock.py @ 1182:bd215f18e715

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