Mercurial > code > home > repos > homeauto
comparison service/frontDoorMessage/frontDoorMessage.py @ 0:6fd208b97616
start
Ignore-this: e06ac598970a0d4750f588ab89f56996
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Mon, 01 Aug 2011 03:30:30 -0700 |
parents | |
children | 1444da5242d8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:6fd208b97616 |
---|---|
1 """ | |
2 holds the current message on the front door lcd | |
3 """ | |
4 import cyclone.web, sys | |
5 import restkit | |
6 from twisted.python import log | |
7 from twisted.internet import reactor | |
8 from twisted.internet.defer import inlineCallbacks | |
9 sys.path.append("/my/proj/homeauto/lib") | |
10 from cycloneerr import PrettyErrorHandler | |
11 | |
12 class LcdParts(object): | |
13 def __init__(self, putUrl): | |
14 self.putUrl = putUrl | |
15 self.message = "" | |
16 self.lastLine = "" | |
17 | |
18 def updateLcd(self): | |
19 whole = "%-147s%-21s" % (self.message, self.lastLine) | |
20 restkit.request(url=self.putUrl, | |
21 method="PUT", | |
22 body=whole, | |
23 headers={"content-type":"text/plain"}) | |
24 | |
25 class Index(PrettyErrorHandler, cyclone.web.RequestHandler): | |
26 @inlineCallbacks | |
27 def get(self): | |
28 | |
29 # refresh output, and make an error if we can't talk to them | |
30 yield self.settings.lcdParts.updateLcd() | |
31 | |
32 self.set_header("Content-Type", "application/xhtml+xml") | |
33 self.write(open("index.html").read()) | |
34 | |
35 def getArg(s): | |
36 return s.request.body.encode("ascii") | |
37 | |
38 class Message(PrettyErrorHandler, cyclone.web.RequestHandler): | |
39 def get(self): | |
40 self.set_header("Content-Type", "text/plain") | |
41 self.write(self.settings.lcdParts.message) | |
42 | |
43 def put(self): | |
44 self.settings.lcdParts.message = getArg(self) | |
45 self.settings.lcdParts.updateLcd() | |
46 self.set_status(204) | |
47 | |
48 class LastLine(PrettyErrorHandler, cyclone.web.RequestHandler): | |
49 def get(self): | |
50 self.set_header("Content-Type", "text/plain") | |
51 self.write(self.settings.lcdParts.lastLine) | |
52 | |
53 def put(self): | |
54 self.settings.lcdParts.lastLine = getArg(self) | |
55 self.settings.lcdParts.updateLcd() | |
56 self.set_status(204) | |
57 | |
58 class Application(cyclone.web.Application): | |
59 def __init__(self, lcdParts): | |
60 handlers = [ | |
61 (r"/", Index), | |
62 (r"/message", Message), | |
63 (r'/lastLine', LastLine), | |
64 ] | |
65 settings = {"lcdParts" : lcdParts} | |
66 cyclone.web.Application.__init__(self, handlers, **settings) | |
67 | |
68 if __name__ == '__main__': | |
69 | |
70 config = { | |
71 'frontDoorArduino': "http://space:9080/", | |
72 'doorChangePost' : 'http://bang.bigasterisk.com:9069/inputChange', | |
73 'servePort' : 9081, | |
74 } | |
75 | |
76 lcdParts = LcdParts(config['frontDoorArduino'] + 'lcd') | |
77 | |
78 log.startLogging(sys.stdout) | |
79 reactor.listenTCP(config['servePort'], Application(lcdParts)) | |
80 reactor.run() |