Mercurial > code > home > repos > homeauto
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 |
rev | line source |
---|---|
862 | 1 """ |
2 for raspberry pi screen. | |
3 B2G_HOMESCREEN=http://10.1.0.1:9102 b2g/b2g --screen=700x480 | |
4 and then fix the window with this: | |
5 echo "window.resizeTo(702,480)" | nc localhost 9999 | |
6 """ | |
866
a99b4d5afb83
use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents:
865
diff
changeset
|
7 import json, sys, time |
862 | 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 | 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 | 18 CV = Namespace("http://bigasterisk.com/checkvist/v1#") |
19 EV = Namespace("http://bigasterisk.com/event#") | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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() |