changeset 1372:f427801da9f6

collector properly merges repeated attr settings in the same message Ignore-this: a03dcc65eb0d9300cecf3153cd2a58d3
author Drew Perttula <drewp@bigasterisk.com>
date Tue, 07 Jun 2016 10:51:23 +0000
parents 6c2d78dabb8b
children ba6fd5eaa0cf
files bin/collector light9/collector/collector.py light9/collector/collector_test.py
diffstat 3 files changed, 34 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/bin/collector	Tue Jun 07 10:50:35 2016 +0000
+++ b/bin/collector	Tue Jun 07 10:51:23 2016 +0000
@@ -7,6 +7,7 @@
 import json
 import logging
 import klein
+import optparse
 from greplin import scales
 from greplin.scales.twistedweb import StatsResource
 
@@ -75,8 +76,11 @@
     
     
 def main():
-    log.setLevel(logging.DEBUG)
-
+    parser = optparse.OptionParser()
+    parser.add_option("-v", "--verbose", action="store_true",
+                      help="logging.DEBUG")
+    (options, args) = parser.parse_args()
+    log.setLevel(logging.DEBUG if options.verbose else logging.INFO)
 
     graph = SyncedGraph(networking.rdfdb.url, "collector")
 
--- a/light9/collector/collector.py	Tue Jun 07 10:50:35 2016 +0000
+++ b/light9/collector/collector.py	Tue Jun 07 10:51:23 2016 +0000
@@ -61,6 +61,15 @@
         for c in staleClients:
             del self.lastRequest[c]
 
+    def resolvedSettingsDict(self, settingsList):
+        out = {}
+        for d, a, v in settingsList:
+            if (d, a) in out:
+                out[(d, a)] = resolve(d, a, [out[(d, a)], v])
+            else:
+                out[(d, a)] = v
+        return out
+
     def setAttrs(self, client, clientSession, settings):
         """
         settings is a list of (device, attr, value). These attrs are
@@ -80,14 +89,13 @@
                 prevClientSettings = {}
         else:
             prevClientSettings = {}
-        for d, a, v in settings:
-            prevClientSettings[(d, a)] = v
+        prevClientSettings.update(self.resolvedSettingsDict(settings))
         self.lastRequest[client] = (clientSession, now, prevClientSettings)
 
 
         deviceAttrs = {} # device: {attr: value}
-        for _, _, settings in self.lastRequest.itervalues():
-            for (device, attr), value in settings.iteritems():
+        for _, _, lastSettings in self.lastRequest.itervalues():
+            for (device, attr), value in lastSettings.iteritems():
                 attrs = deviceAttrs.setdefault(device, {})
                 if attr in attrs:
                     value = resolve(device, attr, [attrs[attr], value])
--- a/light9/collector/collector_test.py	Tue Jun 07 10:50:35 2016 +0000
+++ b/light9/collector/collector_test.py	Tue Jun 07 10:51:23 2016 +0000
@@ -195,3 +195,19 @@
 
         self.assertEqual([[0, 255, 0, 215], 'flush'], self.udmx.updates)
         self.assertEqual([[127], 'flush', [255], 'flush', [255], 'flush'], self.dmx0.updates)
+
+    def testRepeatedAttributesInOneRequestGetResolved(self):
+        c = Collector(self.config, outputs=[self.dmx0, self.udmx])
+        
+        c.setAttrs('client1', 'sess1', [
+            (DEV['inst1'], L9['brightness'], .5),
+            (DEV['inst1'], L9['brightness'], .3),
+        ])
+        self.assertEqual([[127], 'flush'], self.dmx0.updates)
+
+        c.setAttrs('client1', 'sess1', [
+            (DEV['inst1'], L9['brightness'], .3),
+            (DEV['inst1'], L9['brightness'], .5),
+        ])
+        self.assertEqual([[127], 'flush', [127], 'flush'], self.dmx0.updates)
+