diff service/reasoning/actions.py @ 1197:d8acab2b01f5

mqtt has two devices now. various older cleanups. Ignore-this: 67ca3acc5dc6aa672d0c896c9f5ae48e darcs-hash:964511475873219e6bc4725388a8d2e54a3c4e28
author drewp <drewp@bigasterisk.com>
date Sat, 19 Jan 2019 12:08:59 -0800
parents 114ca7fd9d01
children 1ceb26846eca
line wrap: on
line diff
--- a/service/reasoning/actions.py	Sat Jan 19 10:44:10 2019 -0800
+++ b/service/reasoning/actions.py	Sat Jan 19 12:08:59 2019 -0800
@@ -26,45 +26,43 @@
         If the graph doesn't contain any matches, we use (?d
         :zeroValue ?val) for the value and PUT that.
         """
-        
+        self._putDevices(deviceGraph, inferred)
         self._oneShotPostActions(deviceGraph, inferred)
         for dev, pred in [
-                # the config of each putUrl should actually be in the
-                # context of a dev and predicate pair, and then that would
-                # be the source of this list
-                #(DEV.theaterDoorLock, ROOM.state),
                 #(URIRef('http://bigasterisk.com/host/bang/monitor'), ROOM.powerState),
                 (URIRef('http://bigasterisk.com/host/dash/monitor'), ROOM.powerState),
+                (URIRef('http://bigasterisk.com/host/frontdoor/monitor'), ROOM.powerState),
                 (ROOM['storageCeilingLedLong'], ROOM.brightness),
                 (ROOM['storageCeilingLedCross'], ROOM.brightness),
+                (ROOM['garageOverhead'], ROOM.brightness),
                 (ROOM['headboardWhite'], ROOM.brightness),
                 (ROOM['changingWhite'], ROOM.brightness),
                 (ROOM['starTrekLight'], ROOM.brightness),
+                (ROOM['kitchenLight'], ROOM.brightness),
+                (ROOM['kitchenCounterLight'], ROOM.brightness),
                 (ROOM['livingRoomLamp1'], ROOM.brightness),
                 (ROOM['livingRoomLamp2'], ROOM.brightness),
                 (ROOM['bedLedStrip'], ROOM.color),
             ]:
             url = deviceGraph.value(dev, ROOM.putUrl)
 
-            if url and dev == DEV.theaterDoorLock: # ew
-                self._put(url+"/mode", payload="output")
-
+            log.debug('inferredObjects of dev=%s pred=%s',
+                      deviceGraph.qname(dev),
+                      deviceGraph.qname(pred))
             inferredObjects = list(inferred.objects(dev, pred))
             if len(inferredObjects) == 0:
                 self._putZero(deviceGraph, dev, pred, url)
             elif len(inferredObjects) == 1:
-                log.debug('inferredObject: %s %s %r',
+                log.debug('  inferredObject: %s %s %r',
                           deviceGraph.qname(dev),
                           deviceGraph.qname(pred),
-                          inferredObjects[0])
+                          inferredObjects[0].toPython())
                 self._putInferred(deviceGraph, url, inferredObjects[0])
             elif len(inferredObjects) > 1:
-                log.info("conflict, ignoring: %s has %s of %s" %
+                log.info("  conflict, ignoring: %s has %s of %s" %
                          (dev, pred, inferredObjects))
                 # write about it to the inferred graph?
-
-        #self._frontDoorPuts(deviceGraph, inferred)
-
+        
     def _oneShotPostActions(self, deviceGraph, inferred):
         """
         Inferred graph may contain some one-shot statements. We'll send
@@ -88,7 +86,7 @@
             p = deviceGraph.value(osp, ROOM['predicate'])
             if s is None or p is None:
                 continue
-            log.info("checking for %s %s", s, p)
+            #log.info("checking for %s %s", s, p)
             for postTarget in inferred.objects(s, p):
                 log.info("post target %r", postTarget)
                 # this packet ought to have 'oneShot' in it somewhere
@@ -96,74 +94,21 @@
 
                 log.info("    POST %s", postTarget)
                 fetch(postTarget, method="POST", timeout=2).addErrback(err)
-        self._postMpdCommands(inferred)
-        
-    def _postMpdCommands(self, inferred):
-        """special case to be eliminated. mpd play urls are made of an
-        mpd service and a song/album/playlist uri to be played.
-        Ideally the graph rules would assemble these like
-        http://{mpd}/addAndPlay?uri={toPlay} or maybe toPlay as the payload
-        which would be fairly general but still allow toPlay uris to
-        be matched with any player."""
 
