diff --git a/light9/collector/device.py b/light9/collector/device.py
--- a/light9/collector/device.py
+++ b/light9/collector/device.py
@@ -4,6 +4,8 @@ import math
from light9.namespaces import L9, RDF, DEV
from rdflib import Literal
from webcolors import hex_to_rgb, rgb_to_hex
+from colormath.color_objects import sRGBColor, CMYColor
+import colormath.color_conversions
log = logging.getLogger('device')
@@ -33,7 +35,7 @@ def clamp255(x):
return min(255, max(0, x))
def _8bit(f):
- if not isinstance(f, float):
+ if not isinstance(f, (int, float)):
raise TypeError(repr(f))
return clamp255(int(f * 255))
@@ -61,10 +63,28 @@ def toOutputAttrs(deviceType, deviceAttr
if out is None:
return default
return float(out.toPython())
+
+ def rgbAttr(attr):
+ color = deviceAttrSettings.get(attr, '#000000')
+ r, g, b = hex_to_rgb(color)
+ return r, g, b
+
+ def cmyAttr(attr):
+ rgb = sRGBColor.new_from_rgb_hex(deviceAttrSettings.get(attr, '#000000'))
+ out = colormath.color_conversions.convert_color(rgb, CMYColor)
+ return (
+ _8bit(out.cmy_c),
+ _8bit(out.cmy_m),
+ _8bit(out.cmy_y))
+
+ def fine16Attr(attr):
+ x = floatAttr(attr)
+ hi = _8bit(x)
+ lo = _8bit((x * 255) % 1.0)
+ return hi, lo
if deviceType == L9['ChauvetColorStrip']:
- color = deviceAttrSettings.get(L9['color'], '#000000')
- r, g, b = hex_to_rgb(color)
+ r, g, b = rgbAttr(L9['color'])
return {
L9['mode']: 215,
L9['red']: r,
@@ -95,5 +115,78 @@ def toOutputAttrs(deviceType, deviceAttr
L9['goboShake']: 0,
L9['goboChoose']: 0,
}
+ elif deviceType == L9['ChauvetHex12']:
+ out = {}
+ out[L9['red']], out[L9['green']], out[L9['blue']] = r, g, b = rgbAttr(L9['color'])
+ out[L9['amber']] = 0
+ out[L9['white']] = min(r, g, b)
+ out[L9['uv']] = _8bit(floatAttr(L9['uv']))
+ return out
+ elif deviceType == L9['MacAura']:
+ out = {
+ L9['shutter']: 22,
+ L9['dimmer']: 255,
+ L9['zoom']: _8bit(floatAttr(L9['zoom'])),
+ L9['fixtureControl']: 0,
+ L9['colorWheel']: 0,
+ L9['colorTemperature']: 128,
+ L9['fx1Select']: 0,
+ L9['fx1Adjust']: 0,
+ L9['fx2Select']: 0,
+ L9['fx2Adjust']: 0,
+ L9['fxSync']: 0,
+ L9['auraShutter']: 22,
+ L9['auraDimmer']: 0,
+ L9['auraColorWheel']: 0,
+ L9['auraRed']: 0,
+ L9['auraGreen']: 0,
+ L9['auraBlue']: 0,
+ }
+ out[L9['pan']], out[L9['panFine']] = fine16Attr(L9['rx'])
+ out[L9['tilt']], out[L9['tiltFine']] = fine16Attr(L9['ry'])
+ out[L9['red']], out[L9['green']], out[L9['blue']] = rgbAttr(L9['color'])
+ out[L9['white']] = 0
+
+ return out
+ elif deviceType == L9['MacQuantum']:
+ out = {
+ L9['dimmerFadeLo']: 0,
+ L9['shutter']: 30, # strobe is in here too: slow @ 50 -> fast @ 200
+ L9['fixtureControl']: 0,
+ L9['fx1Select']: 0,
+ L9['fx1Adjust']: 0,
+ L9['fx2Select']: 0,
+ L9['fx2Adjust']: 0,
+ L9['fxSync']: 0,
+ }
+
+ # note these values are set to 'fade', so they update slowly. Haven't found where to turn that off.
+ out[L9['cyan']], out[L9['magenta']], out[L9['yellow']] = cmyAttr(L9['color'])
+
+ out[L9['focusHi']], out[L9['focusLo']] = fine16Attr(L9['focus'])
+ out[L9['panHi']], out[L9['panLo']] = fine16Attr(L9['rx'])
+ out[L9['tiltHi']], out[L9['tiltLo']] = fine16Attr(L9['ry'])
+ out[L9['zoomHi']], out[L9['zoomLo']] = fine16Attr(L9['zoom'])
+ out[L9['dimmerFadeHi']] = 0 if deviceAttrSettings.get(L9['color'], '#000000') == '#000000' else 255
+
+ out[L9['goboChoice']] = {
+ L9['open']: 0,
+ L9['spider']: 6,
+ L9['windmill']: 11,
+ L9['limbo']: 16,
+ L9['brush']: 21,
+ L9['whirlpool']: 26,
+ L9['stars']: 31,
+ }[deviceAttrSettings.get(L9['gobo'], L9['open'])]
+
+ out.update( {
+ L9['colorWheel']: 0,
+ L9['goboSpeedHi']: 0,
+ L9['goboSpeedLo']: 0,
+ L9['goboStaticRotate']: 0,
+ L9['prismRotation']: _8bit(floatAttr(L9['prism'])),
+ L9['iris']: _8bit(floatAttr(L9['iris']) * (200/255)),
+ })
+ return out
else:
raise NotImplementedError('device %r' % deviceType)
diff --git a/requirements.txt b/requirements.txt
--- a/requirements.txt
+++ b/requirements.txt
@@ -31,4 +31,5 @@ txzmq==0.7.4
pyusb==1.0.0
coverage==4.1
klein==15.3.1
-git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales
\ No newline at end of file
+git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales
+colormath==2.1.1
diff --git a/show/dance2016/deviceClass.n3 b/show/dance2016/deviceClass.n3
--- a/show/dance2016/deviceClass.n3
+++ b/show/dance2016/deviceClass.n3
@@ -1,11 +1,16 @@
@prefix : .
@prefix rdfs: .
-:color a :DeviceAttr; :dataType :color .
-:rx a :DeviceAttr; :dataType :angle .
-:ry a :DeviceAttr; :dataType :angle .
-:uv a :DeviceAttr; :dataType :scalar .
-:brightness a :DeviceAttr; :dataType :scalar .
+:color a :DeviceAttr; :dataType :color .
+:rx a :DeviceAttr; :dataType :angle .
+:ry a :DeviceAttr; :dataType :angle .
+:uv a :DeviceAttr; :dataType :scalar .
+:brightness a :DeviceAttr; :dataType :scalar .
+:zoom a :DeviceAttr; :dataType :scalar ; rdfs:comment "maybe a 'wide to narrow' type" .
+:focus a :DeviceAttr; :dataType :scalar .
+:iris a :DeviceAttr; :dataType :scalar .
+:quantumGoboChoice a :DeviceAttr; :dataType :choice;
+ :choice :open, :spider, :windmill, :limbo, :brush, :whirlpool, :stars .
:SimpleDimmer a :DeviceClass;
:deviceAttr :brightness;
@@ -51,6 +56,7 @@
:MacAura a :DeviceClass;
:docs ;
rdfs:comment "note- manual counts dmx from 1; :dmxOffset is from 0";
+ :deviceAttr :color, :rx, :ry, :zoom;
:attr
[ :dmxOffset 0 ; :outputAttr :shutter ], # use 22
[ :dmxOffset 1 ; :outputAttr :dimmer ],
@@ -80,6 +86,7 @@
:MacQuantum a :DeviceClass;
:docs ;
+ :deviceAttr :color, :rx, :ry, :zoom, :focus, :iris, :quantumGoboChoice;
:attr
[ :dmxOffset 0; :outputAttr :shutter ; rdfs:comment "use 30" ],
[ :dmxOffset 1; :outputAttr :dimmerFadeHi ],
diff --git a/show/dance2016/theaterLightConfig.n3 b/show/dance2016/theaterLightConfig.n3
--- a/show/dance2016/theaterLightConfig.n3
+++ b/show/dance2016/theaterLightConfig.n3
@@ -1,18 +1,72 @@
@prefix : .
@prefix rdfs: .
@prefix dev: .
-@prefix udmx: .
-@prefix dmx0: .
+@prefix udmxB: .
+@prefix dmxA: .
+
+#dev:colorStrip a :ChauvetColorStrip; :dmxUniverse dmxA:; :dmxBase 87 .
+#dev:moving1 a :Mini15; rdfs:label "moving1"; :dmxUniverse udmxB:; :dmxBase 5 .
+
+dev:houseSide a :SimpleDimmer; rdfs:label "house-side"; :dmxUniverse dmxA:; :dmxBase 68 .
+dev:house1 a :SimpleDimmer; rdfs:label "house1"; :dmxUniverse dmxA:; :dmxBase 69 .
+dev:house4 a :SimpleDimmer; rdfs:label "house4"; :dmxUniverse dmxA:; :dmxBase 70 .
+dev:house3 a :SimpleDimmer; rdfs:label "house3"; :dmxUniverse dmxA:; :dmxBase 71 .
+dev:house2 a :SimpleDimmer; rdfs:label "house2"; :dmxUniverse dmxA:; :dmxBase 72 .
-dev:colorStrip a :ChauvetColorStrip; :dmxUniverse dmx0:; :dmxBase 87 .
+dev:f1 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 4 .
+dev:f2 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 8 .
+dev:f3 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 10 .
+
+dev:cycR a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 42 .
+dev:cycL a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 44 .
+
+dev:q1 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 325 .
+dev:q2 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 352 .
+dev:q3 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 379 .
+
+dev:aura1 a :MacAura; :dmxUniverse udmxB:; :dmxBase 406 .
+dev:aura2 a :MacAura; :dmxUniverse udmxB:; :dmxBase 420 .
+dev:aura3 a :MacAura; :dmxUniverse udmxB:; :dmxBase 434 .
+dev:aura4 a :MacAura; :dmxUniverse udmxB:; :dmxBase 448 .
+dev:aura5 a :MacAura; :dmxUniverse udmxB:; :dmxBase 462 .
+dev:auraStage a :MacAura; :dmxUniverse udmxB:; :dmxBase 476; rdfs:comment "rx=.5 ry<.45" .
-dev:moving1 a :Mini15; rdfs:label "moving1"; :dmxUniverse udmx:; :dmxBase 5 .
-
-dev:cyc a :SimpleDimmer; rdfs:label "cyc"; :dmxUniverse udmx:; :dmxBase 40 .
+dev:hexBacklight1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 241 .
+dev:hexBacklight2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 247 .
+dev:hexBacklight3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 253 .
+dev:hexBacklight4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 259 .
+dev:hexBacklight5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 265 .
+dev:hexDown2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 157 .
+dev:hexDown3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 193 .
+dev:hexDown4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 169 .
+dev:hexDown5Edge a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 175 .
+dev:hexLip1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 121 .
+dev:hexLip2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 127 .
+dev:hexLip3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 133 .
+dev:hexLip4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 139 .
+dev:hexLip5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 145 .
+dev:hexLow3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 223 .
+dev:hexLow5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 229 .
+dev:hexLowBacklight1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 211 .
+dev:hexLowBacklight6 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 235 .
+dev:hexSlant a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 319 .
+dev:hexUpCenter a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 313 .
+dev:hexPostL1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 289 .
+dev:hexPostL2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 295 .
+dev:hexPostL3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 301 .
+dev:hexPostR1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 271 .
+dev:hexPostR2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 277 .
+dev:hexPostR3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 283 .
+dev:hexVeryLow1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 151 .
+dev:hexVeryLow2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 187 .
+dev:hexVeryLow22 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 217 .
+dev:hexVeryLow3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 163 .
+dev:hexVeryLow4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 199 .
+dev:hexVeryLow5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 205 .
-# [ :name "cyc-right"; :output dmx:c42 ] .
-# [ :name "cyc-mid"; :output dmx:c43 ] .
-# [ :name "cyc-left"; :output dmx:c44 ] .
+
+
+
# [ :name "oran1"; :output dmx:c21 ] .
# [ :name "oran2"; :output dmx:c25 ] .
# [ :name "oran3"; :output dmx:c29 ] .