changeset 2201:03d2f8c50a34

type fixes
author drewp@bigasterisk.com
date Mon, 22 May 2023 01:00:47 -0700
parents e5fceabc6909
children 54f4f5158ddf
files light9/effect/simple_outputs.py
diffstat 1 files changed, 13 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/light9/effect/simple_outputs.py	Mon May 22 00:59:44 2023 -0700
+++ b/light9/effect/simple_outputs.py	Mon May 22 01:00:47 2023 -0700
@@ -1,6 +1,7 @@
 import logging
 import traceback
-from typing import Any, Dict, List, Tuple
+from typing import Any, Dict, List, Tuple, cast
+from light9.newtypes import DeviceAttr, DeviceUri, EffectUri, VTUnion
 from light9.typedgraph import typedValue
 
 from rdflib import URIRef
@@ -15,28 +16,29 @@
     """
     Watches graph for effects that are just fading output attrs.
     Call `values` to get (dev,attr):value settings.
+
+    The alternative to 'simple' is 'custom code' (see effecteval.py)
     """
 
     def __init__(self, graph):
         self.graph = graph
 
         # effect : [(dev, attr, value, isScaled)]
-        self.effectOutputs: Dict[URIRef, List[Tuple[URIRef, URIRef, Any, bool]]] = {}
+        self.effectOutputs: Dict[EffectUri, List[Tuple[DeviceUri, DeviceAttr, VTUnion, bool]]] = {}
 
         self.graph.addHandler(self.updateEffectsFromGraph)
 
     def updateEffectsFromGraph(self):
-        self.effectOutputs = {}
+        self.effectOutputs.clear()
         for effect in self.graph.subjects(RDF.type, L9['Effect']):
             log.debug(f' {effect=}')
-            settings = []
+            settings:List[Tuple[DeviceUri, DeviceAttr, VTUnion, bool]] = []
             for setting in self.graph.objects(effect, L9['setting']):
-                settingValues = dict(self.graph.predicate_objects(setting))
                 try:
-                    d = settingValues.get(L9['device'], None)
-                    a = settingValues.get(L9['deviceAttr'], None)
-                    v = settingValues.get(L9['value'], None)
-                    sv = settingValues.get(L9['scaledValue'], None)
+                    d = typedValue(DeviceUri, self.graph, setting, L9['device'])
+                    a = typedValue(DeviceAttr, self.graph, setting, L9['deviceAttr'])
+                    v = typedValue(VTUnion | None, self.graph, setting, L9['value'])
+                    sv = typedValue(VTUnion|None, self.graph, setting, L9['scaledValue'])
                     if not (bool(v) ^ bool(sv)):
                         raise NotImplementedError('no value for %s' % setting)
                     if d is None:
@@ -47,7 +49,8 @@
                     traceback.print_exc()
                     continue
 
-                settings.append((d, a, v if v is not None else sv, bool(sv)))
+                settingValue = cast(VTUnion, v if v is not None else sv)
+                settings.append((d, a, settingValue, bool(sv)))
                 log.debug(f'   effect {effect} has {settings=}')
             if settings:
                 self.effectOutputs[effect] = settings