annotate service/wallscreen/wallscreen.py @ 866:a99b4d5afb83

use websockets for temperature update Ignore-this: 558ad53cf5b4b0c013041db555fbb458 darcs-hash:20130210214135-312f9-f69d37d4b9bce7fa6ec0e9c9889b2de90fd26a8f
author drewp <drewp@bigasterisk.com>
date Sun, 10 Feb 2013 13:41:35 -0800
parents db3e0510ab49
children 7f7911accb26
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 """
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 for raspberry pi screen.
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 B2G_HOMESCREEN=http://10.1.0.1:9102 b2g/b2g --screen=700x480
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 and then fix the window with this:
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 echo "window.resizeTo(702,480)" | nc localhost 9999
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 """
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
7 import json, sys, time
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 from dateutil.parser import parse
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
9 from twisted.internet import reactor, task
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
10 from twisted.internet.defer import inlineCallbacks
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
11 import cyclone.web, cyclone.httpclient, cyclone.websocket
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 from rdflib import Graph, URIRef, Namespace, Literal, RDF
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
13
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
14 sys.path.append("../../lib")
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
15 from logsetup import log
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
16 from cycloneerr import PrettyErrorHandler
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
17
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 CV = Namespace("http://bigasterisk.com/checkvist/v1#")
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 EV = Namespace("http://bigasterisk.com/event#")
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
21 class Content(PrettyErrorHandler, cyclone.web.RequestHandler):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
22 def get(self):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
23 out = []
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
24 if 0: # needs to be rewritten for trello
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
25 g = Graph()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
26 g.parse("http://bang:9103/graph", format="n3")
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
28 tasks = [] # (pos, task)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
29 for t in g.subjects(RDF.type, CV.OpenTask):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
30 if (None, CV.child, t) in g:
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
31 continue
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
32 tasks.append((g.value(t, CV.position), t))
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
33 tasks.sort()
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
35 def appendTree(t, depth):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
36 out.append(dict(
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
37 uri=t,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
38 depth=depth,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
39 mark=g.value(t, CV.mark),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
40 content=g.value(t, CV.content),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
41 ))
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
42 for sub in g.objects(t, CV.child):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
43 if (sub, RDF.type, CV.OpenTask) not in g:
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
44 continue
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
45 appendTree(sub, depth+1)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
47 for pos, t in tasks[:10]:
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
48 appendTree(t, depth=0)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
50 events = [] # [{'date':'yyyy-mm-dd', 'dayEvents':[], 'timeEvents':[]}]
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
51 g = Graph()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
52 g.parse("http://bang:9105/events?days=3", format='n3')
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
53 byDay = {}
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
54 for ev in g.subjects(RDF.type, EV.Event):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
55 start = g.value(ev, EV['start'])
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
56 s = parse(start)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
57 d = s.date().isoformat()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
58 byDay.setdefault(d, {'dayEvents':[],
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
59 'timeEvents':[]})[
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
60 'timeEvents' if 'T' in start else 'dayEvents'].append({
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
61 'title' : g.value(ev, EV['title']),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
62 'start' : start,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
63 'date' : s.date().isoformat(),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
64 'time' : s.time().isoformat()[:-3],
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
65 })
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
66 for k,v in sorted(byDay.items(), key=lambda (k,v): k):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
67 d = {'date':k, 'weekdayName':parse(k).strftime("%A")}
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
68 d.update(v)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
69 d['dayEvents'].sort(key=lambda ev: ev['title'])
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
70 d['timeEvents'].sort(key=lambda ev: ev['start'])
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
71 events.append(d)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
73 self.write(json.dumps({'tasks':out, 'events' : events}))
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
75 @inlineCallbacks
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
76 def pushThermostat():
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
77 f = json.loads((yield cyclone.httpclient.fetch("http://bang:10001/requestedTemperature")).body)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
78 [c.sendMessage(f) for c in liveClients]
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
80 class RefreshTemperature(PrettyErrorHandler, cyclone.web.RequestHandler):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
81 def post(self):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
82 return pushThermostat()
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
83
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
84 liveClients = set()
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
85
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
86 class Live(cyclone.websocket.WebSocketHandler):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
87 def connectionMade(self, *args, **kwargs):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
88 log.info("websocket opened")
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
89 liveClients.add(self)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
90
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
91 def connectionLost(self, reason):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
92 log.info("websocket closed")
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
93 liveClients.remove(self)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
94
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
95 def messageReceived(self, message):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
96 log.info("got message %s" % message)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
97 self.sendMessage(message)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
98
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
99 if __name__ == '__main__':
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
100 from twisted.python import log as twlog
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
101 #twlog.startLogging(sys.stdout)
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
102
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
103 task.LoopingCall(pushThermostat).start(1)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
104
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
105 port = 9102
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
106 reactor.listenTCP(port, cyclone.web.Application(handlers=[
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
107 (r'/content', Content),
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
108 (r'/live', Live),
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
109 (r'/refreshTemperature', RefreshTemperature),
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
110 (r'/(.*)', cyclone.web.StaticFileHandler,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
111 {"path" : ".", # security hole- serves this dir too
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
112 "default_filename" : "index.html"}),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
113 ]))
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
114 log.info("serving on %s" % port)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
115 reactor.run()