diff --git a/light9/collector/collector.py b/light9/collector/collector.py
--- a/light9/collector/collector.py
+++ b/light9/collector/collector.py
@@ -157,9 +157,9 @@ class Collector:
del self.lastRequest[clientSession]
# todo: move to settings.py
- def resolvedSettingsDict(self, settingsList: List[DeviceSetting]) -> Dict[Tuple[DeviceUri, DeviceAttr], VTUnion]:
+ def _resolvedSettingsDict(self, settingsList: DeviceSettings) -> Dict[Tuple[DeviceUri, DeviceAttr], VTUnion]:
out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {}
- for devUri, devAttr, val in settingsList:
+ for devUri, devAttr, val in settingsList.asList():
if (devUri, devAttr) in out:
existingVal = out[(devUri, devAttr)]
out[(devUri, devAttr)] = resolve(self._deviceType[devUri], devAttr, [existingVal, val])
diff --git a/light9/collector/service.py b/light9/collector/service.py
--- a/light9/collector/service.py
+++ b/light9/collector/service.py
@@ -57,7 +57,7 @@ class Updates(WebSocketEndpoint, UiListe
async def PutAttrs(collector: Collector, request):
with STAT_SETATTR.time():
- client, clientSession, settings, sendTime = parseJsonMessage(await request.body())
+ client, clientSession, settings, sendTime = parseJsonMessage(collector.graph, await request.body())
collector.setAttrs(client, clientSession, settings, sendTime)
return Response('', status_code=202)
diff --git a/light9/effect/effecteval.py b/light9/effect/effecteval.py
--- a/light9/effect/effecteval.py
+++ b/light9/effect/effecteval.py
@@ -12,7 +12,7 @@ from rdflib import Literal, Namespace
from webcolors import hex_to_rgb, rgb_to_hex
from light9.effect.scale import scale
-from light9.effect.settings import BareEffectSettings, EffectSettings
+from light9.effect.settings import BareEffectSettings, DeviceSettings, EffectSettings
from light9.effect.simple_outputs import SimpleOutputs
from light9.namespaces import DEV, L9
from light9.newtypes import (DeviceAttr, DeviceUri, EffectAttr, EffectClass, VTUnion)
@@ -80,19 +80,21 @@ class EffectEval:
effect: EffectClass
simpleOutputs: SimpleOutputs
- def outputFromEffect(self, effectSettings: BareEffectSettings, songTime: float, noteTime: float) -> Tuple[EffectSettings, Dict]:
+ def outputFromEffect(self, effectSettings: BareEffectSettings, songTime: float, noteTime: float) -> Tuple[DeviceSettings, Dict]:
"""
From effect attr settings, like strength=0.75, to output device
settings like light1/bright=0.72;light2/bright=0.78. This runs
the effect code.
"""
+ # todo: what does the next comment line mean?
# both callers need to apply note overrides
+
strength = float(effectSettings.s[EffectAttr(L9['strength'])])
if strength <= 0:
- return EffectSettings(self.graph, []), {'zero': True}
+ return DeviceSettings(self.graph, []), {'zero': True}
report = {}
- out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {} # (dev, attr): value
+ out: Dict[Tuple[DeviceUri, DeviceAttr], VTUnion] = {}
out.update(self.simpleOutputs.values(self.effect, strength, effectSettings.s.get(EffectAttr(L9['colorScale']), None)))
@@ -106,7 +108,7 @@ class EffectEval:
out.update(func(effectSettings, strength, songTime, noteTime))
outList = [(d, a, v) for (d, a), v in out.items()]
- return EffectSettings(self.graph, outList), report
+ return DeviceSettings(self.graph, outList), report
def effect_Curtain(effectSettings, strength, songTime, noteTime):
diff --git a/light9/effect/effecteval_test.py b/light9/effect/effecteval_test.py
new file mode 100644
--- /dev/null
+++ b/light9/effect/effecteval_test.py
@@ -0,0 +1,38 @@
+import time
+import unittest
+
+from freezegun import freeze_time
+from light9.effect.effecteval import EffectEval
+from light9.effect.settings import BareEffectSettings, DeviceSettings, EffectSettings
+from light9.effect.simple_outputs import SimpleOutputs
+from rdflib import Namespace
+
+from light9.collector.collector import Collector
+from light9.collector.output import Output
+from light9.collector.weblisteners import WebListeners
+from light9.mock_syncedgraph import MockSyncedGraph
+from light9.namespaces import DEV, L9
+from light9.newtypes import (ClientSessionType, ClientType, DeviceAttr, DeviceUri, EffectAttr, EffectClass, HexColor, UnixTime)
+
+PREFIX = '''
+ @prefix : .
+ @prefix dev: .
+'''
+
+THEATER = '''
+
+ :effectClass1 a :EffectClass .
+#add light to here
+'''
+effectClass1 = EffectClass(L9['effectClass1'])
+
+
+class TestEffectEval:
+
+ def test_scalesColors(self):
+ g = MockSyncedGraph(THEATER)
+ so = SimpleOutputs(g)
+ ee = EffectEval(g, effectClass1, so)
+ s = BareEffectSettings(s={EffectAttr(L9['strength']): 0.5})
+ ds,report = ee.outputFromEffect(s, songTime=0, noteTime=0)
+ assert ds == DeviceSettings(g, [(DeviceUri(L9['light1']), DeviceAttr(L9['color']), HexColor('#888888'))])