Mercurial > code > home > repos > homeauto
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 |
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 |
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 | 21 CV = Namespace("http://bigasterisk.com/checkvist/v1#") |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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() |