Mercurial > code > home > repos > homeauto
view service/xidle/xidle.py @ 292:105969d248d6
rewrite xidle to cyclone. add bg updating graph
Ignore-this: 5e02bc3572723517fb5ed3aa6971805a
author | drewp@bigasterisk.com |
---|---|
date | Mon, 01 Aug 2016 02:24:50 -0700 |
parents | 1e94d074f642 |
children | 01817264cc3d |
line wrap: on
line source
#!bin/python from __future__ import division """ X server idle time is now available over http! """ import time import sys, socket, json from rdflib import Namespace, URIRef, Literal from influxdb import InfluxDBClient import cyclone.web from twisted.internet import reactor, task # from http://bebop.bigasterisk.com/python/ import xss # another option: http://thp.io/2007/09/x11-idle-time-and-focused-window-in.html DEV = Namespace("http://projects.bigasterisk.com/device/") ROOM = Namespace("http://projects.bigasterisk.com/room/") sys.path.append("/my/site/magma") from stategraph import StateGraph host = socket.gethostname() client = InfluxDBClient('bang6', 9060, 'root', 'root', 'main') class Root(cyclone.web.RequestHandler): def get(self): xss.get_info() # fail if we can't get the display or something self.write(''' Get the <a href="idle">X idle time</a> on %s. <a href="graph">rdf graph</a> available.''' % host) class Idle(cyclone.web.RequestHandler): def get(self): self.set_header('Content-type', 'application/json') self.write(json.dumps({"idleMs" : xss.get_info().idle})) class Graph(cyclone.web.RequestHandler): def get(self): self.set_header('Content-type', 'application/x-trig') g = StateGraph(ctx=DEV['xidle/%s' % host]) ms = xss.get_info().idle subj = URIRef("http://bigasterisk.com/host/%s/xidle" % host) g.add((subj, ROOM['idleTimeMs'], Literal(ms))) g.add((subj, ROOM['idleTimeMinutes'], Literal(ms / 1000 / 60))) self.write(g.asTrig()) class Poller(object): def __init__(self): self.points = [] self.lastSent = None self.lastSentTime = 0 task.LoopingCall(self.poll).start(5) def poll(self): ms = xss.get_info().idle lastMinActive = ms < 60 * 1000 now = int(time.time()) if self.lastSent != lastMinActive or now > self.lastSentTime + 3600: self.points.append({"measurement": "presence", "tags": {"host": host, "sensor": "xidle"}, "fields": {"value": 1 if lastMinActive else 0}, "time": now}) self.lastSent = lastMinActive self.lastSentTime = now client.write_points(self.points, time_precision='s') self.points = [] poller = Poller() reactor.listenTCP(9107, cyclone.web.Application([ (r'/', Root), (r'/idle', Idle), (r'/graph', Graph), ]), interface='::') reactor.run()