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