Skip to content

Instantly share code, notes, and snippets.

@evantahler
Last active July 26, 2018 19:59
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save evantahler/9755268 to your computer and use it in GitHub Desktop.
Save evantahler/9755268 to your computer and use it in GitHub Desktop.
enttec open dmx + nodejs
#!/usr/bin/env node
// A simple DMX example which will turn all the lights on and off every second
// You can use this as a fork within another application as well (cluster-awareness)
////////////
// dmx.js //
////////////
var ftdi = require('ftdi');
var cluster = require('cluster');
var settings = {
// 'baudrate': 250000,
// 'baudrate': 250000 / 4,
'baudrate': 115200 / 2,
'databits': 8,
'stopbits': 2,
'parity' : 'none',
};
var sleepTime = 0.026 * 1000;
var device;
var universe = new Buffer(512, 'binary');
var on = false;
var loopTimer;
function writeLoop(){
clearTimeout(loopTimer);
// device.write([]);
setTimeout(function(){
device.write([0x00]);
device.write(universe);
if(cluster.isMaster){ process.stdout.write("."); }
loopTimer = setTimeout(writeLoop, sleepTime);
}, 88);
}
function set(k,v){
universe[parseInt(k) - 1] = parseInt(v);
console.log('[DMX] ' + k + ':' + v);
}
function setAll(v){
var i = 0;
while(i < universe.length){
universe[i] = parseInt(v);
i++;
}
console.log('[DMX] all:' + v);
}
var flop = function(){
if(on === true){
setAll(0);
}else{
setAll(250);
}
on = !on;
};
////////
// GO //
////////
setAll(0);
ftdi.find(function(err, devices){
console.log(devices);
device = new ftdi.FtdiDevice(devices[0]);
device.open(settings, function(){
writeLoop();
if(cluster.isMaster){
setInterval(flop, 500);
}else{
process.on('message', function(message){
message = JSON.parse(message);
if(message.all === true){
setAll(message.power);
}else{
set(message.channel, message.power);
}
});
}
});
});
@evantahler
Copy link
Author

@evantahler
Copy link
Author

@mcallegari I believe you are a DMX expert from your qlcplus project. Any advice?

@evantahler
Copy link
Author

Solved! Code updated above with a simple CLI tool to set channels on your DMX universe

@jondashkyle
Copy link

Oh man, timing couldn't be any better on this!

@coolaj86
Copy link

coolaj86 commented May 6, 2015

Sweet! Now I can go buy one. W00T!!!

@evantahler
Copy link
Author

Updated. Note: this method seems to only work for odd-numbered channels. Also, the ftdi package only compiles for node v0.10

@hugohil
Copy link

hugohil commented Feb 2, 2016

Thank you very much for this script, it's awesome ! 👍

I have a tip for future users: on osx 10.11.3, I had to do sudo kextunload -bundle-id com.FTDI.driver.FTDIUSBSerialDriver to resolve the FT_DEVICE_NOT_OPENED error. (And do not forget to ``sudo kextload -bundle-id com.FTDI.driver.FTDIUSBSerialDriver` when you're done)

@Keyes
Copy link

Keyes commented Nov 9, 2017

Do you have an updated version of the above code or maybe a better solution? I'm at the same problem as you two years ago: I can only control odd numbered channels (and to be honest: I have not a single clue why)

@fichrist
Copy link

Hi, any updates on the odd numbered channels?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment