annotate service/wallscreen/wallscreen.py @ 1143:d1bc88f67969

RgbPixelsAnimation and docker build updates Ignore-this: c79e4a64bb5ad8683aa837839e79785b darcs-hash:bcc0201b2aaf3a1f1f689a6437eef8298970c58a
author drewp <drewp@bigasterisk.com>
date Sat, 03 Mar 2018 18:09:34 -0800
parents c6e6f717fabe
children
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
918
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
12 from rdflib import Graph, ConjunctiveGraph, 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
918
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
18 sys.path.append("../reasoning")
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
19 from rdflibtrig import addTrig
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
20
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 CV = Namespace("http://bigasterisk.com/checkvist/v1#")
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22 EV = Namespace("http://bigasterisk.com/event#")
918
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
23 MAP = Namespace("http://bigasterisk.com/map#")
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
25 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
26 def get(self):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
27 out = []
890
fac77779980c turn on checkvist reader on wallscreen
drewp <drewp@bigasterisk.com>
parents: 866
diff changeset
28 if 1:
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
29 g = Graph()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
30 g.parse("http://bang:9103/graph", format="n3")
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
32 tasks = [] # (pos, task)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
33 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
34 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
35 continue
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
36 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
37 tasks.sort()
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
39 def appendTree(t, depth):
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
40 out.append(dict(
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
41 uri=t,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
42 depth=depth,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
43 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
44 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
45 ))
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
46 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
47 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
48 continue
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
49 appendTree(sub, depth+1)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
51 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
52 appendTree(t, depth=0)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
54 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
55 g = Graph()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
56 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
57 byDay = {}
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
58 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
59 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
60 s = parse(start)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
61 d = s.date().isoformat()
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
62 byDay.setdefault(d, {'dayEvents':[],
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
63 'timeEvents':[]})[
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
64 '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
65 '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
66 'start' : start,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
67 'date' : s.date().isoformat(),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
68 'time' : s.time().isoformat()[:-3],
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
69 })
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
70 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
71 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
72 d.update(v)
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
73 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
74 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
75 events.append(d)
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
77 self.write(json.dumps({'tasks':out, 'events' : events}))
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78
918
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
79 class ContentMap(PrettyErrorHandler, cyclone.web.RequestHandler):
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
80 def get(self):
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
81 g = ConjunctiveGraph()
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
82 addTrig(g, "http://bang:9099/graph")
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
83 maxMeters = 65000
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
84 pts = []
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
85 print "loaded", len(g)
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
86 for s,p,o in g.triples((None, MAP['distanceToHomeM'], None)):
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
87 pts.append(dict(who=s,
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
88 frac=float(o) / maxMeters,
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
89 distanceToHomeM=o,
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
90 displayMilesDistance="%.1f miles" %
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
91 (float(o) * 0.000621371)))
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
92 self.write(json.dumps({'pts': pts}))
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
93
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
94 @inlineCallbacks
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
95 def pushThermostat():
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
96 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
97 [c.sendMessage(f) for c in liveClients]
862
8e81ea96f41e move from pimscreen/
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
99 class RefreshTemperature(PrettyErrorHandler, cyclone.web.RequestHandler):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
100 def post(self):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
101 return pushThermostat()
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 liveClients = set()
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
104
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
105 class Live(cyclone.websocket.WebSocketHandler):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
106 def connectionMade(self, *args, **kwargs):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
107 log.info("websocket opened")
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
108 liveClients.add(self)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
109
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
110 def connectionLost(self, reason):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
111 log.info("websocket closed")
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
112 liveClients.remove(self)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
113
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
114 def messageReceived(self, message):
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
115 log.info("got message %s" % message)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
116 self.sendMessage(message)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
117
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
118 if __name__ == '__main__':
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
119 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
120 #twlog.startLogging(sys.stdout)
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
121
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
122 task.LoopingCall(pushThermostat).start(1)
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
123
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
124 port = 9102
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
125 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
126 (r'/content', Content),
918
c6e6f717fabe wallscreen show map of people and their distances from home
drewp <drewp@bigasterisk.com>
parents: 890
diff changeset
127 (r'/content/map', ContentMap),
866
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
128 (r'/live', Live),
a99b4d5afb83 use websockets for temperature update
drewp <drewp@bigasterisk.com>
parents: 865
diff changeset
129 (r'/refreshTemperature', RefreshTemperature),
865
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
130 (r'/(.*)', cyclone.web.StaticFileHandler,
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
131 {"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
132 "default_filename" : "index.html"}),
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
133 ]))
db3e0510ab49 wallscreen switch to html5 and cyclone. add temporary temperature poller
drewp <drewp@bigasterisk.com>
parents: 862
diff changeset
134 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
135 reactor.run()