Open jlg89 opened 1 year ago
It might also be nice to have a "keepAlive" parameter, that would make the plugin send the last-set DMX values once per second. This would help folks who have something like a Doug Fleenor Preset 10 wall panel, which controls the DMX fixtures with its own presets unless it detects another DMX control signal. The DMX spec says that 1s is the minimum timeout for detecting loss-of-signal.
FYI, I have been working on adding support for the fade as well as a couple of other transition effects.
That's fantastic. The plugin works great (even with the Preset 10, I have found), I just need to be able to fade between settings. I'm willing to compensate you for your time, if that would be helpful. This is a really solid solution to the problem of multi-point DMX control, at least for relatively simple sequences. The "real" DMX controller apps on iOS seem to be single-point control, so you have to have a single dedicated iPad. This plugin gives you DMX control from anything that can run the Home app.
Also, FWIW, I'm using this with a Chauvet DMX-AN2 in sACN mode -- so you can add that to your supported hardware list.
I just released a new version and it is now available in HomeBridge. Note that there is a breaking change to the config file so you'll need to move your ipAddress into the config for each accessory. Consult the README for more information. There are three new lighting transitions...the one you want is called "gradient'.
I was not able to get to the KeepAlive request as its actually quite a bit more complicated than it appears and I don't have a lot of time right now.
That's great news. I'll test & report. I don't think I need the keepAlive function as I initially thought, because it seems that the DMX-AN2, once I send a DMX command through it, maintains a live DMX signal thereafter. I don't see any activity light on the output, but the Fleenor module says it's there. SMH but it works. I've also configured the Fleenor to maintain the last-sent settings if & when it does take over, so it should be fine either way.
Excellent! Would you mind checking something for me when you get it running? I’ve never been happy with the color accuracy (you choose pure red but it gives you something like a light-red at times for example) so I spent some time debugging it and my code and HomeKit seem to be sending the right color codes so I think it might have to do with my lighting controller. So I’m curious if you are seeing this behavior as well.
-Dan
On Feb 23, 2023, at 10:58 PM, jlg89 @.***> wrote:
That's great news. I'll test & report. I don't think I need the keepAlive function as I initially thought, because it seems that the DMX-AN2, once I send a DMX command through it, maintains a live DMX signal thereafter. I don't see any activity light on the output, but the Fleenor module says it's there. SMH but it works. I've also configured the Fleenor to maintain the last-sent settings if & when it does take over, so it should be fine either way.
— Reply to this email directly, view it on GitHubhttps://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/4#issuecomment-1442887519, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALGYIL4FCX7FSQO3GFQA7VDWZBL2FANCNFSM6AAAAAAUZVXFFM. You are receiving this because you commented.Message ID: @.***>
I don't have any RGB lights, they're all just faders (both spots and LED cans).
The gradient mostly works, but it seems like it's not starting from last-set values. When I go from one preset to another, the lights either go full on or full off for a split-second, then jump back to something close to what they were before. I'll upload a video.
Interesting. The pop would seem to indicate the light wasn't fully on or else maybe it starts to fade and then ramps back up to full before fading again. I'll investigate on my end. Your video was super helpful.
I'm not able to reproduce the behavior you are seeing. Would you mind sending me your DMX Light Homebridge Config JSON?
{ "platform": "DMXLightHomebridgePlugin", "name": "DMX Light", "accessories": [ { "name": "Left Spots 1", "id": "009", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 9, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Left Spots 2", "id": "010", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 10, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Pulpit Spots", "id": "011", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 11, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Baptistery Spots", "id": "012", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 12, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Right Spots 1", "id": "013", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 13, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Right Spots 2", "id": "014", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 14, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Cross Backlight", "id": "015", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 15, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House C1", "id": "017", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 17, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House C2", "id": "018", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 18, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House C3", "id": "019", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 19, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House C4", "id": "020", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 20, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House Rear", "id": "021", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 21, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "House Windows", "id": "022", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 22, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Stage Accent", "id": "023", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 23, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Baptistery Ceiling", "id": "024", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 24, "dmxChannelCount": 1, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 } ] }
Here are the HomeKit scenes for the various presets in the video.
Did another video, not sure it will help, but maybe.
Is there a way I can log the output of the plugin, so maybe we can try to figure out what's causing the "pop" at the beginning of transitions?
Trying to figure out the best place to start. You and I probably have about the same amount of free time to dig into this stuff. :D
I’m looking at dmx.tx and trying to trace through the applyGradientTransition subroutine. Not a TS coder, though, so some of it is still Greek.
I see where you determine the number of discrete updates (colorPoints) that will need to be made in order to get from point A to point B, in line 198.
I see you’re passing colorPoints to the setMidpoint function. I guess that function returns an array of color values, one set for each value of colorPoints. Are the numbers in that array actual values, or are they values that must be added to the currentColorStr values? IOW if we’re going from 100 to 110 over ten update intervals, does the array contain 101,102,103 etc. or 1,2,3 etc.? How does it handle negative gradients?
Also, how long does the array in sacnUniverseMap survive? I assume it dies if the plugin instance is restarted, but does it have another timeout as well, or anything that would change/clear/zero its values other than the user calling for a new setting?
I’ve rewritten the transition from scratch and my tests last night looked very smooth. Also found a bug that limited the number of devices that could be used if they had different IP addresses. I’d like to conduct some more testing this weekend and then have something published by Sunday night PST (I’m in Seattle).
-Dan
On Jul 17, 2023, at 9:11 AM, jlg89 @.***> wrote:
Trying to figure out the best place to start. You and I probably have about the same amount of free time to dig into this stuff. :D
I’m looking at dmx.tx and trying to trace through the applyGradientTransition subroutine. Not a TS coder, though, so some of it is still Greek.
I see where you determine the number of discrete updates (colorPoints) that will need to be made in order to get from point A to point B, in line 198.
I see you’re passing colorPoints to the setMidpoint function. I guess that function returns an array of color values, one set for each value of colorPoints.
Are the numbers in that array actual values, or are they values that must be added to the currentColorStr values? IOW if we’re going from 100 to 110 over ten update intervals, does the array contain 101,102,103 etc. or 1,2,3 etc.?
Also, how long does the array in sacnUniverseMap survive? I assume it dies if the plugin instance is restarted, but does it have another timeout as well, or anything that would change/clear/zero its values other than the user calling for a new setting?
— Reply to this email directly, view it on GitHubhttps://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/4#issuecomment-1638450097, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALGYIL64MSTMKYLDDSYAAQDXQVPZRANCNFSM6AAAAAAUZVXFFM. You are receiving this because you commented.Message ID: @.***>
The change is now available. Please let me know how it works. -Dan
I'm still getting crazy light effects. Same config as above. It works perfectly if I drive it with the Photon app on iPad, so the hardware config checks out. The weird behavior doesn't make sense; let me know if there's a way I can log the output or something, whatever would be helpful for troubleshooting.
Actually, looking at your code, there should be plenty of stuff in the debug log to give us some kind of clue...let me see what I can do with that.
I removed the transitionEffect and transitionDuration from everything and tried it that way. Still did weird things, but not for any duration (since transition effects were disabled). So I tried controlling each fixture independently in HomeKit. When I adjust a fixture, that adjustment works, and the log file shows that adjustment being made -- but every other light turns off. Whichever light I adjust works, and the rest turn off.
So whatever sACN string is getting sent is telling everything else to go to zero. That bit isn't showing up in the log. Not sure what's going on here, other than maybe the plugin is either not storing or not reading the last-sent values for each fixture?
Thanks for the info. I’ll look into it this weekend.
-Dan
On Jul 29, 2023, at 12:13 PM, jlg89 @.***> wrote:
I removed the transitionEffect and transitionDuration from everything and tried it that way. Still did t work. So I tried controlling each fixture independently in HomeKit. When I adjust a fixture, that adjustment works, and the log file shows that adjustment being made -- but every other light turns off. Whichever light I adjust works, and the rest turn off.
So whatever sACN string is getting sent is telling everything else to go to zero. That bit isn't showing up in the log. Not sure what's going on here, other than maybe the plugin is either not storing or not reading the last-sent values for each fixture?
— Reply to this email directly, view it on GitHubhttps://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/4#issuecomment-1656841608, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALGYIL5VFUIVCUPOWQWG7X3XSVOHFANCNFSM6AAAAAAUZVXFFM. You are receiving this because you commented.Message ID: @.***>
I think your configuration is a bit wonky. You have defined overlapping channels...so they are fighting over one another. Each RGB light consumes three channels (one for each color). The second accessory you have defined is starting at the GREEN channel of the first light and the third accessory is overwriting the BLUE channel of the first light. You're config should instead look more like the following: "accessories": [ { "name": "Left Spots 1", "id": "009", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 9, "dmxChannelCount": 3, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }, { "name": "Left Spots 2", "id": "010", "driverName": "sacn", "ipAddress": "192.168.3.35", "dmxStartChannel": 12, "dmxChannelCount": 3, "dmxUniverse": 1, "colorOrder": "rgb", "transitionEffect": "gradient", "transitionDuration": 10000 }...
Give that a try and let me know. BTW, I released another version today, however, it won't have any impact on what you are experiencing.
-Dan
Ah, I see. Looking in the code, it looked (to the obviously untrained eye) like there was a check for the defined number of channels, and that it would just use the first color for a single-channel config. But I now notice that I can set the color order to "w" for a fader-only single channel. That loses gradients, though, correct?
Maybe a (relatively) easy way to support single-channel transitions would be to check for colorOrder being "w" and, if so, simply use the "r" value from the transition sequence and ignore the other two?
Oh, wait...when I set the colorOrder to "w" I get this error for every fixture. This is with all the transition config removed, and running v1.2.5.
7/31/2023, 7:21:25 AMDMX Lighting BridgeDMX LightAn unsupported color order was found. Now using default of "rgb".
7/31/2023, 7:21:25 AMDMX Lighting BridgeDMX LightRestoring existing accessory from cache: House C1
FWIW there's a lot of overlap here with https://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/7
Ah, it looks like the "w" colorOrder option only works with enttec, and I'm using sACN. All my lights are fader-only, so one channel each.
I’ve added the w option to sacn but there are issues with it that I believe relate to the sacn buffer for the universe. This gave me an idea. Do you have the ability to change your lights to each be on a different universe? That might solve the problem.
-Dan
On Aug 8, 2023, at 1:43 PM, jlg89 @.***> wrote:
Ah, it looks like the "w" colorOrder option only works with enttec, and I'm using sACN. All my lights are fader-only, so one channel each.
— Reply to this email directly, view it on GitHubhttps://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/4#issuecomment-1670282103, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALGYIL4TCGMZHHJTCJM3Z5LXUKQIVANCNFSM6AAAAAAUZVXFFM. You are receiving this because you commented.Message ID: @.***>
The lights allow selection of their DMX address, but the universe seems to be dependent on the physical cabling. The DMX-AN2 interface supports two separate universes (ie it has two output connections). So the only way I could reconfigure would be to either re-address all the fixtures to put two empty channels between each one (so sending RGB to a fader-only fixture wouldn't affect the next fixture), or make clever use of a three-channel fixture in the plugin to control three single-channel fixtures with adjacent addresses, using each of the RGB values to set individual fader levels. Either method would completely break the existing control setup, and would be pretty non-intuitive for "the next guy" whoever that is.
Makes sense, it was just a thought. I’ll continue to investigate a solution.
-Dan
On Aug 9, 2023, at 6:11 AM, jlg89 @.***> wrote:
The lights allow selection of their DMX address, but the universe seems to be dependent on the physical cabling. The DMX-AN2 interface supports two separate universes (ie it has two output connections). So the only way I could reconfigure would be to either re-address all the fixtures to put two empty channels between each one (so sending RGB to a fader-only fixture wouldn't affect the next fixture), or make clever use of a three-channel fixture in the plugin to control three single-channel fixtures with adjacent addresses, using each of the RGB values to set individual fader levels. Either method would completely break the existing control setup, and would be pretty non-intuitive for "the next guy" whoever that is.
— Reply to this email directly, view it on GitHubhttps://github.com/PennazSoftware/homebridge-dmxlight-plugin/issues/4#issuecomment-1671302004, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ALGYIL7GAGCAA36Y7ADOGDLXUOEBNANCNFSM6AAAAAAUZVXFFM. You are receiving this because you commented.Message ID: @.***>
I'm trying to dig into the code enough to understand what it's doing and how, so it may be doing things this way already, but this is how it seems to me that the logic should work:
Is your feature request related to a problem? Please describe: I want to use HomeKit scenes to control lighting presets in an auditorium. This works, but changes are instantaneous and jarring. I need a way to fade from current settings to new settings.
Describe the solution you'd like: A "fadeTime" parameter, either global or per fixture, that tells the plugin how long to take to fade from current levels to new levels. As an example, in my application, I like to use a 10s fade.
Describe alternatives you've considered: The only alternative is to use an actual hardware or software DMX controller that has a fade function.