Mercurial > code > home > repos > homeauto
annotate service/piNode/export_to_influxdb.py @ 1109:77f6117e002f
influx output, fade support, switch to Adafruit_DHT, start of Lcd8544
Ignore-this: dd9cae16daafd780a301728a1ce8eb38
darcs-hash:1282aaba9f4505487702d322d9ea67b77e8dbbba
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Fri, 16 Sep 2016 00:55:04 -0700 |
parents | b5906f6fce3f |
children |
rev | line source |
---|---|
1098
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 import time, logging |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 from influxdb import InfluxDBClient |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 from rdflib import Namespace |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
5 log = logging.getLogger() |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 ROOM = Namespace('http://projects.bigasterisk.com/room/') |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
8 class InfluxExporter(object): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 def __init__(self, configGraph, influxHost='bang6'): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 self.graph = configGraph |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 self.influx = InfluxDBClient(influxHost, 9060, 'root', 'root', 'main') |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 self.lastExport = 0 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 self.lastSent = {} # (subj, measurementName, tags) : (time, value) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 self.measurements = {} # (subj, predicate) : measurement |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 for s, m in self.graph.subject_objects(ROOM['influxMeasurement']): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 self.measurements[(s, self.graph.value(m, ROOM['predicate']))] = m |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 def exportToInflux(self, currentStatements): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 graph = self.graph |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 now = int(time.time()) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 points = [] |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
24 for stmt in currentStatements: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 if (stmt[0], stmt[1]) in self.measurements: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 meas = self.measurements[(stmt[0], stmt[1])] |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
27 measurementName = graph.value(meas, ROOM['measurement']) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 tags = {} |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 for t in graph.objects(meas, ROOM['tag']): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 k = graph.value(t, ROOM['key']).toPython() |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 tags[k] = graph.value(t, ROOM['value']).toPython() |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 value = self.influxValue(stmt[2]) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
34 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
35 if not self.shouldSendNewPoint(now, stmt[0], measurementName, |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 tags, value): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 continue |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 points.append({ |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 'measurement': measurementName, |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 "tags": tags, |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 "fields": {"value": value}, |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 "time": now |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 }) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 log.debug('send to influx %r', points[-1]) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 if points: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 self.influx.write_points(points, time_precision='s') |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
49 def influxValue(self, rdfValue): |
1109
77f6117e002f
influx output, fade support, switch to Adafruit_DHT, start of Lcd8544
drewp <drewp@bigasterisk.com>
parents:
1098
diff
changeset
|
50 if rdfValue in [ROOM['motion'], ROOM['pressed']]: |
1098
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
51 value = 1 |
1109
77f6117e002f
influx output, fade support, switch to Adafruit_DHT, start of Lcd8544
drewp <drewp@bigasterisk.com>
parents:
1098
diff
changeset
|
52 elif rdfValue in [ROOM['noMotion'], ROOM['notPressed']]: |
1098
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
53 value = 0 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 else: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 value = rdfValue.toPython() |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
56 if not isinstance(value, (int, float)): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
57 raise NotImplementedError('value=%r' % value) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 return value |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
59 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
60 def shouldSendNewPoint(self, now, subj, measurementName, tags, value): |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 key = (subj, measurementName, tuple(sorted(tags.items()))) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 if key in self.lastSent: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 lastTime, lastValue = self.lastSent[key] |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 if lastValue == value and lastTime > now - 3600: |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 log.debug('skip influx point %r', key) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 return False |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 self.lastSent[key] = (now, value) |
b5906f6fce3f
save data to influxdb, not graphite
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 return True |