annotate service/reasoning/actions.py @ 1405:882159ac1301

support for default values for http PUT outputs Ignore-this: 675022649e1c1014116f685a03e5d9f6 darcs-hash:89e09e40e2e58ed8db364fee1db5aea7e6f56e0f
author drewp <drewp@bigasterisk.com>
date Tue, 23 Jul 2019 10:28:12 -0700
parents 69b3f5b3aeda
children 63a3d8eeb46f
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
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 import logging
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 import urllib
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 from cyclone.httpclient import fetch
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 log = logging.getLogger('output')
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 log.setLevel(logging.WARN)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 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
10 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
11 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
12
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 class Actions(object):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 def __init__(self, sendToLiveClients):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 self.sendToLiveClients = sendToLiveClients
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
16
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 def putResults(self, deviceGraph, inferred):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 """
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 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
20 getting made
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 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
23 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
24 (?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
25 PUT ?url <- ?val
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 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
28 :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
29 """
1405
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
30 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
31 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
32 self._oneShotPostActions(deviceGraph, inferred)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 for dev, pred in [
1052
2434e88d8bb0 add bed buttons
drewp <drewp@bigasterisk.com>
parents: 1047
diff changeset
34 #(URIRef('http://bigasterisk.com/host/bang/monitor'), ROOM.powerState),
2434e88d8bb0 add bed buttons
drewp <drewp@bigasterisk.com>
parents: 1047
diff changeset
35 (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
36 (URIRef('http://bigasterisk.com/host/frontdoor/monitor'), ROOM.powerState),
1069
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
37 (ROOM['storageCeilingLedLong'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
38 (ROOM['storageCeilingLedCross'], ROOM.brightness),
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
39 (ROOM['garageOverhead'], ROOM.brightness),
1069
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
40 (ROOM['headboardWhite'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
41 (ROOM['changingWhite'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
42 (ROOM['starTrekLight'], ROOM.brightness),
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
43 (ROOM['kitchenLight'], ROOM.brightness),
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
44 (ROOM['kitchenCounterLight'], ROOM.brightness),
1069
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
45 (ROOM['livingRoomLamp1'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
46 (ROOM['livingRoomLamp2'], ROOM.brightness),
c5b14fe5c387 rules updates
drewp <drewp@bigasterisk.com>
parents: 1064
diff changeset
47 (ROOM['bedLedStrip'], ROOM.color),
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 ]:
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 url = deviceGraph.value(dev, ROOM.putUrl)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
51 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
52 deviceGraph.qname(dev),
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
53 deviceGraph.qname(pred))
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 inferredObjects = list(inferred.objects(dev, pred))
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 if len(inferredObjects) == 0:
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
56 # rm this- use activated instead
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 self._putZero(deviceGraph, dev, pred, url)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 elif len(inferredObjects) == 1:
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
59 log.debug(' inferredObject: %s %s %r',
1085
dda3f1524a52 lots of logging updates (patch may be imprecise)
drewp <drewp@bigasterisk.com>
parents: 1069
diff changeset
60 deviceGraph.qname(dev),
dda3f1524a52 lots of logging updates (patch may be imprecise)
drewp <drewp@bigasterisk.com>
parents: 1069
diff changeset
61 deviceGraph.qname(pred),
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
62 inferredObjects[0].toPython())
1405
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
63 activated.add((dev, pred))
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 self._putInferred(deviceGraph, url, inferredObjects[0])
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 elif len(inferredObjects) > 1:
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
66 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
67 (dev, pred, inferredObjects))
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 # 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
69 self.putDefaults(deviceGraph, activated)
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
70
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
71 def putDefaults(self, deviceGraph, activated):
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
72 """
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
73 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
74
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
75 reasoning:defaultOutput reasoning:default [
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
76 :subject :a
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
77 :predicate :b
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
78 :defaultObject :c
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
79 ]
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
80
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
81 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
82 (:a :b *).
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
83 """
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
84
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
85 defaultStmts = set()
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
86 for defaultDesc in deviceGraph.objects(REASONING['defaultOutput'],
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
87 REASONING['default']):
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
88 s = deviceGraph.value(defaultDesc, ROOM['subject'])
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
89 p = deviceGraph.value(defaultDesc, ROOM['predicate'])
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
90 if (s, p) not in activated:
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
91 obj = deviceGraph.value(defaultDesc, ROOM['defaultObject'])
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
92
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
93 defaultStmts.add((s, p, obj))
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
94 self._putDevices(deviceGraph, defaultStmts)
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
95
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 def _oneShotPostActions(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 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
99 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
100 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
101
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102 one-shot statement ?s ?p ?o
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103 with this in the graph:
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104 ?osp a :OneShotPost
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 ?osp :subject ?s
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 ?osp :predicate ?p
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
107 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
108 """
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 # 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
110 # just fire as often as we get in here, which is not desirable
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 log.info("_oneShotPostActions")
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112 def err(e):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 log.warn("post %s failed", postTarget)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114 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
115 s = deviceGraph.value(osp, ROOM['subject'])
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 p = deviceGraph.value(osp, ROOM['predicate'])
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 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
118 continue
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
119 #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
120 for postTarget in inferred.objects(s, p):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
121 log.info("post target %r", postTarget)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
122 # 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
123 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
124
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
125 log.info(" POST %s", postTarget)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
126 fetch(postTarget, method="POST", timeout=2).addErrback(err)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
127
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
128 def _putDevices(self, deviceGraph, inferred):
1405
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
129 activated = set()
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
130 agentFor = {}
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
131 for stmt in inferred:
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
132 if stmt[1] == ROOM['putAgent']:
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
133 agentFor[stmt[0]] = stmt[2]
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
134 for stmt in inferred:
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
135 log.info('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
136 putUrl = deviceGraph.value(stmt[0], ROOM['putUrl'])
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
137 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
138 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
139 default=putPred)
ee5698ef64dd add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents: 1197
diff changeset
140 if putUrl and matchPred == stmt[1]:
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
141 log.info('putDevices: stmt %r %r %r leds to putting at %r',
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
142 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
143 self._put(putUrl + '?' + urllib.urlencode([
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
144 ('s', str(stmt[0])),
1266
ee5698ef64dd add separate :matchPredicate support. some build and log edits.
drewp <drewp@bigasterisk.com>
parents: 1197
diff changeset
145 ('p', str(putPred))]),
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
146 str(stmt[2].toPython()),
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
147 agent=agentFor.get(stmt[0], None))
1405
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
148 activated.add((stmt[0],
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
149 # didn't test that this should be
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
150 # stmt[1] and not putPred
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
151 stmt[1]))
882159ac1301 support for default values for http PUT outputs
drewp <drewp@bigasterisk.com>
parents: 1403
diff changeset
152 return activated
1045
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
153
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
154 def _putInferred(self, deviceGraph, putUrl, obj):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
155 """
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
156 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
157 or obj itself.
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
158 """
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
159 value = deviceGraph.value(obj, ROOM.putValue)
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
160 if value is not None:
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
161 self._put(putUrl, payload=str(value))
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
162 elif isinstance(obj, Literal):
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
163 self._put(putUrl, payload=str(obj))
a328cc370b22 ipv6 fetch support. refactor Actions to new class and file
drewp <drewp@bigasterisk.com>
parents:
diff changeset
164 else:
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
165 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
166 putUrl, obj)
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
167
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
168 def _putZero(self, deviceGraph, dev, pred, putUrl):
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
169 # 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
170 value = deviceGraph.value(dev, ROOM.zeroValue)
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
171 if value is not None:
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
172 log.info(" put zero (%r) to %s", value.toPython(), putUrl)
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
173 self._put(putUrl, payload=str(value))
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
174 # 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
175 # for feedback
1403
69b3f5b3aeda comments and logging
drewp <drewp@bigasterisk.com>
parents: 1266
diff changeset
176
1197
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
177 def _put(self, url, payload, agent=None):
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
178 assert isinstance(payload, bytes)
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
179 def err(e):
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
180 log.warn(" put %s failed (%r)", url, e)
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
181 log.info(" PUT %s payload=%s agent=%s", url, payload, agent)
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
182 headers = {}
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
183 if agent is not None:
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
184 headers['x-foaf-agent'] = [str(agent)]
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
185 fetch(url, method="PUT", postdata=payload, timeout=2,
d8acab2b01f5 mqtt has two devices now. various older cleanups.
drewp <drewp@bigasterisk.com>
parents: 1133
diff changeset
186 headers=headers).addErrback(err)