Allow different timestamps (zones or dates) between client and server while keeping the temperature graph working

The server now sends the current server time with each temperature update as well as the initial temperature data, allowing the client to translate the timestamps contained in the temperature logs to its local timescale.

 Followup to commit f19d0f0360 which caused a problem with large deviations between server and client time.
This commit is contained in:
Gina Häußge 2015-05-06 17:23:01 +02:00
parent 9ecd59c6e1
commit d43bc2e17e
2 changed files with 16 additions and 11 deletions

View file

@ -8,6 +8,7 @@ __copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms
import logging
import threading
import sockjs.tornado
import time
import octoprint.timelapse
import octoprint.server
@ -98,6 +99,7 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection, octoprint.printer.
busy_files.append(dict(origin=data["job"]["file"]["origin"], name=data["job"]["file"]["name"]))
data.update({
"serverTime": time.time(),
"temps": temperatures,
"logs": logs,
"messages": messages,
@ -106,7 +108,9 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection, octoprint.printer.
self._emit("current", data)
def on_printer_send_initial_data(self, data):
self._emit("history", data)
data_to_send = dict(data)
data_to_send["serverTime"] = time.time()
self._emit("history", data_to_send)
def sendEvent(self, type, payload=None):
self._emit("event", {"type": type, "payload": payload})

View file

@ -117,13 +117,13 @@ $(function() {
self.fromCurrentData = function(data) {
self._processStateData(data.state);
self._processTemperatureUpdateData(data.temps);
self._processTemperatureUpdateData(data.serverTime, data.temps);
self._processOffsetData(data.offsets);
};
self.fromHistoryData = function(data) {
self._processStateData(data.state);
self._processTemperatureHistoryData(data.temps);
self._processTemperatureHistoryData(data.serverTime, data.temps);
self._processOffsetData(data.offsets);
};
@ -137,7 +137,7 @@ $(function() {
self.isLoading(data.flags.loading);
};
self._processTemperatureUpdateData = function(data) {
self._processTemperatureUpdateData = function(serverTime, data) {
if (data.length == 0)
return;
@ -161,12 +161,12 @@ $(function() {
if (!CONFIG_TEMPERATURE_GRAPH) return;
self.temperatures = self._processTemperatureData(data, self.temperatures);
self.temperatures = self._processTemperatureData(serverTime, data, self.temperatures);
self.updatePlot();
};
self._processTemperatureHistoryData = function(data) {
self.temperatures = self._processTemperatureData(data);
self._processTemperatureHistoryData = function(serverTime, data) {
self.temperatures = self._processTemperatureData(serverTime, data);
self.updatePlot();
};
@ -183,8 +183,9 @@ $(function() {
}
};
self._processTemperatureData = function(data, result) {
self._processTemperatureData = function(serverTime, data, result) {
var types = _.keys(self.heaterOptions());
var clientTime = Date.now();
// make sure result is properly initialized
if (!result) {
@ -201,7 +202,8 @@ $(function() {
// convert data
_.each(data, function(d) {
var time = d.time * 1000;
var timeDiff = (serverTime - d.time) * 1000;
var time = clientTime - timeDiff;
_.each(types, function(type) {
if (!d[type]) return;
result[type].actual.push([time, d[type].actual]);
@ -211,9 +213,8 @@ $(function() {
})
});
var now = Date.now();
var filterOld = function(item) {
return item[0] >= now - self.temperature_cutoff() * 60 * 1000;
return item[0] >= clientTime - self.temperature_cutoff() * 60 * 1000;
};
_.each(_.keys(self.heaterOptions()), function(d) {