Mercurial > code > home > repos > homeauto
annotate service/frontDoorLock/front_door_lock.py @ 1712:6ee9a1c5a991
update deps; code fixes; add skaffold
author | drewp@bigasterisk.com |
---|---|
date | Sun, 12 Dec 2021 22:03:28 -0800 |
parents | 437d7263b515 |
children |
rev | line source |
---|---|
425 | 1 """ |
1683 | 2 currently: |
3 - serves simple.html | |
4 - listens for simple POST requests | |
5 - syncs mqtt frontdoorlock/switch/strike/state into an rdf graph | |
6 - listens for PUT /output with a request for :frontDoorLock :state :unlocked | |
7 | |
8 ------ | |
771 | 9 this service is generalized by mqtt_graph_bridge and rdf_from_mqtt, so delete when those are stable |
10 | |
425 | 11 :frontDoorLock :state :locked/:unlocked |
12 is the true state of the lock, maintained in this process. | |
13 | |
14 put :frontDoorLock :state ?s to this /output to request a change. | |
15 | |
16 reasoning can infer :frontDoorLock :putState ?s to do that put request. | |
17 """ | |
563 | 18 import time, json |
19 | |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
20 from docopt import docopt |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
21 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
|
22 from rdflib.parser import StringInputSource |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
23 from twisted.internet import reactor, task |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
24 import cyclone.web |
563 | 25 |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
26 from mqtt_client import MqttClient |
563 | 27 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler |
28 from standardservice.logsetup import log, verboseLogging | |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
29 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
30 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
|
31 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
32 ctx = ROOM['frontDoorControl'] |
568 | 33 espName = b'frontdoorlock' # from door.yaml |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
34 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
35 def rdfGraphBody(body, headers): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
36 g = Graph() |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
37 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
|
38 return g |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
39 |
563 | 40 def mqttMessageFromState(state: URIRef): |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
41 return { |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
42 ROOM['locked']: b'OFF', |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
43 ROOM['unlocked']: b'ON', |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
44 }[state] |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
45 |
563 | 46 def stateFromMqtt(msg: bytes): |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
47 return { |
563 | 48 b'OFF': ROOM['locked'], |
49 b'ON': ROOM['unlocked'], | |
50 }[bytes(msg)] | |
577 | 51 |
52 def requestUser(req): | |
53 # what happened to the case-insens dict? | |
54 h = dict((k.lower(), v) for k,v in req.headers.items()) | |
55 return URIRef(h['x-foaf-agent']) | |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
56 |
577 | 57 |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
58 class OutputPage(cyclone.web.RequestHandler): |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
59 def put(self): |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
60 try: |
577 | 61 user = requestUser(self.request) |
1683 | 62 except KeyError as e: |
63 log.warn('request without x-foaf-agent: %r', e) | |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
64 self.set_status(403, 'need x-foaf-agent') |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
65 return |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
66 arg = self.request.arguments |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
67 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
|
68 subj = URIRef(arg['s'][-1]) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
69 pred = URIRef(arg['p'][-1]) |
563 | 70 obj = URIRef(self.request.body.strip().decode('ascii')) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
71 stmt = (subj, pred, obj) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
72 else: |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
73 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
|
74 assert len(g) == 1, len(g) |
563 | 75 stmt = next(g.triples((None, None, None))) |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
76 self._onStatement(user, stmt) |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
77 post = put |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
78 |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
79 def _onStatement(self, user, stmt): |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
80 log.info('put statement %r', stmt) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
81 if stmt[0:2] == (ROOM['frontDoorLock'], ROOM['state']): |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
82 if stmt[2] == ROOM['unlocked']: |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
83 log.info('unlock for %r', user) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
84 self.settings.autoLock.onUnlockedStmt() |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
85 if stmt[2] == ROOM['locked']: |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
86 self.settings.autoLock.onLockedStmt() |
568 | 87 self.settings.mqtt.publish(espName + b"/switch/strike/command", |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
88 mqttMessageFromState(stmt[2])) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
89 return |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
90 log.warn("ignoring %s", stmt) |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
91 |
576
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
92 class SimpleState(cyclone.web.RequestHandler): |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
93 def post(self): |
577 | 94 try: |
95 user = requestUser(self.request) | |
96 except KeyError: | |
1683 | 97 log.warn('request without x-foaf-agent: %s', self.request.headers) |
577 | 98 self.set_status(403, 'need x-foaf-agent') |
99 return | |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
100 |
576
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
101 state = self.request.body.strip().decode('ascii') |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
102 if state == 'unlock': |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
103 self.settings.autoLock.onUnlockedStmt() |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
104 self.settings.mqtt.publish(espName + b"/switch/strike/command", b'ON') |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
105 if state == 'lock': |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
106 self.settings.autoLock.onLockedStmt() |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
107 self.settings.mqtt.publish(espName + b"/switch/strike/command", b'OFF') |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
108 |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
109 |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
110 class AutoLock(object): |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
111 def __init__(self, masterGraph, mqtt): |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
112 self.masterGraph = masterGraph |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
113 self.mqtt = mqtt |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
114 self.timeUnlocked = None |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
115 self.autoLockSec = 6 |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
116 self.subj = ROOM['frontDoorLock'] |
562 | 117 task.LoopingCall(self.pollCheck).start(1) |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
118 |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
119 def relock(self): |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
120 log.info('autolock is up: requesting lock') |
568 | 121 self.mqtt.publish(espName + b"/switch/strike/command", |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
122 mqttMessageFromState(ROOM['locked'])) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
123 |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
124 def reportTimes(self, unlockedFor): |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
125 g = self.masterGraph |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
126 lockIn = self.autoLockSec - int(unlockedFor) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
127 if lockIn < 0: |
562 | 128 state = g._graph.value(self.subj, ROOM['state']) |
129 log.warn(f"timeUnlocked {self.timeUnlocked}, state {state}, " | |
576
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
130 f"unlockedFor {unlockedFor}, lockIn {lockIn}") |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
131 lockIn = 0 |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
132 g.patchObject(ctx, self.subj, ROOM['unlockedForSec'], |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
133 Literal(int(unlockedFor))) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
134 g.patchObject(ctx, self.subj, ROOM['autoLockInSec'], |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
135 Literal(lockIn)) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
136 |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
137 def clearReport(self): |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
138 g = self.masterGraph |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
139 g.patchObject(ctx, self.subj, ROOM['unlockedForSec'], None) |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
140 g.patchObject(ctx, self.subj, ROOM['autoLockInSec'], None) |
562 | 141 |
142 def pollCheck(self): | |
143 try: | |
144 self.check() | |
145 except Exception: | |
146 log.exception('poll failed') | |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
147 |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
148 def check(self): |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
149 g = self.masterGraph |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
150 now = time.time() |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
151 state = g._graph.value(self.subj, ROOM['state']) |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
152 if state == ROOM['unlocked']: |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
153 if self.timeUnlocked is None: |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
154 self.timeUnlocked = now |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
155 # *newly* unlocked- this resets on every input stmt |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
156 unlockedFor = now - self.timeUnlocked |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
157 if unlockedFor > self.autoLockSec: |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
158 self.relock() |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
159 else: |
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
160 self.timeUnlocked = None |
468
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
161 unlockedFor = 0 |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
162 if unlockedFor > 3: |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
163 # only start showing the count if it looks like we're not |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
164 # being repeatedly held open. Time is hopefully more than |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
165 # the refresh rate of "reasoning.actions". |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
166 self.reportTimes(unlockedFor) |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
167 else: |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
168 self.clearReport() |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
169 |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
170 def onUnlockedStmt(self): |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
171 self.timeUnlocked = None |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
172 |
468
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
173 def onLockedStmt(self): |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
174 pass |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
175 |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
176 class BluetoothButton(cyclone.web.RequestHandler): |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
177 def post(self): |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
178 body = json.loads(self.request.body) |
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
179 log.info('POST bluetoothButton %r', body) |
1683 | 180 if body['addr'] == 'B8:27:EB:95:BE:1C' and body['key'] == 'top': |
468
756ff1170342
new graph view. some autolock and BT code
drewp@bigasterisk.com
parents:
426
diff
changeset
|
181 log.info('unlock for %r', body['addr']) |
563 | 182 self.settings.mqtt.publish( |
568 | 183 espName + b"/switch/strike/command", b'ON') |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
184 |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
185 |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
186 if __name__ == '__main__': |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
187 arg = docopt(""" |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
188 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
|
189 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
190 -v Verbose |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
191 """) |
563 | 192 verboseLogging(arg['-v']) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
193 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
194 masterGraph = PatchableGraph() |
1712
6ee9a1c5a991
update deps; code fixes; add skaffold
drewp@bigasterisk.com
parents:
1683
diff
changeset
|
195 mqtt = MqttClient(brokerPort=10210, clientId='front-door-lock-service') |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
196 autoclose = AutoLock(masterGraph, mqtt) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
197 def toGraph(payload): |
379
67cebf7a14de
frontdoor autolock. logging improvements. use simpler mqtt interface.
drewp@bigasterisk.com
parents:
377
diff
changeset
|
198 log.info('mqtt->graph %r', payload) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
199 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
|
200 stateFromMqtt(payload)) |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
201 |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
202 sub = mqtt.subscribe(espName + b"/switch/strike/state") |
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
203 sub.subscribe(on_next=toGraph) |
575
1209229cd56e
faster keepalive from esp chip. report aliveness into the graph. more programming tasks in tasks.py
drewp@bigasterisk.com
parents:
568
diff
changeset
|
204 |
1209229cd56e
faster keepalive from esp chip. report aliveness into the graph. more programming tasks in tasks.py
drewp@bigasterisk.com
parents:
568
diff
changeset
|
205 def setEspState(payload): |
1209229cd56e
faster keepalive from esp chip. report aliveness into the graph. more programming tasks in tasks.py
drewp@bigasterisk.com
parents:
568
diff
changeset
|
206 log.info('esp state change %r', payload) |
1209229cd56e
faster keepalive from esp chip. report aliveness into the graph. more programming tasks in tasks.py
drewp@bigasterisk.com
parents:
568
diff
changeset
|
207 masterGraph.patchObject(ctx, ROOM['frontDoorLock'], ROOM['espMqttConnection'], |
1209229cd56e
faster keepalive from esp chip. report aliveness into the graph. more programming tasks in tasks.py
drewp@bigasterisk.com
parents:
568
diff
changeset
|
208 ROOM['mqtt' + payload.decode('ascii').capitalize()]) |
655
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
209 |
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
210 sub = mqtt.subscribe(espName + b"/status") |
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
211 sub.subscribe(on_next=setEspState) |
013e2a89b345
index page rewrite. mqtt subscribe update. new store/events graph uri
drewp@bigasterisk.com
parents:
577
diff
changeset
|
212 |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
213 port = 10011 |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
214 reactor.listenTCP(port, cyclone.web.Application( |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
215 [ |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
216 (r"/()", cyclone.web.StaticFileHandler, |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
217 {"path": ".", "default_filename": "index.html"}), |
576
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
218 (r"/simple/()", cyclone.web.StaticFileHandler, |
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
219 {"path": ".", "default_filename": "simple.html"}), |
722
a93fbf0d0daa
dep updates; graph url renames; and other build updates
drewp@bigasterisk.com
parents:
655
diff
changeset
|
220 (r"/graph/frontDoorLock", CycloneGraphHandler, {'masterGraph': masterGraph}), |
a93fbf0d0daa
dep updates; graph url renames; and other build updates
drewp@bigasterisk.com
parents:
655
diff
changeset
|
221 (r"/graph/frontDoorLock/events", CycloneGraphEventsHandler, |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
222 {'masterGraph': masterGraph}), |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
223 (r'/output', OutputPage), |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
224 (r'/bluetoothButton', BluetoothButton), |
576
150aa09c9723
new simple mode that can set the door without rdf
drewp@bigasterisk.com
parents:
575
diff
changeset
|
225 (r'/simpleState', SimpleState), |
426
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
226 ], |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
227 mqtt=mqtt, |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
228 masterGraph=masterGraph, |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
229 autoLock=autoclose, |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
230 debug=arg['-v']), |
bfe555dd0c91
talk to store graph, second button for holding unlocked, etc
drewp@bigasterisk.com
parents:
425
diff
changeset
|
231 interface='::') |
1712
6ee9a1c5a991
update deps; code fixes; add skaffold
drewp@bigasterisk.com
parents:
1683
diff
changeset
|
232 log.warning('serving on %s', port) |
377
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
233 |
5b690bfc31b2
docker/etc initial version of front door mqtt<->rdf using some rx
drewp@bigasterisk.com
parents:
diff
changeset
|
234 reactor.run() |