diff --git a/light9/collector/collector.py b/light9/collector/collector.py --- a/light9/collector/collector.py +++ b/light9/collector/collector.py @@ -37,8 +37,10 @@ def outputMap( except Exception: log.warn('dev %r :dmxUniverse %r', dev, universe) raise - dmxBase = DmxIndex( - cast(Literal, graph.value(dev, L9['dmxBase'])).toPython()) + base = graph.value(dev, L9['dmxBase']) + if base is None: + raise ValueError('no :dmxBase for %s' % dev) + dmxBase = DmxIndex(cast(Literal, base).toPython()) for row in graph.objects(dc, L9['attr']): outputAttr = cast(OutputAttr, graph.value(row, L9['outputAttr'])) diff --git a/light9/collector/output.py b/light9/collector/output.py --- a/light9/collector/output.py +++ b/light9/collector/output.py @@ -136,6 +136,9 @@ class Udmx(BackgroundLoopOutput): self._writeOverflow += 1 return + if e.errno == 19: # no such dev; usb hw restarted + reactor.crash() + msg = 'usb: sending %s bytes to %r; error %r' % (len(buf), self.uri, e) log.warn(msg)