Mercurial > code > home > repos > homeauto
annotate service/dpms/dpms.py @ 1153:e4f49cd9dda3
add :pointsAtLeastEvery control
Ignore-this: 9d0236b56b2a7592211ca68b87b4a5d1
darcs-hash:76e4d358cb6b039351c9b6f8e3bb825aaaefcc57
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sun, 15 Apr 2018 04:41:00 -0700 |
parents | 9cb135126a63 |
children |
rev | line source |
---|---|
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 #!bin/python |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 """ |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 sample supervisord block |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
5 |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 [program:dpms_9095] |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 directory=/my/proj/homeauto/service/dpms |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
8 command=/my/proj/homeauto/service/dpms/bin/python dpms.py |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 user=drewp |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 On one box, this goes super slow when avahi daemon is running. Maybe |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 it's for an attempted dns lookup of the requesting IP address, which I |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 wish I could switch off. |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 |
888
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
15 -- |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
16 |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
17 may need this: |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
18 ps axf | grep /run/gdm |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
19 18339 tty7 Ss+ 0:00 \_ /usr/bin/X :0 -background none -verbose -auth /run/gdm/auth-for-gdm-iQoCDZ/database -nolisten tcp vt7 |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
20 eval xauth add `sudo xauth -f /run/gdm/auth-for-gdm-iQoCDZ/database list :0` |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
21 |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 """ |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
24 from twisted.internet import reactor, task |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
25 import cyclone.web |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
26 from influxdb import InfluxDBClient |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
27 import subprocess, sys, socket, time, os |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 from rdflib import Namespace, URIRef |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 DEV = Namespace("http://projects.bigasterisk.com/device/") |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 ROOM = Namespace("http://projects.bigasterisk.com/room/") |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 sys.path.append("/my/site/magma") |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 from stategraph import StateGraph |
888
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
34 sys.path.append("../../lib") |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
35 from localdisplay import setDisplayToLocalX |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
37 influx = InfluxDBClient('bang6', 9060, 'root', 'root', 'main') |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
38 |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 def getMonitorState(): |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 out = subprocess.check_output(['xset', 'q']) |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 for line in out.splitlines(): |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 line = line.strip() |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 if line == 'Monitor is On': |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 return 'on' |
888
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
45 elif line in ['Monitor is Off', 'Monitor is in Suspend', 'Monitor is in Standby']: |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 return 'off' |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 raise NotImplementedError("no matching monitor line in xset output") |
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
49 class Root(cyclone.web.RequestHandler): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
50 def get(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
51 getMonitorState() # to make it fail if xset isn't working |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
52 self.write(''' |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
53 Get and put the <a href="monitor">monitor power</a> with dpms. |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
54 <a href="graph">rdf graph</a> available.''') |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
56 class Monitor(cyclone.web.RequestHandler): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
57 def get(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
58 self.set_header('content-type', 'text/plain') |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
59 self.write(getMonitorState()) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
60 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
61 def put(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
62 body = self.request.body.strip() |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
63 if body in ['on', 'off']: |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
64 subprocess.check_call(['xset', 'dpms', 'force', body]) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
65 self.set_status(204) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
66 else: |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
67 raise NotImplementedError("body must be 'on' or 'off'") |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
68 |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
70 class Graph(cyclone.web.RequestHandler): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
71 def get(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
72 host = socket.gethostname() |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
73 g = StateGraph(ctx=DEV['dpms/%s' % host]) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
74 g.add((URIRef("http://bigasterisk.com/host/%s/monitor" % host), |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
75 ROOM['powerStateMeasured'], |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
76 ROOM[getMonitorState()])) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
77 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
78 self.set_header('Content-type', 'application/x-trig') |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
79 self.write(g.asTrig()) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
80 |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
82 class Poller(object): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
83 def __init__(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
84 self.lastSent = None |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
85 self.lastSentTime = 0 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
86 task.LoopingCall(self.poll).start(5) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
87 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
88 def poll(self): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
89 now = int(time.time()) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
90 try: |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
91 state = getMonitorState() |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
92 except subprocess.CalledProcessError, e: |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
93 print repr(e) |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
94 os.abort() |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
95 if state != self.lastSent or (now > self.lastSentTime + 3600): |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
96 influx.write_points([ |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
97 {'measurement': 'power', |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
98 'tags': {'device': '%sMonitor' % socket.gethostname()}, |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
99 'fields': {'value': 1 if state == 'on' else 0}, |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
100 'time': now |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
101 }], time_precision='s') |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
102 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
103 self.lastSent = state |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
104 self.lastSentTime = now |
888
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
105 |
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
106 setDisplayToLocalX() |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
107 poller = Poller() |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
108 |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
109 reactor.listenTCP(9095, cyclone.web.Application([ |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
110 (r'/', Root), |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
111 (r'/monitor', Monitor), |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
112 (r'/graph', Graph), |
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
113 ]), interface='::') |
837
d4c057c508f9
new service over the dpms monitor on/off control
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
114 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
115 reactor.run() |
888
ced063266d96
dpms: more monitor states. separate powerState and powerStateMeasured
drewp <drewp@bigasterisk.com>
parents:
837
diff
changeset
|
116 |
1122
9cb135126a63
rewrite to cyclone. sends data to influx
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
117 |