# HG changeset patch # User drewp # Date 1360532495 28800 # Node ID a99b4d5afb835dd76539be43c759898e9c9ff727 # Parent db3e0510ab4900dc74438cb7ca135f165f602043 use websockets for temperature update Ignore-this: 558ad53cf5b4b0c013041db555fbb458 darcs-hash:20130210214135-312f9-f69d37d4b9bce7fa6ec0e9c9889b2de90fd26a8f diff -r db3e0510ab49 -r a99b4d5afb83 service/wallscreen/gui.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/wallscreen/gui.js Sun Feb 10 13:41:35 2013 -0800 @@ -0,0 +1,50 @@ +var reloadData; +$(function () { + + setTimeout(function () { + window.resizeTo(702,480); + }, 10000); + + var model = { + requestedF: ko.observable(), + tasks: ko.observableArray([]), + events: ko.observableArray([]), + isToday: function (ev) { + var today = moment().format("YYYY-MM-DD"); + return ev.date == today; + } + }; + reloadData = function() { + $.getJSON("content", function (data) { + model.tasks(data.tasks); + model.events(data.events); + }); + } + setInterval(reloadData, 30*60*1000); + reloadData(); + + function onMessage(d) { + if (d.tempF) { + model.requestedF(d.tempF); + } + } + reconnectingWebSocket("ws://localhost:9102/live", onMessage); + + ko.applyBindings(model); + + if (navigator.userAgent == "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/18.0 Firefox/18.0") { + $(".rot").removeClass("rot"); + } + + function updateClock() { + var now = moment(); + var s = (new Date()).toLocaleTimeString(); + $("#clock").html( + "
"+now.format("dddd")+"
"+ + "
"+now.format("MMM Do")+"
"+ + "
"+now.format("HH:mm")+"
" + ) + } + setInterval(updateClock, 20000) + updateClock(); +}); diff -r db3e0510ab49 -r a99b4d5afb83 service/wallscreen/index.html --- a/service/wallscreen/index.html Sun Feb 10 12:06:17 2013 -0800 +++ b/service/wallscreen/index.html Sun Feb 10 13:41:35 2013 -0800 @@ -1,6 +1,7 @@ + wallscreen @@ -158,64 +165,14 @@
Thermostat at . Use knob to adjust.
+
- - + + diff -r db3e0510ab49 -r a99b4d5afb83 service/wallscreen/wallscreen.py --- a/service/wallscreen/wallscreen.py Sun Feb 10 12:06:17 2013 -0800 +++ b/service/wallscreen/wallscreen.py Sun Feb 10 13:41:35 2013 -0800 @@ -4,9 +4,9 @@ and then fix the window with this: echo "window.resizeTo(702,480)" | nc localhost 9999 """ -import json, sys +import json, sys, time from dateutil.parser import parse -from twisted.internet import reactor +from twisted.internet import reactor, task from twisted.internet.defer import inlineCallbacks import cyclone.web, cyclone.httpclient, cyclone.websocket from rdflib import Graph, URIRef, Namespace, Literal, RDF @@ -72,20 +72,41 @@ self.write(json.dumps({'tasks':out, 'events' : events})) -class Thermostat(PrettyErrorHandler, cyclone.web.RequestHandler): - @inlineCallbacks - def get(self): - self.write((yield cyclone.httpclient.fetch("http://bang:10001/requestedTemperature")).body) +@inlineCallbacks +def pushThermostat(): + f = json.loads((yield cyclone.httpclient.fetch("http://bang:10001/requestedTemperature")).body) + [c.sendMessage(f) for c in liveClients] - +class RefreshTemperature(PrettyErrorHandler, cyclone.web.RequestHandler): + def post(self): + return pushThermostat() + +liveClients = set() + +class Live(cyclone.websocket.WebSocketHandler): + def connectionMade(self, *args, **kwargs): + log.info("websocket opened") + liveClients.add(self) + + def connectionLost(self, reason): + log.info("websocket closed") + liveClients.remove(self) + + def messageReceived(self, message): + log.info("got message %s" % message) + self.sendMessage(message) + if __name__ == '__main__': from twisted.python import log as twlog #twlog.startLogging(sys.stdout) - + + task.LoopingCall(pushThermostat).start(1) + port = 9102 reactor.listenTCP(port, cyclone.web.Application(handlers=[ (r'/content', Content), - (r'/thermostat', Thermostat), + (r'/live', Live), + (r'/refreshTemperature', RefreshTemperature), (r'/(.*)', cyclone.web.StaticFileHandler, {"path" : ".", # security hole- serves this dir too "default_filename" : "index.html"}), diff -r db3e0510ab49 -r a99b4d5afb83 service/wallscreen/websocket.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/wallscreen/websocket.js Sun Feb 10 13:41:35 2013 -0800 @@ -0,0 +1,20 @@ +// from the light9/rdfdb one + +function reconnectingWebSocket(url, onMessage) { + var pong = 0; + function connect() { + var ws = new WebSocket(url); + + ws.onopen = function() { $("#status").text(""); }; + ws.onerror = function(e) { $("#status").text("error: "+e); }; + ws.onclose = function() { + pong = 1 - pong; + $("#status").text("disconnected (retrying "+(pong ? "😼":"😺")+")"); + setTimeout(connect, 2000); + }; + ws.onmessage = function (evt) { + onMessage(JSON.parse(evt.data)); + }; + } + connect(); +}