view service/environment/environment.py @ 1000:df5a40967a2f

polymer updates Ignore-this: f4f88b324b54abf90af6dc5360910041 darcs-hash:20150830185325-312f9-8f07ba7ccc6ecd6528159fa5fd09a166d3ce1650
author drewp <drewp@bigasterisk.com>
date Sun, 30 Aug 2015 11:53:25 -0700
parents a06d9921c2a3
children 9236b736bc34
line wrap: on
line source

#!/usr/bin/python
"""
return some rdf about the environment, e.g. the current time,
daytime/night, overall modes like 'maintenance mode', etc

"""
import sys, datetime, cyclone.web
from twisted.internet import reactor
from dateutil.tz import tzlocal
from dateutil.relativedelta import relativedelta, FR
from rdflib import Namespace, Literal
sys.path.append("/my/site/magma")
from stategraph import StateGraph
sys.path.append("/my/proj/homeauto/lib")
from cycloneerr import PrettyErrorHandler
from twilight import isWithinTwilight

ROOM = Namespace("http://projects.bigasterisk.com/room/")
DEV = Namespace("http://projects.bigasterisk.com/device/")

class GraphHandler(PrettyErrorHandler, cyclone.web.RequestHandler):
    def get(self):
        g = StateGraph(ROOM.environment)
        now = datetime.datetime.now(tzlocal())

        g.add((DEV.environment, ROOM.localHour, Literal(now.hour)))
        g.add((DEV.environment, ROOM.localTimeToMinute,
               Literal(now.strftime("%H:%M"))))
        g.add((DEV.environment, ROOM.localTimeToSecond,
               Literal(now.strftime("%H:%M:%S"))))
        g.add((DEV.environment, ROOM.localDayOfWeek,
               Literal(now.strftime("%A"))))
        g.add((DEV.environment, ROOM.localMonthDay,
               Literal(now.strftime("%B %e"))))
        g.add((DEV.environment, ROOM.localDate,
               Literal(now.strftime("%Y-%m-%d"))))

        for offset in range(-12, 7):
            d = now.date() + datetime.timedelta(days=offset)
            if d == d + relativedelta(day=31, weekday=FR(-1)):
                g.add((DEV.calendar, ROOM.daysToLastFridayOfMonth,
                       Literal(offset)))

        g.add((DEV.calendar, ROOM.twilight,
               ROOM['withinTwilight'] if isWithinTwilight(now) else
               ROOM['daytime']))

        ct, body = g.asAccepted(self.request.headers.get('accept'))
        self.set_header('Content-type', ct)
        self.write(body)

from rdfdoc import Doc
        
class Application(cyclone.web.Application):
    def __init__(self):
        handlers = [
            (r"/()", cyclone.web.StaticFileHandler,
             {"path": ".", "default_filename": "index.html"}),
            (r'/graph', GraphHandler),
            (r'/doc', Doc), # to be shared
        ]
        cyclone.web.Application.__init__(self, handlers)

if __name__ == '__main__':
    reactor.listenTCP(9075, Application())
    reactor.run()