0
|
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()
|