Mercurial > code > home > repos > homeauto
annotate service/reasoning/actions.py @ 1412:302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
Ignore-this: 64b7275ee149f631b606320444a3478b
darcs-hash:1ec4d67abed3d43997fae5f10d4bc23ee1a6b2d5
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Wed, 24 Jul 2019 00:36:16 -0700 |
parents | 21d0cd98ef7a |
children | e157afd642b5 |
rev | line source |
---|---|
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 from rdflib import URIRef, Namespace, RDF, Literal |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
2 from twisted.internet import reactor |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 import logging |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 import urllib |
1411 | 5 import json |
6 import time | |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
8 import treq |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 log = logging.getLogger('output') |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 ROOM = Namespace("http://projects.bigasterisk.com/room/") |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 DEV = Namespace("http://projects.bigasterisk.com/device/") |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
13 REASONING = Namespace("http://projects.bigasterisk.com/ns/reasoning/") |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
15 class HttpPutOutput(object): |
1411 | 16 def __init__(self, url, mockOutput=False): |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
17 self.url = url |
1411 | 18 self.mockOutput = mockOutput |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
19 self.payload = None |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
20 self.foafAgent = None |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
21 self.nextCall = None |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
22 self.lastErr = None |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
23 self.numRequests = 0 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
24 |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
25 def report(self): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
26 return { |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
27 'url': self.url, |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
28 'urlAbbrev': self.url |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
29 .replace('http%3A%2F%2Fprojects.bigasterisk.com%2Froom%2F', ':') |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
30 .replace('http://projects.bigasterisk.com/room/', ':') |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
31 .replace('.vpn-home.bigasterisk.com', '.vpn-home'), |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
32 'payload': self.payload, |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
33 'numRequests': self.numRequests, |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
34 'lastChangeTime': round(self.lastChangeTime, 2), |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
35 'lastErr': str(self.lastErr) if self.lastErr is not None else None, |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
36 } |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
37 |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
38 def setPayload(self, payload, foafAgent): |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
39 if self.numRequests > 0 and (self.payload == payload and |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
40 self.foafAgent == foafAgent): |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
41 return |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
42 self.payload = payload |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
43 self.foafAgent = foafAgent |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
44 self.lastChangeTime = time.time() |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
45 self.makeRequest() |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
46 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
47 def makeRequest(self): |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
48 if self.payload is None: |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
49 log.debug("PUT None to %s - waiting", self.url) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
50 return |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
51 h = {} |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
52 if self.foafAgent: |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
53 h['x-foaf-agent'] = self.foafAgent |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
54 if self.nextCall and self.nextCall.active(): |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
55 self.nextCall.cancel() |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
56 self.nextCall = None |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
57 self.lastErr = None |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
58 log.debug("PUT %s payload=%s agent=%s", self.url, self.payload, self.foafAgent) |
1411 | 59 if not self.mockOutput: |
60 self.currentRequest = treq.put(self.url, data=self.payload, headers=h, timeout=3) | |
61 self.currentRequest.addCallback(self.onResponse).addErrback(self.onError) | |
62 else: | |
63 reactor.callLater(.2, self.onResponse, None) | |
64 | |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
65 self.numRequests += 1 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
66 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
67 def onResponse(self, resp): |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
68 log.debug(" PUT %s ok", self.url) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
69 self.lastErr = None |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
70 self.currentRequest = None |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
71 self.nextCall = reactor.callLater(30, self.makeRequest) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
72 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
73 def onError(self, err): |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
74 self.lastErr = err |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
75 log.debug(' PUT %s failed: %s', self.url, err) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
76 self.currentRequest = None |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
77 self.nextCall = reactor.callLater(50, self.makeRequest) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
78 |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
79 class HttpPutOutputs(object): |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
80 """these grow forever""" |
1411 | 81 def __init__(self, mockOutput=False): |
82 self.mockOutput = mockOutput | |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
83 self.state = {} # url: HttpPutOutput |
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
84 |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
85 def put(self, url, payload, foafAgent): |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
86 if url not in self.state: |
1411 | 87 self.state[url] = HttpPutOutput(url, mockOutput=self.mockOutput) |
1409
e78b8806ad05
actually set put payload this time. add treq dep
drewp <drewp@bigasterisk.com>
parents:
1408
diff
changeset
|
88 self.state[url].setPayload(payload, foafAgent) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
89 |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
90 class Actions(object): |
1411 | 91 def __init__(self, sendToLiveClients, mockOutput=False): |
92 self.mockOutput = mockOutput | |
93 self.putOutputs = HttpPutOutputs(mockOutput=mockOutput) | |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
94 self.sendToLiveClients = sendToLiveClients |
1403 | 95 |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
96 def putResults(self, deviceGraph, inferred): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
97 """ |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
98 some conclusions in the inferred graph lead to PUT requests |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
99 getting made |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
100 |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
101 if the graph contains (?d ?p ?o) and ?d and ?p are a device |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
102 and predicate we support PUTs for, then we look up |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
103 (?d :putUrl ?url) and (?o :putValue ?val) and call |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
104 PUT ?url <- ?val |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
105 |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
106 If the graph doesn't contain any matches, we use (?d |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
107 :zeroValue ?val) for the value and PUT that. |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
108 """ |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
109 activated = set() # (subj,pred) pairs for which we're currently putting some value |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
110 activated.update(self._putDevices(deviceGraph, inferred)) |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
111 self._oneShotPostActions(deviceGraph, inferred) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
112 for dev, pred in [ |
1052 | 113 #(URIRef('http://bigasterisk.com/host/bang/monitor'), ROOM.powerState), |
114 (URIRef('http://bigasterisk.com/host/dash/monitor'), ROOM.powerState), | |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
115 (URIRef('http://bigasterisk.com/host/frontdoor/monitor'), ROOM.powerState), |
1069 | 116 (ROOM['storageCeilingLedLong'], ROOM.brightness), |
117 (ROOM['storageCeilingLedCross'], ROOM.brightness), | |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
118 (ROOM['garageOverhead'], ROOM.brightness), |
1069 | 119 (ROOM['headboardWhite'], ROOM.brightness), |
120 (ROOM['changingWhite'], ROOM.brightness), | |
121 (ROOM['starTrekLight'], ROOM.brightness), | |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
122 (ROOM['kitchenLight'], ROOM.brightness), |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
123 (ROOM['kitchenCounterLight'], ROOM.brightness), |
1069 | 124 (ROOM['livingRoomLamp1'], ROOM.brightness), |
125 (ROOM['livingRoomLamp2'], ROOM.brightness), | |
1406 | 126 (ROOM['loftDeskStrip'], ROOM.x), |
1069 | 127 (ROOM['bedLedStrip'], ROOM.color), |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
128 ]: |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
129 url = deviceGraph.value(dev, ROOM.putUrl) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
130 |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
131 log.debug('inferredObjects of dev=%s pred=%s', |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
132 deviceGraph.qname(dev), |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
133 deviceGraph.qname(pred)) |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
134 inferredObjects = list(inferred.objects(dev, pred)) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
135 if len(inferredObjects) == 0: |
1403 | 136 # rm this- use activated instead |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
137 self._putZero(deviceGraph, dev, pred, url) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
138 elif len(inferredObjects) == 1: |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
139 log.debug(' inferredObject: %s %s %r', |
1085
dda3f1524a52
lots of logging updates (patch may be imprecise)
drewp <drewp@bigasterisk.com>
parents:
1069
diff
changeset
|
140 deviceGraph.qname(dev), |
dda3f1524a52
lots of logging updates (patch may be imprecise)
drewp <drewp@bigasterisk.com>
parents:
1069
diff
changeset
|
141 deviceGraph.qname(pred), |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
142 inferredObjects[0].toPython()) |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
143 activated.add((dev, pred)) |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
144 self._putInferred(deviceGraph, url, inferredObjects[0]) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
145 elif len(inferredObjects) > 1: |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
146 log.info(" conflict, ignoring: %s has %s of %s" % |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
147 (dev, pred, inferredObjects)) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
148 # write about it to the inferred graph? |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
149 self.putDefaults(deviceGraph, activated) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
150 |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
151 def putDefaults(self, deviceGraph, activated): |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
152 """ |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
153 If inferring (:a :b :c) would cause a PUT, you can say |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
154 |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
155 reasoning:defaultOutput reasoning:default [ |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
156 :subject :a |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
157 :predicate :b |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
158 :defaultObject :c |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
159 ] |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
160 |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
161 and we'll do that PUT if no rule has put anything else with |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
162 (:a :b *). |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
163 """ |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
164 |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
165 defaultStmts = set() |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
166 for defaultDesc in deviceGraph.objects(REASONING['defaultOutput'], |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
167 REASONING['default']): |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
168 s = deviceGraph.value(defaultDesc, ROOM['subject']) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
169 p = deviceGraph.value(defaultDesc, ROOM['predicate']) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
170 if (s, p) not in activated: |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
171 obj = deviceGraph.value(defaultDesc, ROOM['defaultObject']) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
172 |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
173 defaultStmts.add((s, p, obj)) |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
174 log.debug('defaultStmts %s %s %s', s, p, obj) |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
175 self._putDevices(deviceGraph, defaultStmts) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
176 |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
177 def _oneShotPostActions(self, deviceGraph, inferred): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
178 """ |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
179 Inferred graph may contain some one-shot statements. We'll send |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
180 statement objects to anyone on web sockets, and also generate |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
181 POST requests as described in the graph. |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
182 |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
183 one-shot statement ?s ?p ?o |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
184 with this in the graph: |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
185 ?osp a :OneShotPost |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
186 ?osp :subject ?s |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
187 ?osp :predicate ?p |
1403 | 188 this will cause a post to ?o |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
189 """ |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
190 # nothing in this actually makes them one-shot yet. they'll |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
191 # just fire as often as we get in here, which is not desirable |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
192 log.debug("_oneShotPostActions") |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
193 def err(e): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
194 log.warn("post %s failed", postTarget) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
195 for osp in deviceGraph.subjects(RDF.type, ROOM['OneShotPost']): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
196 s = deviceGraph.value(osp, ROOM['subject']) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
197 p = deviceGraph.value(osp, ROOM['predicate']) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
198 if s is None or p is None: |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
199 continue |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
200 #log.info("checking for %s %s", s, p) |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
201 for postTarget in inferred.objects(s, p): |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
202 log.debug("post target %r", postTarget) |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
203 # this packet ought to have 'oneShot' in it somewhere |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
204 self.sendToLiveClients({"s":s, "p":p, "o":postTarget}) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
205 |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
206 log.debug(" POST %s", postTarget) |
1411 | 207 if not self.mockOutput: |
208 treq.post(postTarget, timeout=2).addErrback(err) | |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
209 |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
210 def _putDevices(self, deviceGraph, inferred): |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
211 activated = set() |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
212 agentFor = {} |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
213 for stmt in inferred: |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
214 if stmt[1] == ROOM['putAgent']: |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
215 agentFor[stmt[0]] = stmt[2] |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
216 for stmt in inferred: |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
217 log.debug('inferred stmt we might PUT: %s', stmt) |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
218 putUrl = deviceGraph.value(stmt[0], ROOM['putUrl']) |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
219 putPred = deviceGraph.value(stmt[0], ROOM['putPredicate']) |
1266
ee5698ef64dd
add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents:
1197
diff
changeset
|
220 matchPred = deviceGraph.value(stmt[0], ROOM['matchPredicate'], |
ee5698ef64dd
add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents:
1197
diff
changeset
|
221 default=putPred) |
ee5698ef64dd
add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents:
1197
diff
changeset
|
222 if putUrl and matchPred == stmt[1]: |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
223 log.debug('putDevices: stmt %r %r %r leds to putting at %r', |
1403 | 224 stmt[0], stmt[1], stmt[2], putUrl) |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
225 self._put(putUrl + '?' + urllib.urlencode([ |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
226 ('s', str(stmt[0])), |
1266
ee5698ef64dd
add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents:
1197
diff
changeset
|
227 ('p', str(putPred))]), |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
228 str(stmt[2].toPython()), |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
229 agent=agentFor.get(stmt[0], None)) |
1405
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
230 activated.add((stmt[0], |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
231 # didn't test that this should be |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
232 # stmt[1] and not putPred |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
233 stmt[1])) |
882159ac1301
support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents:
1403
diff
changeset
|
234 return activated |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
235 |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
236 def _putInferred(self, deviceGraph, putUrl, obj): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
237 """ |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
238 HTTP PUT to putUrl, with a payload that's either obj's :putValue |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
239 or obj itself. |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
240 """ |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
241 value = deviceGraph.value(obj, ROOM.putValue) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
242 if value is not None: |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
243 self._put(putUrl, payload=str(value)) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
244 elif isinstance(obj, Literal): |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
245 self._put(putUrl, payload=str(obj)) |
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
246 else: |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
247 log.warn(" don't know what payload to put for %s. obj=%r", |
1045
a328cc370b22
ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
248 putUrl, obj) |
1403 | 249 |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
250 def _putZero(self, deviceGraph, dev, pred, putUrl): |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
251 # zerovalue should be a function of pred as well. |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
252 value = deviceGraph.value(dev, ROOM.zeroValue) |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
253 if value is not None: |
1410
dc70ee50c981
redo reasoning actions log levels
drewp <drewp@bigasterisk.com>
parents:
1409
diff
changeset
|
254 log.debug(" put zero (%r) to %s", value.toPython(), putUrl) |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
255 self._put(putUrl, payload=str(value)) |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
256 # this should be written back into the inferred graph |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
257 # for feedback |
1403 | 258 |
1197
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
259 def _put(self, url, payload, agent=None): |
d8acab2b01f5
mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents:
1133
diff
changeset
|
260 assert isinstance(payload, bytes) |
1408
89bf0d204b29
reasoning output using treq, and keep writing to PUT calls forever (but not as fast as the reasoning loop runs)
drewp <drewp@bigasterisk.com>
parents:
1406
diff
changeset
|
261 self.putOutputs.put(url, payload, agent) |
1412
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
262 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
263 import cyclone.sse |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
264 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
265 class PutOutputsTable(cyclone.sse.SSEHandler): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
266 def __init__(self, application, request): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
267 cyclone.sse.SSEHandler.__init__(self, application, request) |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
268 self.actions = self.settings.reasoning.actions |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
269 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
270 def bind(self, *args, **kwargs): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
271 self.bound = True |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
272 self.loop() |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
273 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
274 def unbind(self): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
275 self.bound = False |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
276 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
277 def loop(self): |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
278 if not self.bound: |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
279 return |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
280 |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
281 self.sendEvent(message=json.dumps({ |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
282 'puts': [row.report() for _, row in |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
283 sorted(self.actions.putOutputs.state.items())], |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
284 }), event='update') |
302063bfb8ff
reasoning web page uses rdf/browse/graphView for inputs and outputs now
drewp <drewp@bigasterisk.com>
parents:
1411
diff
changeset
|
285 reactor.callLater(1, self.loop) |