Merge pull request #26 from spearway/DMXKing
DMXKing ultraDMX Pro support ultra-pro-24ch-rdm device definition Launchd service file
This commit is contained in:
commit
9932101db2
8 changed files with 248 additions and 50 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -13,3 +13,5 @@ results
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
|
.project
|
||||||
|
.com.greenworldsoft.syncfolderspro
|
||||||
|
|
27
com.dmx-web.server.example.plist
Normal file
27
com.dmx-web.server.example.plist
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
<key>KeepAlive</key>
|
||||||
|
<true/>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.dmx-web.server</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/usr/local/bin/dmx-web</string>
|
||||||
|
<string>-c</string>
|
||||||
|
<string>/Library/Server/DMX/dmx-web.json</string>
|
||||||
|
</array>
|
||||||
|
<key>StandardOutPath</key>
|
||||||
|
<string>/Library/Logs/homebridge/dmxlogfile.log</string>
|
||||||
|
<key>StandardErrorPath</key>
|
||||||
|
<string>/Library/Logs/homebridge/dmxlogfile.log</string>
|
||||||
|
<key>EnvironmentVariables</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/usr/local/bin/:$PATH</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
10
devices.js
10
devices.js
|
@ -50,5 +50,15 @@ module.exports = {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'ultra-pro-24ch-rdm': {
|
||||||
|
channels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24' ],
|
||||||
|
ranges: {
|
||||||
|
'dimmer': {
|
||||||
|
'type': 'slider',
|
||||||
|
'min': 0,
|
||||||
|
'max': 255
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,76 +1,143 @@
|
||||||
module.exports = {
|
{
|
||||||
"server": {
|
"server": {
|
||||||
"listen_port": 8080,
|
"listen_port": 8080,
|
||||||
"listen_host": "::",
|
"listen_host": "::",
|
||||||
|
|
||||||
// drop privileges to:
|
"comment1": "On linux drop privileges by adding the following lines: uid: www-data and gid: www-data",
|
||||||
// "uid": "www-data",
|
"comment2": "On Macos uid and gid must be set in the launchd script."
|
||||||
// "gid": "www-data"
|
|
||||||
},
|
},
|
||||||
"presets": [
|
"presets": [
|
||||||
{
|
{
|
||||||
label: "White",
|
"label": "White",
|
||||||
values: {
|
"values": {
|
||||||
'office': { 0:16, 1:255, 2:0, 3:255, 4: 255, 5:255, 15:16, 16:255, 17:0, 18:255, 19: 255, 20:255 }
|
"office": { "0":16, "1":255, "2":0, "3":255, "4": 255, "5":255, "15":16, "16":255, "17":0, "18":255, "19": 255, "20":255 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Natural',
|
"label": "Natural",
|
||||||
values: {
|
"values": {
|
||||||
'office': { 0:16, 1:255, 2:0, 3:255, 4: 190, 5:140, 15:16, 16:255, 17:0, 18:255, 19: 190, 20:140 }
|
"office": { "0":16, "1":255, "2":0, "3":255, "4": 190, "5":140, "15":16, "16":255, "17":0, "18":255, "19": 190, "20":140 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Worklight',
|
"label": "Worklight",
|
||||||
values: {
|
"values": {
|
||||||
'office': { 0:16, 1:130, 2:0, 3:255, 4: 165, 5:0, 15: 1, 16:255, 17:0, 18:255, 19: 190, 20:140, 21:0, 22: 0, 23:0, 24:255, 25: 190, 26:140 }
|
"office": { "0":16, "1":130, "2":0, "3":255, "4": 165, "5":0, "15": 1, "16":255, "17":0, "18":255, "19": 190, "20":140, "21":0, "22": 0, "23":0, "24":255, "25": 190, "26":140 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Chill',
|
"label": "Chill",
|
||||||
values: {
|
"values": {
|
||||||
'office': { 0:16, 1:255, 2:0, 3:255, 4: 39, 5:0, 15: 1, 16:255, 17:0, 18:255, 19: 255, 20:0, 21:0, 22: 0, 23:0, 24:128, 25: 0, 26:255, 31:255, 32: 60 }
|
"office": { "0":16, "1":255, "2":0, "3":255, "4": 39, "5":0, "15": 1, "16":255, "17":0, "18":255, "19": 255, "20":0, "21":0, "22": 0, "23":0, "24":128, "25": 0, "26":255, "31":255, "32": 60 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Cinema',
|
"label": "Cinema",
|
||||||
values: {
|
"values": {
|
||||||
'office': { 0:16, 1:30, 2:0, 3:255, 4: 39, 5:0, 15:0, 31:255, 32:0 }
|
"office": { "0":16, "1":30, "2":0, "3":255, "4": 39, "5":0, "15":0, "31":255, "32":0 }
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
universes: {
|
"universes": {
|
||||||
'office': {
|
"office": {
|
||||||
'output': {
|
"output": {
|
||||||
// 'driver': 'enttec-usb-dmx-pro',
|
"driver": "enttec-usb-dmx-pro",
|
||||||
// 'device': '/dev/cu.usbserial-6AVNHXS8'
|
"device": "/dev/cu.usbserial-6A1KQK87"
|
||||||
'driver': 'null',
|
|
||||||
'device': 0
|
|
||||||
},
|
},
|
||||||
'devices': [
|
"devices": [
|
||||||
{
|
{
|
||||||
'type': 'eurolite-led-bar',
|
"type": "eurolite-led-bar",
|
||||||
'address': 0
|
"address": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type': 'eurolite-led-bar',
|
"type": "eurolite-led-bar",
|
||||||
'address': 15
|
"address": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type': 'showtec-multidim2',
|
"type": "showtec-multidim2",
|
||||||
'address': 31
|
"address": 31
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type': 'stairville-led-par-56',
|
"type": "stairville-led-par-56",
|
||||||
'address': 64
|
"address": 64
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type': 'stairville-led-par-56',
|
"type": "stairville-led-par-56",
|
||||||
'address': 70
|
"address": 70
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type': 'stairville-led-par-56',
|
"type": "stairville-led-par-56",
|
||||||
'address': 76
|
"address": 76
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"bedroom": {
|
||||||
|
"output": {
|
||||||
|
"driver": "dmxking-ultra-dmx-pro",
|
||||||
|
"device": "/dev/cu.usbserial-6AVNHXS8",
|
||||||
|
"options": {
|
||||||
|
"port": "A"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devices": [
|
||||||
|
{
|
||||||
|
"type": "eurolite-led-bar",
|
||||||
|
"address": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "eurolite-led-bar",
|
||||||
|
"address": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "showtec-multidim2",
|
||||||
|
"address": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 64
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 70
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 76
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"livingroom": {
|
||||||
|
"output": {
|
||||||
|
"driver": "dmxking-ultra-dmx-pro",
|
||||||
|
"device": "/dev/cu.usbserial-6AVNHXS8",
|
||||||
|
"options": {
|
||||||
|
"port": "B"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devices": [
|
||||||
|
{
|
||||||
|
"type": "eurolite-led-bar",
|
||||||
|
"address": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "eurolite-led-bar",
|
||||||
|
"address": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "showtec-multidim2",
|
||||||
|
"address": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 64
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 70
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "stairville-led-par-56",
|
||||||
|
"address": 76
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,8 @@ function DMXWeb() {
|
||||||
dmx.addUniverse(
|
dmx.addUniverse(
|
||||||
universe,
|
universe,
|
||||||
config.universes[universe].output.driver,
|
config.universes[universe].output.driver,
|
||||||
config.universes[universe].output.device
|
config.universes[universe].output.device,
|
||||||
|
config.universes[universe].output.options
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
17
dmx.js
17
dmx.js
|
@ -9,12 +9,13 @@ function DMX(options) {
|
||||||
this.drivers = {}
|
this.drivers = {}
|
||||||
this.devices = options.devices || require('./devices')
|
this.devices = options.devices || require('./devices')
|
||||||
|
|
||||||
this.registerDriver('null', require('./drivers/null'))
|
this.registerDriver('null', require('./drivers/null'))
|
||||||
this.registerDriver('dmx4all', require('./drivers/dmx4all'))
|
this.registerDriver('dmx4all', require('./drivers/dmx4all'))
|
||||||
this.registerDriver('enttec-usb-dmx-pro', require('./drivers/enttec-usb-dmx-pro'))
|
this.registerDriver('enttec-usb-dmx-pro', require('./drivers/enttec-usb-dmx-pro'))
|
||||||
this.registerDriver('enttec-open-usb-dmx', require('./drivers/enttec-open-usb-dmx'))
|
this.registerDriver('enttec-open-usb-dmx', require('./drivers/enttec-open-usb-dmx'))
|
||||||
this.registerDriver('artnet', require('./drivers/artnet'))
|
this.registerDriver('dmxking-ultra-dmx-pro', require('./drivers/dmxking-ultra-dmx-pro'))
|
||||||
this.registerDriver('bbdmx', require('./drivers/bbdmx'))
|
this.registerDriver('artnet', require('./drivers/artnet'))
|
||||||
|
this.registerDriver('bbdmx', require('./drivers/bbdmx'))
|
||||||
}
|
}
|
||||||
|
|
||||||
util.inherits(DMX, EventEmitter)
|
util.inherits(DMX, EventEmitter)
|
||||||
|
@ -26,8 +27,8 @@ DMX.prototype.registerDriver = function(name, module) {
|
||||||
this.drivers[name] = module
|
this.drivers[name] = module
|
||||||
}
|
}
|
||||||
|
|
||||||
DMX.prototype.addUniverse = function(name, driver, device_id) {
|
DMX.prototype.addUniverse = function(name, driver, device_id, options) {
|
||||||
return this.universes[name] = new this.drivers[driver](device_id)
|
return this.universes[name] = new this.drivers[driver](device_id, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
DMX.prototype.update = function(universe, channels) {
|
DMX.prototype.update = function(universe, channels) {
|
||||||
|
|
84
drivers/dmxking-ultra-dmx-pro.js
Normal file
84
drivers/dmxking-ultra-dmx-pro.js
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
"use strict"
|
||||||
|
|
||||||
|
var SerialPort = require("serialport")
|
||||||
|
|
||||||
|
var DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE = 0x00
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_START_OF_MSG = 0x7e
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_END_OF_MSG = 0xe7
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_SEND_DMX_RQ = 0x06
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_SEND_DMX_A_RQ = 0x64
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_SEND_DMX_B_RQ = 0x65
|
||||||
|
, DMXKING_ULTRA_DMX_PRO_RECV_DMX_PKT = 0x05
|
||||||
|
;
|
||||||
|
|
||||||
|
function DMXKingUltraDMXPro(device_id, options) {
|
||||||
|
var self = this
|
||||||
|
this.options = options || {}
|
||||||
|
this.universe = new Buffer(512)
|
||||||
|
this.universe.fill(0)
|
||||||
|
|
||||||
|
this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_RQ
|
||||||
|
if (this.options.port === "A") {
|
||||||
|
this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_A_RQ
|
||||||
|
} else if (this.options.port === "B") {
|
||||||
|
this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_B_RQ
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dev = new SerialPort(device_id, {
|
||||||
|
'baudrate': 250000,
|
||||||
|
'databits': 8,
|
||||||
|
'stopbits': 2,
|
||||||
|
'parity': 'none'
|
||||||
|
}, function(err) {
|
||||||
|
if(!err) {
|
||||||
|
self.send_universe()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.send_universe = function() {
|
||||||
|
if(!this.dev.isOpen()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var hdr = Buffer([
|
||||||
|
DMXKING_ULTRA_DMX_PRO_START_OF_MSG,
|
||||||
|
this.sendDMXReq,
|
||||||
|
(this.universe.length + 1) & 0xff,
|
||||||
|
((this.universe.length + 1) >> 8) & 0xff,
|
||||||
|
DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE
|
||||||
|
])
|
||||||
|
|
||||||
|
var msg = Buffer.concat([
|
||||||
|
hdr,
|
||||||
|
this.universe,
|
||||||
|
Buffer([DMXKING_ULTRA_DMX_PRO_END_OF_MSG])
|
||||||
|
])
|
||||||
|
this.dev.write(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.start = function() {}
|
||||||
|
DMXKingUltraDMXPro.prototype.stop = function() {}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.close = function(cb) {
|
||||||
|
this.dev.close(cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.update = function(u) {
|
||||||
|
for(var c in u) {
|
||||||
|
this.universe[c] = u[c]
|
||||||
|
}
|
||||||
|
this.send_universe()
|
||||||
|
}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.updateAll = function(v){
|
||||||
|
for(var i = 0; i < 512; i++) {
|
||||||
|
this.universe[i] = v
|
||||||
|
}
|
||||||
|
this.send_universe()
|
||||||
|
}
|
||||||
|
|
||||||
|
DMXKingUltraDMXPro.prototype.get = function(c) {
|
||||||
|
return this.universe[c]
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = DMXKingUltraDMXPro
|
|
@ -28,6 +28,10 @@ A example configuration is in the repository by the name <code>dmx-web-example.c
|
||||||
|
|
||||||
dmx-web [-c <full-path to config file>]
|
dmx-web [-c <full-path to config file>]
|
||||||
|
|
||||||
|
### Run as a service
|
||||||
|
|
||||||
|
On MacOS you can run dmx-web as a service by adding a launch script to /Library/LaunchDaemons. See the example file.
|
||||||
|
|
||||||
### Animation HTTP API
|
### Animation HTTP API
|
||||||
|
|
||||||
A List of Channel Transistions can be POSTed to <code>/animation/<universe></code>. Each transistion is a JSON Object with at least the <code>to</code> property present. The Value of which also has to be an Object describing the channel end-states.
|
A List of Channel Transistions can be POSTed to <code>/animation/<universe></code>. Each transistion is a JSON Object with at least the <code>to</code> property present. The Value of which also has to be an Object describing the channel end-states.
|
||||||
|
@ -70,12 +74,14 @@ These drivers are currently registered by default:
|
||||||
- dmx4all: driver for DMX4ALL devices like the "NanoDMX USB Interface"
|
- dmx4all: driver for DMX4ALL devices like the "NanoDMX USB Interface"
|
||||||
- enttec-usb-dmx-pro: a driver for devices using a Enttec USB DMX Pro chip like the "DMXKing ultraDMX Micro".
|
- enttec-usb-dmx-pro: a driver for devices using a Enttec USB DMX Pro chip like the "DMXKing ultraDMX Micro".
|
||||||
- enttec-open-usb-dmx: driver for "Enttec Open DMX USB". This device is NOT recommended, there are known hardware limitations and this driver is not very stable. (If possible better obtain a device with the "pro" chip)
|
- enttec-open-usb-dmx: driver for "Enttec Open DMX USB". This device is NOT recommended, there are known hardware limitations and this driver is not very stable. (If possible better obtain a device with the "pro" chip)
|
||||||
|
- dmxking-utra-dmx-pro: driver for the DMXKing Ultra DMX pro interface. This driver support multiple universe specify the options with Port = A or B
|
||||||
|
|
||||||
#### dmx.addUniverse(name, driver, device_id)
|
#### dmx.addUniverse(name, driver, device_id, options)
|
||||||
|
|
||||||
- <code>name</code> - String
|
- <code>name</code> - String
|
||||||
- <code>driver</code> - String, referring a registered driver
|
- <code>driver</code> - String, referring a registered driver
|
||||||
- <code>device_id</code> - Number or Object
|
- <code>device_id</code> - Number or Object
|
||||||
|
- <code>options</code> - Object, driver specific options
|
||||||
|
|
||||||
Add a new DMX Universe with a name, driver and an optional device_id used by the driver to identify the device.
|
Add a new DMX Universe with a name, driver and an optional device_id used by the driver to identify the device.
|
||||||
For enttec-usb-dmx-pro and enttec-open-usb-dmx device_id is the path the the serial device. For artnet it is the target ip.
|
For enttec-usb-dmx-pro and enttec-open-usb-dmx device_id is the path the the serial device. For artnet it is the target ip.
|
||||||
|
|
Loading…
Reference in a new issue