annotate service/dpms/dpms_service.py @ 1463:2452dd87aa9c

release 0.9.0 Ignore-this: cd9ac6c22e35bce9d647edd85ab75acd darcs-hash:ee94646423f37369ac319ecce7a49cb108ecada4
author drewp <drewp@bigasterisk.com>
date Sun, 24 Nov 2019 00:02:42 -0800
parents 19ba6f9787b9
children 0da337780f22
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 #!bin/python
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 """
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 sample supervisord block
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 [program:dpms_9095]
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 directory=/my/proj/homeauto/service/dpms
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 command=/my/proj/homeauto/service/dpms/bin/python dpms.py
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 user=drewp
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 On one box, this goes super slow when avahi daemon is running. Maybe
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 it's for an attempted dns lookup of the requesting IP address, which I
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 wish I could switch off.
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 --
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 may need this:
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 ps axf | grep /run/gdm
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
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
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20 eval xauth add `sudo xauth -f /run/gdm/auth-for-gdm-iQoCDZ/database list :0`
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 """
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 from twisted.internet import reactor, task
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 import cyclone.web
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 from influxdb import InfluxDBClient
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 import subprocess, sys, socket, time, os
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 from rdflib import Namespace, URIRef
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
29 from logsetup import log, enableTwistedLog
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
30
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
31 from dpms import DPMS, DPMSModeOn
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 DEV = Namespace("http://projects.bigasterisk.com/device/")
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 ROOM = Namespace("http://projects.bigasterisk.com/room/")
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 sys.path.append("/my/site/magma")
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
36 from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
37 #sys.path.append("../../lib")
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
38 #from localdisplay import setDisplayToLocalX
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 influx = InfluxDBClient('bang6', 9060, 'root', 'root', 'main')
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
42 os.environ['DISPLAY'] = ':0.0'
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
43
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
44 dpms = DPMS()
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
45 host = socket.gethostname()
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
46
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 def getMonitorState():
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
48 level, enabled = dpms.Info()
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
49 return 'on' if level == DPMSModeOn else 'off'
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 class Root(cyclone.web.RequestHandler):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52 def get(self):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 getMonitorState() # to make it fail if xset isn't working
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 self.write('''
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 Get and put the <a href="monitor">monitor power</a> with dpms.
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 <a href="graph">rdf graph</a> available.''')
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 class Monitor(cyclone.web.RequestHandler):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 def get(self):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 self.set_header('content-type', 'text/plain')
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 self.write(getMonitorState())
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 def put(self):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 body = self.request.body.strip()
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 if body in ['on', 'off']:
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 subprocess.check_call(['xset', 'dpms', 'force', body])
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 self.set_status(204)
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 else:
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 raise NotImplementedError("body must be 'on' or 'off'")
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 class Poller(object):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 def __init__(self):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73 self.lastSent = None
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 self.lastSentTime = 0
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 task.LoopingCall(self.poll).start(5)
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 def poll(self):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 now = int(time.time())
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
79 state = getMonitorState()
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
80
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
81 ctx=DEV['dpms/%s' % host]
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
82 masterGraph.patchObject(
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
83 ctx,
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
84 URIRef("http://bigasterisk.com/host/%s/monitor" % host),
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
85 ROOM['powerStateMeasured'],
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
86 ROOM[getMonitorState()])
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
87
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 if state != self.lastSent or (now > self.lastSentTime + 3600):
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 influx.write_points([
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 {'measurement': 'power',
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
91 'tags': {'device': '%sMonitor' % host},
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 'fields': {'value': 1 if state == 'on' else 0},
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 'time': now
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 }], time_precision='s')
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 self.lastSent = state
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 self.lastSentTime = now
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
99 masterGraph = PatchableGraph()
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 poller = Poller()
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102 reactor.listenTCP(9095, cyclone.web.Application([
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103 (r'/', Root),
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104 (r'/monitor', Monitor),
1267
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
105 (r'/graph', CycloneGraphHandler, {'masterGraph': masterGraph}),
19ba6f9787b9 use PatchableGraph
drewp <drewp@bigasterisk.com>
parents: 1190
diff changeset
106 (r'/graph/events', CycloneGraphEventsHandler, {'masterGraph': masterGraph}),
1190
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107 ]), interface='::')
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 reactor.run()
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110
463e53246e9a rename dpms
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111