# HG changeset patch # User drewp@bigasterisk.com # Date 2023-05-22 08:00:47 # Node ID 03d2f8c50a34efb9500d10efd217e666cab4a34f # Parent e5fceabc69099722334c32d49e63d509945c87fb type fixes diff --git a/light9/effect/simple_outputs.py b/light9/effect/simple_outputs.py --- a/light9/effect/simple_outputs.py +++ b/light9/effect/simple_outputs.py @@ -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 @@ class SimpleOutputs: """ 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 @@ class SimpleOutputs: 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