diff service/reasoning/actions.py @ 609:5290df01d911

reasoning web page uses rdf/browse/graphView for inputs and outputs now Ignore-this: 64b7275ee149f631b606320444a3478b
author drewp@bigasterisk.com
date Wed, 24 Jul 2019 00:36:16 -0700
parents 62171aa2bc4e
children e157afd642b5
line wrap: on
line diff
--- a/service/reasoning/actions.py	Wed Jul 24 00:34:41 2019 -0700
+++ b/service/reasoning/actions.py	Wed Jul 24 00:36:16 2019 -0700
@@ -19,13 +19,29 @@
         self.payload = None
         self.foafAgent = None
         self.nextCall = None
+        self.lastErr = None
         self.numRequests = 0
 
+    def report(self):
+        return {
+            'url': self.url,
+            'urlAbbrev': self.url
+            .replace('http%3A%2F%2Fprojects.bigasterisk.com%2Froom%2F', ':')
+            .replace('http://projects.bigasterisk.com/room/', ':')
+            .replace('.vpn-home.bigasterisk.com', '.vpn-home'),
+            'payload': self.payload,
+            'numRequests': self.numRequests,
+            'lastChangeTime': round(self.lastChangeTime, 2),
+            'lastErr': str(self.lastErr) if self.lastErr is not None else None,
+            }
+
     def setPayload(self, payload, foafAgent):
-        if self.numRequests > 0 and (self.payload == payload or self.foafAgent == foafAgent):
+        if self.numRequests > 0 and (self.payload == payload and
+                                     self.foafAgent == foafAgent):
             return
         self.payload = payload
         self.foafAgent = foafAgent
+        self.lastChangeTime = time.time()
         self.makeRequest()
 
     def makeRequest(self):
@@ -52,13 +68,13 @@
         log.debug("  PUT %s ok", self.url)
         self.lastErr = None
         self.currentRequest = None
-        self.nextCall = reactor.callLater(3, self.makeRequest)
+        self.nextCall = reactor.callLater(30, self.makeRequest)
 
     def onError(self, err):
         self.lastErr = err
         log.debug('  PUT %s failed: %s', self.url, err)
         self.currentRequest = None
-        self.nextCall = reactor.callLater(5, self.makeRequest)
+        self.nextCall = reactor.callLater(50, self.makeRequest)
 
 class HttpPutOutputs(object):
     """these grow forever"""
@@ -155,6 +171,7 @@
                 obj = deviceGraph.value(defaultDesc, ROOM['defaultObject'])
 
                 defaultStmts.add((s, p, obj))
+                log.debug('defaultStmts %s %s %s', s, p, obj)
         self._putDevices(deviceGraph, defaultStmts)
 
     def _oneShotPostActions(self, deviceGraph, inferred):
@@ -242,3 +259,27 @@
     def _put(self, url, payload, agent=None):
         assert isinstance(payload, bytes)
         self.putOutputs.put(url, payload, agent)
+
+import cyclone.sse
+
+class PutOutputsTable(cyclone.sse.SSEHandler):
+    def __init__(self, application, request):
+        cyclone.sse.SSEHandler.__init__(self, application, request)
+        self.actions = self.settings.reasoning.actions
+
+    def bind(self, *args, **kwargs):
+        self.bound = True
+        self.loop()
+
+    def unbind(self):
+        self.bound = False
+
+    def loop(self):
+        if not self.bound:
+            return
+
+        self.sendEvent(message=json.dumps({
+            'puts': [row.report() for _, row in
+                     sorted(self.actions.putOutputs.state.items())],
+        }), event='update')
+        reactor.callLater(1, self.loop)