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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
5 import json
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
59 if not self.mockOutput:
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
60 self.currentRequest = treq.put(self.url, data=self.payload, headers=h, timeout=3)
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
61 self.currentRequest.addCallback(self.onResponse).addErrback(self.onError)
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
62 else:
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
63 reactor.callLater(.2, self.onResponse, None)
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
81 def __init__(self, mockOutput=False):
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
91 def __init__(self, sendToLiveClients, mockOutput=False):
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
92 self.mockOutput = mockOutput
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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
2434e88d8bb0 add bed buttons
drewp <drewp@bigasterisk.com>
parents: 1047
diff changeset
113 #(URIRef('http://bigasterisk.com/host/bang/monitor'), ROOM.powerState),
2434e88d8bb0 add bed buttons
drewp <drewp@bigasterisk.com>
parents: 1047
diff changeset
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
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
116 (ROOM['storageCeilingLedLong'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
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
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
119 (ROOM['headboardWhite'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
120 (ROOM['changingWhite'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
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
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
124 (ROOM['livingRoomLamp1'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
125 (ROOM['livingRoomLamp2'], ROOM.brightness),
1406
b2e9cd28d202 loftdesk config
drewp <drewp@bigasterisk.com>
parents: 1405
diff changeset
126 (ROOM['loftDeskStrip'], ROOM.x),
1069
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
207 if not self.mockOutput:
21d0cd98ef7a mock output mode
drewp <drewp@bigasterisk.com>
parents: 1410
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
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)