-        rootSkippingAuth = "http://brace:9009/"
-        for mpd in [URIRef("http://bigasterisk.com/host/brace/mpd")]:
-
-            for song in inferred.objects(mpd, ROOM['startMusic']):
-                log.info("mpd statement: %r" % song)
-                assert song.startswith('http://bigasterisk.com/music/')
-                self.post(rootSkippingAuth + "addAndPlay" + urllib.quote(song[len("http://bigasterisk.com/music"):]))
-
-            for state in inferred.objects(mpd, ROOM['playState']):
-                log.info('hello playstate %s', state)
-                if state == ROOM['pause']:
-                    log.info("mpd %s %s", mpd, state)
-                    self.post(rootSkippingAuth + "mpd/pause")
-            for vol in inferred.objects(mpd, ROOM['audioState']):
-                if vol == ROOM['volumeStepUp']:
-                    self.post(rootSkippingAuth + "volumeAdjust?amount=6&max=70")
-                if vol == ROOM['volumeStepDown']:
-                    self.post(rootSkippingAuth + "volumeAdjust?amount=-6&min=10")            
-
-    def _frontDoorPuts(self, deviceGraph, inferred):
-        # todo: shouldn't have to be a special case
-        brt = inferred.value(DEV.frontDoorLcd, ROOM.brightness)
-        if brt is None:
-            return
-        url = deviceGraph.value(DEV.frontDoorLcdBrightness, ROOM.putUrl)
-        log.info("put lcd %s brightness %s", url, brt)
-        self._put(str(url) + "?brightness=%s" % str(brt), payload='')
-
-        msg = "open %s motion %s" % (
-            inferred.value(DEV['frontDoorOpenIndicator'], ROOM.text),
-            inferred.value(DEV['frontDoorMotionIndicator'], ROOM.text))
-        # this was meant to be 2 chars in the bottom row, but the
-        # easier test was to replace the whole top msg
-        #restkit.Resource("http://slash:9080/").put("lcd", message=msg)
-
-    
-
-
-    def _put(self, url, payload):
-        def err(e):
-            log.warn("    put %s failed (%r)", url, e)
-        log.info("    PUT %s payload=%r", url, payload)
-        fetch(url, method="PUT", postdata=payload, timeout=2).addErrback(err)
-        
-    def post(self, postTarget):
-        log.info("special mpd POST %s", postTarget)
-        def err(e):
-            log.warn("post %s failed", postTarget)
-        fetch(postTarget, method="POST", timeout=2).addErrback(err)
-        
-    def _putZero(self, deviceGraph, dev, pred, putUrl):
-        # zerovalue should be a function of pred as well.
-        value = deviceGraph.value(dev, ROOM.zeroValue)
-        if value is not None:
-            log.info("put zero (%r) to %s", value, putUrl)
-            self._put(putUrl, payload=str(value))
-            # this should be written back into the inferred graph
-            # for feedback
+    def _putDevices(self, deviceGraph, inferred):
+        agentFor = {}
+        for stmt in inferred:
+            if stmt[1] == ROOM['putAgent']:
+                agentFor[stmt[0]] = stmt[2]
+        for stmt in inferred:
+            putUrl = deviceGraph.value(stmt[0], ROOM['putUrl'])
+            putPred = deviceGraph.value(stmt[0], ROOM['putPredicate'])
+            if putUrl and putPred == stmt[1]:
+                self._put(putUrl + '?' + urllib.urlencode([
+                    ('s', str(stmt[0])),
+                    ('p', str(stmt[1]))]),
+                          str(stmt[2].toPython()),
+                          agent=agentFor.get(stmt[0], None))
 
     def _putInferred(self, deviceGraph, putUrl, obj):
         """
@@ -176,5 +121,25 @@
         elif isinstance(obj, Literal):
             self._put(putUrl, payload=str(obj))
         else:
-            log.warn("don't know what payload to put for %s. obj=%r",
+            log.warn("    don't know what payload to put for %s. obj=%r",
                         putUrl, obj)
+                
+    def _putZero(self, deviceGraph, dev, pred, putUrl):
+        # zerovalue should be a function of pred as well.
+        value = deviceGraph.value(dev, ROOM.zeroValue)
+        if value is not None:
+            log.info("    put zero (%r) to %s", value.toPython(), putUrl)
+            self._put(putUrl, payload=str(value))
+            # this should be written back into the inferred graph
+            # for feedback
+        
+    def _put(self, url, payload, agent=None):
+        assert isinstance(payload, bytes)
+        def err(e):
+            log.warn("    put %s failed (%r)", url, e)
+        log.info("    PUT %s payload=%s agent=%s", url, payload, agent)
+        headers = {}
+        if agent is not None:
+            headers['x-foaf-agent'] = [str(agent)]
+        fetch(url, method="PUT", postdata=payload, timeout=2,
+              headers=headers).addErrback(err)