Mercurial > code > home > repos > homeauto
annotate service/xidle/xidle.py @ 1444:4afb1830bb5e
use rx version 3.x
Ignore-this: 4232f8e780d35a8d0642e86521eb2801
darcs-hash:747608892b607f78260f4772a4ff2b24c7392f73
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Tue, 24 Sep 2019 14:04:02 -0700 |
parents | 808503d8c5cc |
children | 3df357924f1d |
rev | line source |
---|---|
858 | 1 #!bin/python |
874
16b8c4f36f31
add idleTimeMinutes to rdf graph
drewp <drewp@bigasterisk.com>
parents:
858
diff
changeset
|
2 from __future__ import division |
858 | 3 """ |
4 X server idle time is now available over http! | |
1166 | 5 |
6 Note: HD-4110 webcams stop X from going idle by sending events | |
7 constantly. Run this to fix: | |
8 | |
9 xinput disable "HP Webcam HD-4110" | |
858 | 10 """ |
11 | |
1097
3aef251c7585
rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
12 import time |
1166 | 13 import sys, socket, json, os |
858 | 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 | 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 | 19 |
1166 | 20 import actmon |
858 | 21 # another option: http://thp.io/2007/09/x11-idle-time-and-focused-window-in.html |
22 | |
23 DEV = Namespace("http://projects.bigasterisk.com/device/") | |
24 ROOM = Namespace("http://projects.bigasterisk.com/room/") | |
25 | |
1166 | 26 sys.path.append('../../lib') |
27 from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler | |
858 | 28 |
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 | 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 | 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 | 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 | 90 |
1097
3aef251c7585
rewrite xidle to cyclone. add bg updating graph
drewp <drewp@bigasterisk.com>
parents:
1020
diff
changeset
|
91 reactor.run() |