MattIPv4/PyDMXControl

Custom Channels

thenicnic opened this issue · 3 comments

Thank you for this great project, really cool!
I'd like to add some more channels because I got a RGB LED bar that contains 16 segments (R, G, B for each segment, thus 48 channels).
What would be the best way for me to modify the Controller file to support more than the default colors and 'dim' and so on?
Hardcoed channel numbers wouldn't be a problem for me, plus I don't need the web interface because I'm trying to realize a sound-to-light script.

👋 You shouldn't need to modify the core Controller to do this, you'll just need to implement your own fixture profile for the fixture you are using so that it registers all the expected channels. You can look at the built-in fixture profiles as a reference and starting point for implementing your own: https://github.com/MattIPv4/PyDMXControl/tree/master/PyDMXControl/profiles

Thanks Matt! Sorry I forgot to attach the code, I actually made a custom fixture but cannt address the register_channels. I may need to call them all "dimmer" but how do I do the addressing then? By using the "name" tag in add_fixture?

from ..defaults import Fixture

class PixelbarSwitch_53(Fixture):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
  
        self._register_channel('dimmer')
        self._register_channel_aliases('dimmer', 'dim', 'd')
        self._register_channel('1r')
        self._register_channel_aliases('1r')
        self._register_channel('1g')
        self._register_channel_aliases('1g')
        self._register_channel('1b')
        self._register_channel_aliases('1b')
        self._register_channel('2r')
        self._register_channel_aliases('2r')
        self._register_channel('2g')
        self._register_channel_aliases('2g')
        self._register_channel('2b')
        self._register_channel_aliases('2b')
        self._register_channel('3r')
        self._register_channel_aliases('3r')
        self._register_channel('3g')
        self._register_channel_aliases('3g')
        self._register_channel('3b')
        self._register_channel_aliases('3b')
        self._register_channel('4r')
        self._register_channel_aliases('4r')
        self._register_channel('4g')
        self._register_channel_aliases('4g')
        self._register_channel('4b')
        self._register_channel_aliases('4b')
        self._register_channel('5r')
        self._register_channel_aliases('5r')
        self._register_channel('5g')
        self._register_channel_aliases('5g')
        self._register_channel('5b')
        self._register_channel_aliases('5b')
        self._register_channel('6r')
        self._register_channel_aliases('6r')
        self._register_channel('6g')
        self._register_channel_aliases('6g')
        self._register_channel('6b')
        self._register_channel_aliases('6b')
        self._register_channel('7r')
        self._register_channel_aliases('7r')
        self._register_channel('7g')
        self._register_channel_aliases('7g')
        self._register_channel('7b')
        self._register_channel_aliases('7b')
        self._register_channel('8r')
        self._register_channel_aliases('8r')
        self._register_channel('8g')
        self._register_channel_aliases('8g')
        self._register_channel('8b')
        self._register_channel_aliases('8b')
[...]
        self._register_channel('41r')
        self._register_channel_aliases('41r')
        self._register_channel('41g')
        self._register_channel_aliases('41g')
        self._register_channel('41b')
        self._register_channel_aliases('41b')
        self._register_channel('42r')
        self._register_channel_aliases('42r')
        self._register_channel('42g')
        self._register_channel_aliases('42g')
        self._register_channel('42b')
        self._register_channel_aliases('42b')
        self._register_channel('43r')
        self._register_channel_aliases('43r')
        self._register_channel('43g')
        self._register_channel_aliases('43g')
        self._register_channel('43b')
        self._register_channel_aliases('43b')
        self._register_channel('44r')
        self._register_channel_aliases('44r')
        self._register_channel('44g')
        self._register_channel_aliases('44g')
        self._register_channel('44b')
        self._register_channel_aliases('44b')
        self._register_channel('45r')
        self._register_channel_aliases('45r')
        self._register_channel('45g')
        self._register_channel_aliases('45g')
        self._register_channel('45b')
        self._register_channel_aliases('45b')
        self._register_channel('46r')
        self._register_channel_aliases('46r')
        self._register_channel('46g')
        self._register_channel_aliases('46g')
        self._register_channel('46b')
        self._register_channel_aliases('46b')
        self._register_channel('47r')
        self._register_channel_aliases('47r')
        self._register_channel('47g')
        self._register_channel_aliases('47g')
        self._register_channel('47b')
        self._register_channel_aliases('47b')
        self._register_channel('48r')
        self._register_channel_aliases('48r')
        self._register_channel('48g')
        self._register_channel_aliases('48g')
        self._register_channel('48b')
        self._register_channel_aliases('48b')

Ah! So the interface isn't great for this, but you can call Fixture#set_channel with the channel name and a value, or if you just want to set all the channels, you can call Fixture#set_channels with a list of values

def set_channel(self, channel: Union[str, int], value: int) -> 'Fixture':
if not self._valid_channel_value(value, channel):
return self
self.__channels[self.get_channel_id(channel)].set(value)
return self
def set_channels(self, *args: Union[int, List[int], None], **kwargs) -> 'Fixture':
channel = 0
if 'start' in kwargs and str(kwargs['start']).isdigit() and int(kwargs['start']) > 0:
channel = int(kwargs['start'])
def apply_values(fixture, values, chan=1):
for value in values:
if value is not None:
if isinstance(value, list):
chan = apply_values(fixture, value, chan)
elif str(value).isdigit():
fixture.set_channel(chan, int(value))
chan += 1
return chan - 1
apply_values(self, args, channel)
return self