a lot of fixes
diff --git a/wally/timeseries.py b/wally/timeseries.py
new file mode 100644
index 0000000..d322fff
--- /dev/null
+++ b/wally/timeseries.py
@@ -0,0 +1,61 @@
+import array
+import threading
+
+
+class SensorDatastore(object):
+    def __init__(self, stime=None):
+        self.lock = threading.Lock()
+        self.stime = stime
+
+        self.min_size = 60 * 60
+        self.max_size = 60 * 61
+
+        self.data = {
+            'testnodes:io': array.array("B"),
+            'testnodes:cpu': array.array("B"),
+        }
+
+    def get_values(self, name, start, end):
+        assert end >= start
+
+        if end == start:
+            return []
+
+        with self.lock:
+            curr_arr = self.data[name]
+            if self.stime is None:
+                return []
+
+            sidx = start - self.stime
+            eidx = end - self.stime
+
+            if sidx < 0 and eidx < 0:
+                return [0] * (end - start)
+            elif sidx < 0:
+                return [0] * (-sidx) + curr_arr[:eidx]
+            return curr_arr[sidx:eidx]
+
+    def update_values(self, data_time, vals, add=False):
+        with self.lock:
+            if self.stime is None:
+                self.stime = data_time
+
+            for name, value in vals.items():
+                curr_arr = self.data.setdefault(name, array.array("H"))
+                curr_end_time = len(curr_arr) + self.stime
+
+                dtime = data_time - curr_end_time
+
+                if dtime > 0:
+                    curr_arr.extend([0] * dtime)
+                    curr_arr.append(value)
+                elif dtime == 0:
+                    curr_arr.append(value)
+                else:
+                    # dtime < 0
+                    sindex = len(curr_arr) + dtime
+                    if sindex > 0:
+                        if add:
+                            curr_arr[sindex] += value
+                        else:
+                            curr_arr[sindex].append(value)