# HG changeset patch # User drewp # Date 1555828736 25200 # Node ID 19ba6f9787b9b3501746174b0c20354423dffa95 # Parent ee5698ef64dd96492c829a08e9dd021946e80eb6 use PatchableGraph Ignore-this: dc954906750062923ef8205f8a8e8952 darcs-hash:a3df9901afbd6ebb0ddf461fe254e5837a534b0a diff -r ee5698ef64dd -r 19ba6f9787b9 service/dpms/dpms_service.py --- a/service/dpms/dpms_service.py Sat Apr 20 23:36:30 2019 -0700 +++ b/service/dpms/dpms_service.py Sat Apr 20 23:38:56 2019 -0700 @@ -26,25 +26,27 @@ from influxdb import InfluxDBClient import subprocess, sys, socket, time, os from rdflib import Namespace, URIRef +from logsetup import log, enableTwistedLog + +from dpms import DPMS, DPMSModeOn DEV = Namespace("http://projects.bigasterisk.com/device/") ROOM = Namespace("http://projects.bigasterisk.com/room/") sys.path.append("/my/site/magma") -from stategraph import StateGraph -sys.path.append("../../lib") -from localdisplay import setDisplayToLocalX +from patchablegraph import PatchableGraph, CycloneGraphEventsHandler, CycloneGraphHandler +#sys.path.append("../../lib") +#from localdisplay import setDisplayToLocalX influx = InfluxDBClient('bang6', 9060, 'root', 'root', 'main') +os.environ['DISPLAY'] = ':0.0' + +dpms = DPMS() +host = socket.gethostname() + def getMonitorState(): - out = subprocess.check_output(['xset', 'q']) - for line in out.splitlines(): - line = line.strip() - if line == 'Monitor is On': - return 'on' - elif line in ['Monitor is Off', 'Monitor is in Suspend', 'Monitor is in Standby']: - return 'off' - raise NotImplementedError("no matching monitor line in xset output") + level, enabled = dpms.Info() + return 'on' if level == DPMSModeOn else 'off' class Root(cyclone.web.RequestHandler): def get(self): @@ -66,19 +68,6 @@ else: raise NotImplementedError("body must be 'on' or 'off'") - -class Graph(cyclone.web.RequestHandler): - def get(self): - host = socket.gethostname() - g = StateGraph(ctx=DEV['dpms/%s' % host]) - g.add((URIRef("http://bigasterisk.com/host/%s/monitor" % host), - ROOM['powerStateMeasured'], - ROOM[getMonitorState()])) - - self.set_header('Content-type', 'application/x-trig') - self.write(g.asTrig()) - - class Poller(object): def __init__(self): self.lastSent = None @@ -87,15 +76,19 @@ def poll(self): now = int(time.time()) - try: - state = getMonitorState() - except subprocess.CalledProcessError, e: - print repr(e) - os.abort() + state = getMonitorState() + + ctx=DEV['dpms/%s' % host] + masterGraph.patchObject( + ctx, + URIRef("http://bigasterisk.com/host/%s/monitor" % host), + ROOM['powerStateMeasured'], + ROOM[getMonitorState()]) + if state != self.lastSent or (now > self.lastSentTime + 3600): influx.write_points([ {'measurement': 'power', - 'tags': {'device': '%sMonitor' % socket.gethostname()}, + 'tags': {'device': '%sMonitor' % host}, 'fields': {'value': 1 if state == 'on' else 0}, 'time': now }], time_precision='s') @@ -103,13 +96,14 @@ self.lastSent = state self.lastSentTime = now -setDisplayToLocalX() +masterGraph = PatchableGraph() poller = Poller() reactor.listenTCP(9095, cyclone.web.Application([ (r'/', Root), (r'/monitor', Monitor), - (r'/graph', Graph), + (r'/graph', CycloneGraphHandler, {'masterGraph': masterGraph}), + (r'/graph/events', CycloneGraphEventsHandler, {'masterGraph': masterGraph}), ]), interface='::') reactor.run() diff -r ee5698ef64dd -r 19ba6f9787b9 service/dpms/makefile --- a/service/dpms/makefile Sat Apr 20 23:36:30 2019 -0700 +++ b/service/dpms/makefile Sat Apr 20 23:38:56 2019 -0700 @@ -14,3 +14,6 @@ local_run: docker run --rm -it -v /tmp/.X11-unix/:/tmp/.X11-unix/ -v /home/drewp/.Xauthority:/root/.Xauthority -p 9095:9095 --net=host bang6:5000/dpms python ./dpms_service.py + +redeploy: build_image build_image_pi + sudo /my/proj/ansible/playbook -t homeauto_dpms diff -r ee5698ef64dd -r 19ba6f9787b9 service/dpms/requirements.txt --- a/service/dpms/requirements.txt Sat Apr 20 23:36:30 2019 -0700 +++ b/service/dpms/requirements.txt Sat Apr 20 23:38:56 2019 -0700 @@ -6,5 +6,5 @@ influxdb==4.1.1 service_identity https://github.com/dirjud/python-dpms/archive/master.zip -https://projects.bigasterisk.com/rdfdb/rdfdb-0.6.0.tar.gz +https://projects.bigasterisk.com/rdfdb/rdfdb-0.8.0.tar.gz rdflib-jsonld==0.3