comparison service/mqtt_graph_bridge/mqtt_graph_bridge.py @ 694:925bc4137c93

extract rdfStatementsFromRequest for sharing with other tools Ignore-this: 74eba63f3a29f48b48c6fb1ae74780d3
author drewp@bigasterisk.com
date Fri, 31 Jan 2020 23:54:20 -0800
parents e1ee6661329a
children c52b172c0824
comparison
equal deleted inserted replaced
693:be2fbdbdf549 694:925bc4137c93
5 This is like light9/bin/collector. 5 This is like light9/bin/collector.
6 """ 6 """
7 import json 7 import json
8 8
9 from docopt import docopt 9 from docopt import docopt
10 from rdflib import Namespace, URIRef, Literal, Graph 10 from rdflib import Namespace, Literal
11 from rdflib.parser import StringInputSource
12 from twisted.internet import reactor 11 from twisted.internet import reactor
13 import cyclone.web 12 import cyclone.web
14 13
15 from mqtt_client import MqttClient 14 from mqtt_client import MqttClient
16 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler 15 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
17 from standardservice.logsetup import log, verboseLogging 16 from standardservice.logsetup import log, verboseLogging
17 import rdf_over_http
18 18
19 ROOM = Namespace('http://projects.bigasterisk.com/room/') 19 ROOM = Namespace('http://projects.bigasterisk.com/room/')
20 20
21 devs = { 21 devs = {
22 ROOM['kitchenLight']: { 22 ROOM['kitchenLight']: {
27 'root': 'h801_counter', 27 'root': 'h801_counter',
28 'ctx': ROOM['kitchenH801'] 28 'ctx': ROOM['kitchenH801']
29 }, 29 },
30 } 30 }
31 31
32 def rdfGraphBody(body, headers):
33 g = Graph()
34 g.parse(StringInputSource(body), format='nt')
35 return g
36 32
37 class OutputPage(cyclone.web.RequestHandler): 33 class OutputPage(cyclone.web.RequestHandler):
38 def put(self): 34 def put(self):
39 arg = self.request.arguments 35 for stmt in rdf_over_http.rdfStatementsFromRequest(
40 if arg.get('s') and arg.get('p'): 36 self.request.arguments,
41 subj = URIRef(arg['s'][-1]) 37 self.request.body,
42 pred = URIRef(arg['p'][-1]) 38 self.request.headers):
43 turtleLiteral = self.request.body 39 self._onStatement(stmt)
44 try: 40
45 obj = Literal(float(turtleLiteral))
46 except ValueError:
47 obj = Literal(turtleLiteral)
48 stmt = (subj, pred, obj)
49 else:
50 g = rdfGraphBody(self.request.body, self.request.headers)
51 assert len(g) == 1, len(g)
52 stmt = g.triples((None, None, None)).next()
53 self._onStatement(stmt)
54
55 def _onStatement(self, stmt): 41 def _onStatement(self, stmt):
42 log.info(f'incoming statement: {stmt}')
56 ignored = True 43 ignored = True
57 for dev, attrs in devs.items(): 44 for dev, attrs in devs.items():
58 if stmt[0:2] == (dev, ROOM['brightness']): 45 if stmt[0:2] == (dev, ROOM['brightness']):
59 for chan, scale in [('w1', 1), 46 for chan, scale in [('w1', 1),
60 ('r', 1), 47 ('r', 1),
98 log.warn('serving on %s', port) 85 log.warn('serving on %s', port)
99 86
100 for dev, attrs in devs.items(): 87 for dev, attrs in devs.items():
101 masterGraph.patchObject(attrs['ctx'], 88 masterGraph.patchObject(attrs['ctx'],
102 dev, ROOM['brightness'], Literal(0.0)) 89 dev, ROOM['brightness'], Literal(0.0))
103 90
104 reactor.run() 91 reactor.run()