Mercurial > code > home > repos > homeauto
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)