annotate service/xidle/xidle.py @ 1423:ba56263fe3b2

arduinonode to docker Ignore-this: 8f689c7491819bc47200018b517fd7de darcs-hash:e3602fc781c7b66e98ca950d5782ecc41e506bad
author drewp <drewp@bigasterisk.com>
date Wed, 07 Aug 2019 20:23:04 -0700
parents 808503d8c5cc
children 3df357924f1d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 #!bin/python
874
16b8c4f36f31 add idleTimeMinutes to rdf graph
drewp <drewp@bigasterisk.com>
parents: 858
diff changeset
2 from __future__ import division
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 """
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 X server idle time is now available over http!
1166
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
5
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
6 Note: HD-4110 webcams stop X from going idle by sending events
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
7 constantly. Run this to fix:
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
8
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
9 xinput disable "HP Webcam HD-4110"
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10 """
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
12 import time
1166
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
13 import sys, socket, json, os
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 from rdflib import Namespace, URIRef, Literal
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
15 from influxdb import InfluxDBClient
1166
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
16 import influxdb.exceptions
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
17 import cyclone.web
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
18 from twisted.internet import reactor, task
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19
1166
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
20 import actmon
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 # another option: http://thp.io/2007/09/x11-idle-time-and-focused-window-in.html
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 DEV = Namespace("http://projects.bigasterisk.com/device/")
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 ROOM = Namespace("http://projects.bigasterisk.com/room/")
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25
1166
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
26 sys.path.append('../../lib')
64e36f30f046 xidle to docker
drewp <drewp@bigasterisk.com>
parents: 1097
diff changeset
27 from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 host = socket.gethostname()
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
30 client = InfluxDBClient('bang6', 9060, 'root', 'root', 'main')
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
32 os.environ['DISPLAY'] = ':0.0'
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
33
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
34 actmon.get_idle_time() # fail if we can't get the display or something
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
35
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
36 class Root(cyclone.web.RequestHandler):
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
37 def get(self):
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
38 actmon.get_idle_time() # fail if we can't get the display or something
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
39 self.write('''
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 Get the <a href="idle">X idle time</a> on %s.
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
41 <a href="graph">rdf graph</a> available.''' % host)
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
42
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
43 class Idle(cyclone.web.RequestHandler):
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
44 def get(self):
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
45 self.set_header('Content-type', 'application/json')
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
46 self.write(json.dumps({"idleMs" : actmon.get_idle_time()}))
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
47
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
48 class Poller(object):
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
49 def __init__(self):
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
50 self.points = []
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
51 self.lastSent = None
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
52 self.lastSentTime = 0
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
53 task.LoopingCall(self.poll).start(5)
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
54
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
55 def poll(self):
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
56 ms = actmon.get_idle_time()
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
57 ctx = DEV['xidle/%s' % host]
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
58 subj = URIRef("http://bigasterisk.com/host/%s/xidle" % host)
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
59 masterGraph.patchObject(ctx, subj, ROOM['idleTimeMs'], Literal(ms))
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
60 masterGraph.patchObject(ctx, subj, ROOM['idleTimeMinutes'],
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
61 Literal(ms / 1000 / 60))
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
62
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
63 lastMinActive = ms < 60 * 1000
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
64 now = int(time.time())
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
65 if self.lastSent != lastMinActive or now > self.lastSentTime + 3600:
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
66 self.points.append({"measurement": "presence",
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
67 "tags": {"host": host, "sensor": "xidle"},
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
68 "fields": {"value": 1 if lastMinActive else 0},
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
69 "time": now})
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
70 self.lastSent = lastMinActive
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
71 self.lastSentTime = now
874
16b8c4f36f31 add idleTimeMinutes to rdf graph
drewp <drewp@bigasterisk.com>
parents: 858
diff changeset
72
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
73 try:
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
74 client.write_points(self.points, time_precision='s')
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
75 except influxdb.exceptions.InfluxDBServerError as e:
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
76 print repr(e)
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
77 reactor.crash()
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
78 self.points = []
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
80
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
81 masterGraph = PatchableGraph()
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
82 poller = Poller()
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
83
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
84 reactor.listenTCP(9107, cyclone.web.Application([
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
85 (r'/', Root),
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
86 (r'/idle', Idle),
1168
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
87 (r'/graph', CycloneGraphHandler, {'masterGraph': masterGraph}),
808503d8c5cc xidle support graph/events streams, use actmod module for the input now
drewp <drewp@bigasterisk.com>
parents: 1166
diff changeset
88 (r'/graph/events', CycloneGraphEventsHandler, {'masterGraph': masterGraph}),
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
89 ]), interface='::')
858
8887a0778a1f new xidle service
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90
1097
3aef251c7585 rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents: 1020
diff changeset
91 reactor.run()