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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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