Aircoookie / WLED

Control WS2812B and many more types of digital RGB LEDs with an ESP8266 or ESP32 over WiFi!
https://kno.wled.ge
MIT License
14.61k stars 3.14k forks source link

E1.31 (DMX) group pixels #2325

Closed KevinVanthuyne closed 2 years ago

KevinVanthuyne commented 2 years ago

I am in the process of making a stage lighting installation with pixel tape and WLED. So far it's working really well, but controlling all pixels (60 leds/m) is eating up a lot of channels and universes. I don't need to control each led separately, in my case about 10-20 "groups" of 3 or 6 leds per meter would be enough. This would drastically reduce the amount of pixels to output and thus make it possible to run faster animations and maybe a cheaper license for the outputting software. Is this something that is possible?

max9901 commented 1 year ago

@mxklb sorry I was a bit stale, but if u like I can also take the time to merge my changes into your PR shall I do that? and then open a new PR request that has both our functionality in there.

dzelionis commented 1 year ago

@Aircoookie, fix for issue with Preset save: need to modify index.js at line 2232 from: if ( gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value); to

                        if ( gId(`p${i}lmp`) !== null ) {
                          if ( gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value);
                        }

rebuild npm and save is working again... @blazoncek, maybe you have a quick check on this bug with presets, as i have compiled yesterday's latest version of wled and the issue was there, so i have found a solution for it too..you just need to apply that fix.....

blazoncek commented 1 year ago

Fixed. Thanks for pointing it out @dzelionis . 713509527a2591ae93ad22fce28c251fa6365199

dzelionis commented 1 year ago

Fixed. Thanks for pointing it out @dzelionis . 7135095

That no problem at all....

Thank you and @mxklb did a very nice job, Thank you Mxklnb.

mxklb commented 1 year ago

@max9901 I already provided a PR for the Effects mode changes. I'll like to wait for feedback on this before merging our branches together. Nevertheless I already started reviewing some of the other DMX modes as existing in upstream. As far as I could read the code correctly, at least the modes DMX_MODE_SINGLE_RGB and DMX_MODE_SINGLE_DRGB are likely to use one channel more than suggested/documented.

wChannel = (availDMXLen > 3|4) ? e131_data[dataOffset+3|4] : 0; 

This line looks like it's using 4|5 channels instead of 3|4. So maybe this is an existing "bug" in implementation. TBD

availDMXLen == Channels left in universe since start address != Number of DMX channels per Mode

I already cleared this out in drgb branch, so maybe u may take that into account for the other DMX changes too ..

@max9901 I'll test your changes these days and merge them into PR as @Aircoookie mentioned above?

davidd1205 commented 1 year ago

hello thank you for these improvements I will also compile to test these new Dmx mode a wled to see how soundswitch reacts @dzelionis but I think you have to ask Soundswtich to create another fixture for these new modes have you already asked? because with wled I get 2 fixtures

davidd1205 commented 1 year ago

I saw that the changes for SS were at the level of the effectoption and the R3, G3 B3 [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3]

on the other hand there is also a preset mode which seems interesting but not as such in a show but just for static it would be great to be able to call a preset with the effect mode is it possible to implement this? or maybe a realtime problem with wled

thank you in any case for this advance, for the moment I use the main segment with the group function to have a kind of multicell but without monopolizing the Dmx universe with few leds but the SS chases are not great for these strip pixel, I told them but he doesn't seem too concerned as we are a minority according to them to use this but I think this minority will grow

mxklb commented 1 year ago

I think calling presets in DMX Effect modes is only needed rarely. Normally one would define different DMX states (called scenes) and trigger them instead. So you are actually already able to fire presets without even defining them in WLED :-)

As mentioned above Presets mode was already implemented some kind of .. If you try existing release in DMX Effect mode and choose DMX start address > 501, WLED presets shall switch (i did not test it but that's what was/is in code). Because this is uncommon practice for DMX addressing, it is moved into its own DMX mode in my implementation.

mxklb commented 1 year ago

@dzelionis but I think you have to ask Soundswtich to create another fixture for these new modes have you already asked?

That's correct! In most DMX software I know you're able to add user fixtures, with custom defined DMX channel layouts. Maybe better ask them to implement this instead. With the correct fixture mapping, any DMX software that sends E1.31 or Artnet is supposed to control WLED via DMX as described.

max9901 commented 1 year ago

I think calling presets in DMX Effect modes is only needed rarely.

@mxklb this would however be a very nice way to control your segment settings. (just thinking out loud here)

blazoncek commented 1 year ago

Please use WLED forum or Discord for discussion.

mxklb commented 1 year ago

https://wled.discourse.group/t/dmx-effect-mode-refactoring-beta-testing/6498

dzelionis commented 1 year ago

hello thank you for these improvements I will also compile to test these new Dmx mode a wled to see how soundswitch reacts @dzelionis but I think you have to ask Soundswtich to create another fixture for these new modes have you already asked? because with wled I get 2 fixtures

hey, i did not, had no chance to do so, but i just played around with the existing one (11ch) putting some blank space in between two wled's (dmx segments) . And i think that worked ok.

tomte76 commented 1 year ago

The segment part is exactly what I was looking for. Thank you very much. I compiled the code and I found that the new modes DMX_MODE_SEGMENTS_RGBW, DMX_MODE_SEGMENTS_DRGBW, DMX_MODE_SEGMENTS_RGB, DMX_MODE_SEGMENTS_DRGB do not work with Artnet polling support. Artnet polling support was introduced in 0.14 beta. It is needed for DMX lighting from my Numark Mixstream Pro or SoundSwitch from a Laptop using Wifi. It also, in my understanding, lowers the network overhead as the devices can be directly addressed after detection. I added the new modes to handleArtnetPollReply(IPAddress ipAddress) in e131.cpp as for e.g. DMX_MODE_SINGLE_DRGB. This will limit the usage to one universe, which is fine for me. I compiled and tested and as far as I can tell by now everything works fine :) Even if I flash two stripe controllers they both show up on the mixstream and can be controlled. It would be very nice if the Artnet polling support could be also realized if the segment part is ending up in a pull request for master.

dzelionis commented 1 year ago

The segment part is exactly what I was looking for. Thank you very much. I compiled the code and I found that the new modes DMX_MODE_SEGMENTS_RGBW, DMX_MODE_SEGMENTS_DRGBW, DMX_MODE_SEGMENTS_RGB, DMX_MODE_SEGMENTS_DRGB do not work with Artnet polling support. Artnet polling support was introduced in 0.14 beta. It is needed for DMX lighting from my Numark Mixstream Pro or SoundSwitch from a Laptop using Wifi. It also, in my understanding, lowers the network overhead as the devices can be directly addressed after detection. I added the new modes to handleArtnetPollReply(IPAddress ipAddress) in e131.cpp as for e.g. DMX_MODE_SINGLE_DRGB. This will limit the usage to one universe, which is fine for me. I compiled and tested and as far as I can tell by now everything works fine :) Even if I flash two stripe controllers they both show up on the mixstream and can be controlled. It would be very nice if the Artnet polling support could be also realized if the segment part is ending up in a pull request for master.

at some stage WLED had polling working fine, but i am not sure if why its stopped working on wled, I think soundswitch was more aggressive before and was sending requests to broadcast, but not anymore. So if wled implementation is based only on the response if requested and does not announce itself using timer, that would explain why its stopped. working. As if i remember correctly, ARTNET specification has something like 2.5 seconds defined for it. @blazoncek would you know what is wled implementation for artnetpool replay?

Anyway, you still can use my python script to do a job....thats what i currently using to make my wled be seen by soundswitch: https://github.com/dzelionis/artnet-advertiste-wled

blazoncek commented 1 year ago

Sorry, I have nothing to do with DMX as I do not use it. Also realtime, apart fdom DDP, is not my field.

tomte76 commented 1 year ago

The segment part is exactly what I was looking for. Thank you very much. I compiled the code and I found that the new modes DMX_MODE_SEGMENTS_RGBW, DMX_MODE_SEGMENTS_DRGBW, DMX_MODE_SEGMENTS_RGB, DMX_MODE_SEGMENTS_DRGB do not work with Artnet polling support. Artnet polling support was introduced in 0.14 beta. It is needed for DMX lighting from my Numark Mixstream Pro or SoundSwitch from a Laptop using Wifi. It also, in my understanding, lowers the network overhead as the devices can be directly addressed after detection. I added the new modes to handleArtnetPollReply(IPAddress ipAddress) in e131.cpp as for e.g. DMX_MODE_SINGLE_DRGB. This will limit the usage to one universe, which is fine for me. I compiled and tested and as far as I can tell by now everything works fine :) Even if I flash two stripe controllers they both show up on the mixstream and can be controlled. It would be very nice if the Artnet polling support could be also realized if the segment part is ending up in a pull request for master.

at some stage WLED had polling working fine, but i am not sure if why its stopped working on wled, I think soundswitch was more aggressive before and was sending requests to broadcast, but not anymore. So if wled implementation is based only on the response if requested and does not announce itself using timer, that would explain why its stopped. working. As if i remember correctly, ARTNET specification has something like 2.5 seconds defined for it. @blazoncek would you know what is wled implementation for artnetpool replay?

Anyway, you still can use my python script to do a job....thats what i currently using to make my wled be seen by soundswitch: https://github.com/dzelionis/artnet-advertiste-wled

Sorry if I was unclear. The only problem is, that the new modes need to be included in the function handleArtnetPollReply(IPAddress ipAddress) in e131.cpp. They were introduced and implemented but not included in handleArtnetPollReply(IPAddress ipAddress) function. Therefore the WLED device does not respond to Artnet polling if one of the new modes is selected. I solved that with just integrating the new modes to the switch cases in handleArtnetPollReply(IPAddress ipAddress). I would be very happy if this adjustment could be included in the pull request. Then you can use the modes like Segments RGB without any problems in SoundSwitch and also from my Numark Mixstream Pro. I tested this yesterday and it looks very good. Even with several WLED devices in the WLAN.

lorandnagy commented 1 year ago

I think calling presets in DMX Effect modes is only needed rarely.

@mxklb this would however be a very nice way to control your segment settings. (just thinking out loud here)

I will try to find a way to get data from rekordbox to controll effects. I could use maybe moving head x,y data :D @max9901 : I made some tests, sorry for not having time for it before. https://youtu.be/ASuh1SGcNiQ It is amaising what new capabilities there are! I will dig deaper, but I wanted to show how overlaping segments work great!

(((just thinkig out lout also :) could there be a possibility to have one led in both or more segments overlapping? Aaa I could not tell what color should that led be :D r,g,b average? maximum?)))

softhack007 commented 1 year ago

Hi, nice to see you are very busy in the DMX part of WLED:-)

I have a side-question: the SparkFun DMX output driver does some weird things on non-existing pins, including installation of a timer interrupt that is not needed but may cause trouble. When building WLED for new MCUs like -S3, these parts of the driver causes a watchdog reset, see issue #2928 .

I'm thinking of removing the DMX receive code from the driver, as currently it's unneeded code that seems to cause strange side-effects.This will only affect DMX receive from physical connections; DMX output and DMX over network will not change.

Can you confirm that the DMX receiver code from the sparkfun driver is not needed, and will not be needed for the changes you are working on?

Edit: picked the wrong issue ticket 🤓 that is closed already. Sorry. will copy my question to the active issue.

dzelionis commented 1 year ago

@tomte76 can you share your fix for pollreply in detail, what line has to be modified and what code has to be added? as my c skills is not great :D Thanks

davidd1205 commented 1 year ago

include "wled.h"

define MAX_3_CH_LEDS_PER_UNIVERSE 170

define MAX_4_CH_LEDS_PER_UNIVERSE 128

define MAX_CHANNELS_PER_UNIVERSE 512

/*

//DDP protocol support, called by handleE131Packet //handles RGB data only void handleDDPPacket(e131_packet_t* p) { int lastPushSeq = e131LastSequenceNumber[0];

//reject late packets belonging to previous frame (assuming 4 packets max. before push) if (e131SkipOutOfSequence && lastPushSeq) { int sn = p->sequenceNum & 0xF; if (sn) { if (lastPushSeq > 5) { if (sn > (lastPushSeq -5) && sn < lastPushSeq) return; } else { if (sn > (10 + lastPushSeq) || sn < lastPushSeq) return; } } }

uint8_t ddpChannelsPerLed = (p->dataType == DDP_TYPE_RGBW32) ? 4 : 3; // data type 0x1A is RGBW (type 3, 8 bit/channel)

uint32_t start = htonl(p->channelOffset) / ddpChannelsPerLed; start += DMXAddress / ddpChannelsPerLed; uint16_t stop = start + htons(p->dataLen) / ddpChannelsPerLed; uint8_t* data = p->data; uint16_t c = 0; if (p->flags & DDP_TIMECODE_FLAG) c = 4; //packet has timecode flag, we do not support it, but data starts 4 bytes later

realtimeLock(realtimeTimeoutMs, REALTIME_MODE_DDP);

if (!realtimeOverride || (realtimeMode && useMainSegmentOnly)) { for (uint16_t i = start; i < stop; i++) { setRealtimePixel(i, data[c], data[c+1], data[c+2], ddpChannelsPerLed >3 ? data[c+3] : 0); c += ddpChannelsPerLed; } }

bool push = p->flags & DDP_PUSH_FLAG; if (push) { e131NewData = true; byte sn = p->sequenceNum & 0xF; if (sn) e131LastSequenceNumber[0] = sn; } }

//E1.31 and Art-Net protocol support void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){

DEBUG_PRINTLN("receiving dmx packages! ");

uint16_t uni = 0, dmxChannels = 0; uint8_t* e131_data = nullptr; uint8_t seq = 0, mde = REALTIME_MODE_E131;

if (protocol == P_ARTNET) { if (p->art_opcode == ARTNET_OPCODE_OPPOLL) { handleArtnetPollReply(clientIP); return; } uni = p->art_universe; dmxChannels = htons(p->art_length); e131_data = p->art_data; seq = p->art_sequence_number; mde = REALTIME_MODE_ARTNET; } else if (protocol == P_E131) { uni = htons(p->universe); dmxChannels = htons(p->property_value_count) -1; e131_data = p->property_values; seq = p->sequence_number; } else { //DDP realtimeIP = clientIP; handleDDPPacket(p); return; }

ifdef WLED_ENABLE_DMX

// does not act on out-of-order packets yet if (e131ProxyUniverse > 0 && uni == e131ProxyUniverse) { for (uint16_t i = 1; i <= dmxChannels; i++) dmx.write(i, e131_data[i]); dmx.update(); }

endif

// only listen for universes we're handling & allocated memory if (uni < e131Universe || uni >= (e131Universe + E131_MAX_UNIVERSE_COUNT)) return;

uint8_t previousUniverses = uni - e131Universe;

if (e131SkipOutOfSequence) if (seq < e131LastSequenceNumber[previousUniverses] && seq > 20 && e131LastSequenceNumber[previousUniverses] < 250){ DEBUG_PRINT("skipping E1.31 frame (last seq="); DEBUG_PRINT(e131LastSequenceNumber[previousUniverses]); DEBUG_PRINT(", current seq="); DEBUG_PRINT(seq); DEBUG_PRINT(", universe="); DEBUG_PRINT(uni); DEBUG_PRINTLN(")"); return; } e131LastSequenceNumber[previousUniverses] = seq;

// update status info realtimeIP = clientIP; byte wChannel = 0; uint16_t totalLen = strip.getLengthTotal(); uint16_t availDMXLen = 0; uint16_t dataOffset = DMXAddress;

// For legacy DMX start address 0 the available DMX length offset is 0 const uint16_t dmxLenOffset = (DMXAddress == 0) ? 0 : 1;

// Check if DMX start address fits in available channels if (dmxChannels >= DMXAddress) { availDMXLen = (dmxChannels - DMXAddress) + dmxLenOffset; }

// DMX data in Art-Net packet starts at index 0, for E1.31 at index 1 if (protocol == P_ARTNET && dataOffset > 0) { dataOffset--; }

uint16_t dmxPointer = dataOffset;

switch (DMXMode) { case DMX_MODE_DISABLED: return; // nothing to do break;

case DMX_MODE_SINGLE_RGB: // RGB only
  if (uni != e131Universe) return;
  if (availDMXLen < 3) return;

  realtimeLock(realtimeTimeoutMs, mde);

  if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return;

  wChannel = (availDMXLen > 3) ? e131_data[dataOffset+3] : 0;
  for (uint16_t i = 0; i < totalLen; i++)
    setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel);
  break;

case DMX_MODE_SINGLE_DRGB: // Dimmer + RGB
  if (uni != e131Universe) return;
  if (availDMXLen < 4) return;

  realtimeLock(realtimeTimeoutMs, mde);
  if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return;
  wChannel = (availDMXLen > 4) ? e131_data[dataOffset+4] : 0;

  if (bri != e131_data[dataOffset+0]) {
    bri = e131_data[dataOffset+0];
    strip.setBrightness(bri, true);
  }

  for (uint16_t i = 0; i < totalLen; i++)
    setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel);
  break;

case DMX_MODE_EFFECT: // Length 1: Apply Preset ID, length 11-13: apply effect config
  if (uni != e131Universe) return;
  if (availDMXLen < 11) {
    if (availDMXLen > 1) return;
    applyPreset(e131_data[dataOffset+0], CALL_MODE_NOTIFICATION);
    return;
  }

  if (bri != e131_data[dataOffset+0]) {
    bri = e131_data[dataOffset+0];
  }
  if (e131_data[dataOffset+1] < strip.getModeCount())
  effectCurrent   = e131_data[dataOffset+ 1];
  effectSpeed     = e131_data[dataOffset+ 2];  // flickers
  effectIntensity = e131_data[dataOffset+ 3];
  effectPalette   = e131_data[dataOffset+ 4];
  col[0]          = e131_data[dataOffset+ 5];
  col[1]          = e131_data[dataOffset+ 6];
  col[2]          = e131_data[dataOffset+ 7];
  colSec[0]       = e131_data[dataOffset+ 8];
  colSec[1]       = e131_data[dataOffset+ 9];
  colSec[2]       = e131_data[dataOffset+10];
  if (availDMXLen > 11)
  {
    col[3]        = e131_data[dataOffset+11]; //white
    colSec[3]     = e131_data[dataOffset+12];
  }
  transitionDelayTemp = 0;               // act fast
  colorUpdated(CALL_MODE_NOTIFICATION);  // don't send UDP
  return;                                // don't activate realtime live mode
  break;

case DMX_MODE_MULTIPLE_DRGB:
case DMX_MODE_MULTIPLE_RGB:
case DMX_MODE_MULTIPLE_RGBW:
  {
    bool is4Chan = (DMXMode == DMX_MODE_MULTIPLE_RGBW);
    const uint16_t dmxChannelsPerLed = is4Chan ? 4 : 3;
    const uint16_t ledsPerUniverse = is4Chan ? MAX_4_CH_LEDS_PER_UNIVERSE : MAX_3_CH_LEDS_PER_UNIVERSE;
    uint8_t stripBrightness = bri;
    uint16_t previousLeds, dmxOffset, ledsTotal;

    if (previousUniverses == 0) {
      if (availDMXLen < 1) return;
      dmxOffset = dataOffset;
      previousLeds = 0;
      // First DMX address is dimmer in DMX_MODE_MULTIPLE_DRGB mode.
      if (DMXMode == DMX_MODE_MULTIPLE_DRGB) {
        stripBrightness = e131_data[dmxOffset++];
        ledsTotal = (availDMXLen - 1) / dmxChannelsPerLed;
      } else {
        ledsTotal = availDMXLen / dmxChannelsPerLed;
      }
    } else {
      // All subsequent universes start at the first channel.
      dmxOffset = (protocol == P_ARTNET) ? 0 : 1;
      const uint16_t dimmerOffset = (DMXMode == DMX_MODE_MULTIPLE_DRGB) ? 1 : 0;
      uint16_t ledsInFirstUniverse = (((MAX_CHANNELS_PER_UNIVERSE - DMXAddress) + dmxLenOffset) - dimmerOffset) / dmxChannelsPerLed;
      previousLeds = ledsInFirstUniverse + (previousUniverses - 1) * ledsPerUniverse;
      ledsTotal = previousLeds + (dmxChannels / dmxChannelsPerLed);
    }

    // All LEDs already have values
    if (previousLeds >= totalLen) {
      return;
    }

    realtimeLock(realtimeTimeoutMs, mde);
    if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return;

    if (ledsTotal > totalLen) {
      ledsTotal = totalLen;
    }

    if (DMXMode == DMX_MODE_MULTIPLE_DRGB && previousUniverses == 0) {
      if (bri != stripBrightness) {
        bri = stripBrightness;
        strip.setBrightness(bri, true);
      }
    }

    if (!is4Chan) {
      for (uint16_t i = previousLeds; i < ledsTotal; i++) {
        setRealtimePixel(i, e131_data[dmxOffset], e131_data[dmxOffset+1], e131_data[dmxOffset+2], 0);
        dmxOffset+=3;
      }
    } else {
      for (uint16_t i = previousLeds; i < ledsTotal; i++) {
        setRealtimePixel(i, e131_data[dmxOffset], e131_data[dmxOffset+1], e131_data[dmxOffset+2], e131_data[dmxOffset+3]);
        dmxOffset+=4;
      }
    }
    break;
  }

case DMX_MODE_SEGMENTS_RGBW:
case DMX_MODE_SEGMENTS_DRGBW:
case DMX_MODE_SEGMENTS_RGB:
case DMX_MODE_SEGMENTS_DRGB:   

  if (uni != e131Universe) return;  

  realtimeLock(realtimeTimeoutMs, mde);
  if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return;

  if ((DMXMode == DMX_MODE_SEGMENTS_DRGB) |  (DMXMode == DMX_MODE_SEGMENTS_DRGBW)){
      if (bri != e131_data[dataOffset+0]) {
        bri = e131_data[dataOffset+0];
        strip.setBrightness(bri, true);
      }
      dmxPointer++;
  }
  for(segment & seg : strip._segments){
    if(seg.isActive()){   
      seg.setOption(SEG_OPTION_SELECTED,true);  
      if ((DMXMode == DMX_MODE_SEGMENTS_RGBW) |  (DMXMode == DMX_MODE_SEGMENTS_DRGBW)){
        seg.fill(RGBW32(e131_data[dmxPointer+0], e131_data[dmxPointer+1], e131_data[dmxPointer+2],0));
      }else{
        seg.fill(RGBW32(e131_data[dmxPointer+0], e131_data[dmxPointer+1], e131_data[dmxPointer+2],e131_data[dmxPointer+3]));
      }
      seg.setOption(SEG_OPTION_SELECTED,false); 
    }
    if ((DMXMode == DMX_MODE_SEGMENTS_RGBW) |  (DMXMode == DMX_MODE_SEGMENTS_DRGBW)){
      dmxPointer += 4; 
    }else{
      dmxPointer += 3; 
    }
  }
  break;

case DMX_MODE_SEGMENTS_EFFECT:  //TODO maybe by mx
  DEBUG_PRINTLN(F("DMX_MODE_SEGMENTS_EFFECT TODO"));
default:
  DEBUG_PRINTLN(F("unknown E1.31 DMX mode"));
  return;  // nothing to do
  break;

}

e131NewData = true; }

void handleArtnetPollReply(IPAddress ipAddress) { ArtPollReply artnetPollReply; prepareArtnetPollReply(&artnetPollReply);

uint16_t startUniverse = e131Universe; uint16_t endUniverse = e131Universe;

switch (DMXMode) { case DMX_MODE_DISABLED: return; // nothing to do break;

case DMX_MODE_SINGLE_RGB:
case DMX_MODE_SINGLE_DRGB:
case DMX_MODE_EFFECT:
  break;  // 1 universe is enough

case DMX_MODE_MULTIPLE_DRGB:
case DMX_MODE_MULTIPLE_RGB:
case DMX_MODE_MULTIPLE_RGBW:
case DMX_MODE_SEGMENTS_RGBW:
case DMX_MODE_SEGMENTS_DRGBW:
case DMX_MODE_SEGMENTS_RGB:
case DMX_MODE_SEGMENTS_DRGB:
case DMX_MODE_SEGMENTS_EFFECT:
{
  bool is4Chan = (DMXMode == DMX_MODE_MULTIPLE_RGBW);
  const uint16_t dmxChannelsPerLed = is4Chan ? 4 : 3;
  const uint16_t dimmerOffset = (DMXMode == DMX_MODE_MULTIPLE_DRGB) ? 1 : 0;
  const uint16_t dmxLenOffset = (DMXAddress == 0) ? 0 : 1; // For legacy DMX start address 0
  const uint16_t ledsInFirstUniverse = (((MAX_CHANNELS_PER_UNIVERSE - DMXAddress) + dmxLenOffset) - dimmerOffset) / dmxChannelsPerLed;
  const uint16_t totalLen = strip.getLengthTotal();

  if (totalLen > ledsInFirstUniverse)
  {
    const uint16_t ledsPerUniverse = is4Chan ? MAX_4_CH_LEDS_PER_UNIVERSE : MAX_3_CH_LEDS_PER_UNIVERSE;
    const uint16_t remainLED = totalLen - ledsInFirstUniverse;

    endUniverse += (remainLED / ledsPerUniverse);

    if ((remainLED % ledsPerUniverse) > 0)
    {
      endUniverse++;
    }

    if ((endUniverse - startUniverse) > E131_MAX_UNIVERSE_COUNT)
    {
      endUniverse = startUniverse + E131_MAX_UNIVERSE_COUNT - 1;
    }
  }
  break;
  }
default:
  DEBUG_PRINTLN(F("unknown E1.31 DMX mode"));
  return;  // nothing to do
  break;

}

for (uint16_t i = startUniverse; i <= endUniverse; ++i) { sendArtnetPollReply(&artnetPollReply, ipAddress, i); } }

void prepareArtnetPollReply(ArtPollReply *reply) { // Art-Net reply->reply_id[0] = 0x41; reply->reply_id[1] = 0x72; reply->reply_id[2] = 0x74; reply->reply_id[3] = 0x2d; reply->reply_id[4] = 0x4e; reply->reply_id[5] = 0x65; reply->reply_id[6] = 0x74; reply->reply_id[7] = 0x00;

reply->reply_opcode = ARTNET_OPCODE_OPPOLLREPLY;

IPAddress localIP = Network.localIP(); for (uint8_t i = 0; i < 4; i++) { reply->reply_ip[i] = localIP[i]; }

reply->reply_port = ARTNET_DEFAULT_PORT;

char * numberEnd = versionString; reply->reply_version_h = (uint8_t)strtol(numberEnd, &numberEnd, 10); numberEnd++; reply->reply_version_l = (uint8_t)strtol(numberEnd, &numberEnd, 10);

// Switch values depend on universe, set before sending reply->reply_net_sw = 0x00; reply->reply_sub_sw = 0x00;

reply->reply_oem_h = 0x00; // TODO add assigned oem code reply->reply_oem_l = 0x00;

reply->reply_ubea_ver = 0x00;

// Indicators in Normal Mode // All or part of Port-Address programmed by network or Web browser reply->reply_status_1 = 0xE0;

reply->reply_esta_man = 0x0000;

strlcpy((char )(reply->reply_short_name), serverDescription, 18); strlcpy((char )(reply->reply_long_name), serverDescription, 64);

reply->reply_node_report[0] = '\0';

reply->reply_num_ports_h = 0x00; reply->reply_num_ports_l = 0x01; // One output port

reply->reply_port_types[0] = 0x80; // Output DMX data reply->reply_port_types[1] = 0x00; reply->reply_port_types[2] = 0x00; reply->reply_port_types[3] = 0x00;

// No inputs reply->reply_good_input[0] = 0x00; reply->reply_good_input[1] = 0x00; reply->reply_good_input[2] = 0x00; reply->reply_good_input[3] = 0x00;

// One output reply->reply_good_output_a[0] = 0x80; // Data is being transmitted reply->reply_good_output_a[1] = 0x00; reply->reply_good_output_a[2] = 0x00; reply->reply_good_output_a[3] = 0x00;

// Values depend on universe, set before sending reply->reply_sw_in[0] = 0x00; reply->reply_sw_in[1] = 0x00; reply->reply_sw_in[2] = 0x00; reply->reply_sw_in[3] = 0x00;

// Values depend on universe, set before sending reply->reply_sw_out[0] = 0x00; reply->reply_sw_out[1] = 0x00; reply->reply_sw_out[2] = 0x00; reply->reply_sw_out[3] = 0x00;

reply->reply_sw_video = 0x00; reply->reply_sw_macro = 0x00; reply->reply_sw_remote = 0x00;

reply->reply_spare[0] = 0x00; reply->reply_spare[1] = 0x00; reply->reply_spare[2] = 0x00;

// A DMX to / from Art-Net device reply->reply_style = 0x00;

Network.localMAC(reply->reply_mac);

for (uint8_t i = 0; i < 4; i++) { reply->reply_bind_ip[i] = localIP[i]; }

reply->reply_bind_index = 1;

// Product supports web browser configuration // Node’s IP is DHCP or manually configured // Node is DHCP capable // Node supports 15 bit Port-Address (Art-Net 3 or 4) // Node is able to switch between ArtNet and sACN reply->reply_status_2 = (staticIP[0] == 0) ? 0x1F : 0x1D;

// RDM is disabled // Output style is continuous reply->reply_good_output_b[0] = 0xC0; reply->reply_good_output_b[1] = 0xC0; reply->reply_good_output_b[2] = 0xC0; reply->reply_good_output_b[3] = 0xC0;

// Fail-over state: Hold last state // Node does not support fail-over reply->reply_status_3 = 0x00;

for (uint8_t i = 0; i < 21; i++) { reply->reply_filler[i] = 0x00; } }

void sendArtnetPollReply(ArtPollReply *reply, IPAddress ipAddress, uint16_t portAddress) { reply->reply_net_sw = (uint8_t)((portAddress >> 8) & 0x007F); reply->reply_sub_sw = (uint8_t)((portAddress >> 4) & 0x000F); reply->reply_sw_out[0] = (uint8_t)(portAddress & 0x000F);

sprintf((char *)reply->reply_node_report, "#0001 [%04u] OK - WLED v" TOSTRING(WLED_VERSION), pollReplyCount);

if (pollReplyCount < 9999) { pollReplyCount++; } else { pollReplyCount = 0; }

notifierUdp.beginPacket(ipAddress, ARTNET_DEFAULT_PORT); notifierUdp.write(reply->raw, sizeof(ArtPollReply)); notifierUdp.endPacket();

reply->reply_bind_index++; }

davidd1205 commented 1 year ago

release.zip

davidd1205 commented 1 year ago

e131.cpp.zip

dzelionis commented 1 year ago

@davidd1205 thanks zip would do a job. i will try it later on.

tomte76 commented 1 year ago

@tomte76 can you share your fix for pollreply in detail, what line has to be modified and what code has to be added? as my c skills is not great :D Thanks

I did the same @davidd1205 did and posted above.

dzelionis commented 1 year ago

@davidd1205 , failing to compile with you e131 file:

Building in release mode
Compiling .pio/build/esp32dev/src/e131.cpp.o
Compiling .pio/build/esp32dev/src/wled00.ino.cpp.o
wled00/e131.cpp: In function 'void handleE131Packet(e131_packet_t*, IPAddress, byte)':
wled00/e131.cpp:264:10: error: 'DMX_MODE_SEGMENTS_RGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGBW:
          ^
wled00/e131.cpp:265:10: error: 'DMX_MODE_SEGMENTS_DRGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGBW:
          ^
wled00/e131.cpp:266:10: error: 'DMX_MODE_SEGMENTS_RGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGB:
          ^
wled00/e131.cpp:267:10: error: 'DMX_MODE_SEGMENTS_DRGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGB:   
          ^
wled00/e131.cpp:299:10: error: 'DMX_MODE_SEGMENTS_EFFECT' was not declared in this scope
     case DMX_MODE_SEGMENTS_EFFECT:  //TODO maybe by mx
          ^
wled00/e131.cpp: In function 'void handleArtnetPollReply(IPAddress)':
wled00/e131.cpp:330:10: error: 'DMX_MODE_SEGMENTS_RGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGBW:
          ^
wled00/e131.cpp:331:10: error: 'DMX_MODE_SEGMENTS_DRGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGBW:
          ^
wled00/e131.cpp:332:10: error: 'DMX_MODE_SEGMENTS_RGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGB:
          ^
wled00/e131.cpp:333:10: error: 'DMX_MODE_SEGMENTS_DRGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGB:
          ^
wled00/e131.cpp:334:10: error: 'DMX_MODE_SEGMENTS_EFFECT' was not declared in this scope
     case DMX_MODE_SEGMENTS_EFFECT:
          ^
*** [.pio/build/esp32dev/src/e131.cpp.o] Error 1
=========================================================================================== [FAILED] Took 6.35 seconds ===========================================================================================

Processing esp32_eth (board: esp32-poe; platform: espressif32@3.5.0; framework: arduino)

any ideas ?

dzelionis commented 1 year ago

Have requested 3 new fixtures from sound switch for 15ch , 18ch and 2ch preset modesÂ…, i can see the first one popped up (15ch onw) ....i think work is still in progress... image

tomte76 commented 1 year ago

@davidd1205 , failing to compile with you e131 file:

Building in release mode
Compiling .pio/build/esp32dev/src/e131.cpp.o
Compiling .pio/build/esp32dev/src/wled00.ino.cpp.o
wled00/e131.cpp: In function 'void handleE131Packet(e131_packet_t*, IPAddress, byte)':
wled00/e131.cpp:264:10: error: 'DMX_MODE_SEGMENTS_RGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGBW:
          ^
wled00/e131.cpp:265:10: error: 'DMX_MODE_SEGMENTS_DRGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGBW:
          ^
wled00/e131.cpp:266:10: error: 'DMX_MODE_SEGMENTS_RGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGB:
          ^
wled00/e131.cpp:267:10: error: 'DMX_MODE_SEGMENTS_DRGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGB:   
          ^
wled00/e131.cpp:299:10: error: 'DMX_MODE_SEGMENTS_EFFECT' was not declared in this scope
     case DMX_MODE_SEGMENTS_EFFECT:  //TODO maybe by mx
          ^
wled00/e131.cpp: In function 'void handleArtnetPollReply(IPAddress)':
wled00/e131.cpp:330:10: error: 'DMX_MODE_SEGMENTS_RGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGBW:
          ^
wled00/e131.cpp:331:10: error: 'DMX_MODE_SEGMENTS_DRGBW' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGBW:
          ^
wled00/e131.cpp:332:10: error: 'DMX_MODE_SEGMENTS_RGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_RGB:
          ^
wled00/e131.cpp:333:10: error: 'DMX_MODE_SEGMENTS_DRGB' was not declared in this scope
     case DMX_MODE_SEGMENTS_DRGB:
          ^
wled00/e131.cpp:334:10: error: 'DMX_MODE_SEGMENTS_EFFECT' was not declared in this scope
     case DMX_MODE_SEGMENTS_EFFECT:
          ^
*** [.pio/build/esp32dev/src/e131.cpp.o] Error 1
=========================================================================================== [FAILED] Took 6.35 seconds ===========================================================================================

Processing esp32_eth (board: esp32-poe; platform: espressif32@3.5.0; framework: arduino)

any ideas ?

I assume you are not using the code containing the "segments rgb" part. As I understand the situation at the moment there is an official pull request to WLED with the "segments effect" code. But this pull request does not contain the code for "segments rgb". As I am more interested in "segments rgb" I checked out this code to test with "segments rgb"

https://github.com/max9901/WLED.git

I works fine. Also with the latest SoundSwitch and Engine DJ 2.4.0. I would really love to see a pull request for "segments rgb" to WLED master. At the moment I am always manually applying the patches from the code above to the latest checkout of WLED master as I am not really a git magican.

dzelionis commented 1 year ago

@tomte76 , i am using @mxklb beta test code, and i just was trying to see if @davidd1205 e131.cpp patch would fix a pool replay issue, but its not critical for me as i have plan b witch is working just perfectly (my python pool replay script).... anyway key is @mxklb did a fantastic job, which makes a big difference for me!

davidd1205 commented 1 year ago

Hi @dzelionis

yes I had asked Liam to make the 15-channel wled file and he told me that he had done it but I only asked for this one, I don't understand the error you have with the rgb segment me it works take the bin file directly in my zip you will see that it works after with rgb segment I divide my leds into 10 and I use 10 strip controller with 30 channel suddenly and it's not too bad, I will test the multi segment effect also with the wled 15 channel because with the 11 the colors were not respected

dzelionis commented 1 year ago

@davidd1205, yep with a new 15 channel fixture its looks like all works as expected so far....

dzelionis commented 1 year ago

Christmas time !!! https://drive.google.com/file/d/148RZj5ft1UeAyNpL-AekwZstIsyj_bJS/view?usp=share_link

Coffeetube commented 11 months ago

Hello, I am brand new to WLED and the ESP32. First of all many thanks to all. I have found a lot of helpful information for my project. But since I am still quite new in the matter I thought after numerous failed attempts I just ask.

Can someone tell me if it is possible to merge the WLED versions of Moonmodulues and max9901 in principle?

I need the hardware DMX input from Moonmodules and the RGB segment function of max9901 for my project.

I have already successfully installed the MoonModules Version on my ESP32 and manage to control my 2m WS2811 (12V 96LEDs/m) via cable DMX with a Max485 as well as a Levelshifter. But there is no possibility to group the pixels to save adresses.

I want to control about 10 pieces of 2 meter long Ws2811 strips with Soundswitch. But in Soundswitch I have only a little more than half a DMX universe available.

With the WLED segment RGB variant of max9901 it is also easily possible to divide the strip simply into 8 segments. The 2 meters have 192 Leds but the ws2811 are combined in groups of 3. With the 8 segments I would then have instead of 192 DMX addresses only 24 per 2m strip and could easily control 10 of them with Soundswitch. Also with this version I managed to control the strip as described directly over Artnet via Wlan. Perfect. But I want to use the hardware DMX input.

In my attempts I have only managed to compile and sucessfully install the official Aircookie WLED variant with DMX output with the current version of PlatformIO.

If I just try to compile the code from MoonModules or max9901 there are already error messages when I open the folder about Platformio.ini and it loads for ever and building is not possible. With older versions of PlformIO (2.5.5) it at least it opens and starts to do something when compiling but then there are also error messages etc.. After a few days of failed attempts even with these mini steps I have now given up on it.

So here is the question. Is it in principle possible to combine the two variants and is this a very hard task?

I have used these binaries with success:

from davidd1205 with segment RGB (because I didn't manage to compile the code myself) https://github.com/Aircoookie/WLED/files/10199906/release.zip

Here are the links to the code of the two variants

DMX wired input: https://github.com/MoonModules/WLED/releases

Segments RGB (Pixel cobine): https://github.com/max9901/WLED

It would be awesome if someone could point me in the right direction or could even help me to combine the two variants to get a bin with both features.

Thank you very much Marc

dzelionis commented 11 months ago

Hello, I am brand new to WLED and the ESP32. First of all many thanks to all. I have found a lot of helpful information for my project. But since I am still quite new in the matter I thought after numerous failed attempts I just ask.

Can someone tell me if it is possible to merge the WLED versions of Moonmodulues and max9901 in principle?

I need the hardware DMX input from Moonmodules and the RGB segment function of max9901 for my project.

I have already successfully installed the MoonModules Version on my ESP32 and manage to control my 2m WS2811 (12V 96LEDs/m) via cable DMX with a Max485 as well as a Levelshifter. But there is no possibility to group the pixels to save adresses.

I want to control about 10 pieces of 2 meter long Ws2811 strips with Soundswitch. But in Soundswitch I have only a little more than half a DMX universe available.

With the WLED segment RGB variant of max9901 it is also easily possible to divide the strip simply into 8 segments. The 2 meters have 192 Leds but the ws2811 are combined in groups of 3. With the 8 segments I would then have instead of 192 DMX addresses only 24 per 2m strip and could easily control 10 of them with Soundswitch. Also with this version I managed to control the strip as described directly over Artnet via Wlan. Perfect. But I want to use the hardware DMX input.

In my attempts I have only managed to compile and sucessfully install the official Aircookie WLED variant with DMX output with the current version of PlatformIO.

If I just try to compile the code from MoonModules or max9901 there are already error messages when I open the folder about Platformio.ini and it loads for ever and building is not possible. With older versions of PlformIO (2.5.5) it at least it opens and starts to do something when compiling but then there are also error messages etc.. After a few days of failed attempts even with these mini steps I have now given up on it.

So here is the question. Is it in principle possible to combine the two variants and is this a very hard task?

I have used these binaries with success:

from davidd1205 with segment RGB (because I didn't manage to compile the code myself) https://github.com/Aircoookie/WLED/files/10199906/release.zip

Here are the links to the code of the two variants

DMX wired input: https://github.com/MoonModules/WLED/releases

Segments RGB (Pixel cobine): https://github.com/max9901/WLED

It would be awesome if someone could point me in the right direction or could even help me to combine the two variants to get a bin with both features.

Thank you very much Marc

Hey, you don't need to compile it as the official release has all that stuff built in...... just check for documentation, you can make your own custom map of led positions and what actual order it is...also by default if you select dmx + segments , you would specify first dmx adress and then each segment woulld +18 if i remember correctly...have fun

Coffeetube commented 11 months ago

Thanks for your answer. So with MoonModules (because I need hardware DMX in) I could do that? Great, I will check that out!

Coffeetube commented 11 months ago

custom map of led positions

Thanks for your help but that seems not to work. Or maybe I'm doing it wrong. I don't want to change the order of the leds on my strip. But group them together to save dmx channels.

I don't think it is possible with the ledmap.json to build groups of leds. i tried this: {"map":[0-7,8-15,16-23,24-31,32-39,40-47,48-55,56-63]}

But this does just set single pixels (each 3 leds) on the 25, 49 led at my stripe. only the first pixel (3 leds) illuminates the others are dark if controlled with dmx. But I would like the rest of the pixels in each of the 8 segments to light up to Maybe i´m describing it wrong.

In the normal WLED version I can only choose Multi RGB. Unfortunately there is no Segment RGB controll in the DMX sync settings. But that or a workaround that does the same would be needed in combination with wired dmx input control.

dzelionis commented 11 months ago

There is "Grouping and Spacing" topic documented on https://kno.wled.ge/features/segments/ Best of luck Domas

dzelionis commented 11 months ago

FYI image image image image

I hope it helps dzelionis

dzelionis commented 11 months ago

also i have just built a MM version, and it looks it has settings as well: image image image

dzelionis commented 11 months ago

Thanks for your answer. So with MoonModules (because I need hardware DMX in) I could do that? Great, I will check that out!

why you not use artnet as dmx ?

Coffeetube commented 11 months ago

There is "Grouping and Spacing" topic documented on https://kno.wled.ge/features/segments/ Best of luck Domas

Thank you for all the detailed info and taking the the time to post pictures. I'm aware of the DMX Mode Effect Segment. But it eats a lot of DMX adresses. If I want to control only 8 segments (or pixel groups) on each 2 meter strip it would use 144 adresses. I would only like to control each pixel or segment with 3 Adresses for R, G, B. (24 adresses) And also the Effect Segment mode unfortunately ads a lot of latency compared to the Multi RGB or Single RGB mode when I tested it. I admit because it is not a live mode?

The Segment grouping as described does not work for the DMX mode: Multi RGB. In this mode every Pixel of my Led stripe needs 3 adresses when controlled via DMX (192 adresses for 2 meters). No matter how I group segments. In the WLED version from Max9901 he added a "Segment RGB" Mode. This works exactly how I would need it (24 adresses for 8 pixels on 2 meters with no noticeble latency). But unfortunatly this version does not support wired DMX input. What I would also need.... :-(

dzelionis commented 11 months ago

Multi RGB mode was never designed to work with segments...thats one of very first dmx modes introduced to wled far as i remember.... i still not sure why you care so much about addresses.....use wifi or lan esp32 via artnet .... make some esp32 dmx in to artnet converter (https://github.com/markusb/esp-dmx) there is tones of projects like this, i just grabbed very first :D .... Artnet protocol can address 32768 DMX "universes", each of 512 channels, limited by bandwidth. Regarding latency i have no issues unless there is some noise in wifi, so you need to make sure you wifi connection is running on proper speeds between esp32 and router....i am controling 1567 ws281x splited over 6 gpio pins and segmented into 12 segments.... if you run it in multi RGB mode you loose wled effects.....so i am not sure if thats what you looking for....

If i run Resolume and i want to render some video on my pixels....then i would use multi RGB.....

so i am not sure if that info is any good for you....

Coffeetube commented 11 months ago

Thank you very much again. For DJing I use a Macbook with Serato an Soundswitch on it. If I enable Wifi on the Macbook Serato has audio glitches sometimes. So I only would like to use my Soundswitch usb to DMX dongle. I have some wireless dmx transceivers built into all my other fixtures. They have a long range and work perfect and I don`t need a Wifi Network. That is what I plan to to with multiple 2meter LED tubes controlled by WLED. I just want to control them with Soundswitch. I don't need Effects.

But another ESP with DMX or Ethernet input to transmit into Artnet would be a possible solution. The projects I found always receiveing Artnet and only output DMX. I need the other way araound. But then I would need Wifi again. And always change the Wifi settings of the LED Tubes ESP32 to the Wifi of the different locations will take to long. Or could I use the WIfi point provided by the esp32 to send Artnet to the other Esp32?

dzelionis commented 11 months ago

My setup is similar, i am using soundswitch + Denon Prime4 + wled + other stuff.... you can check my video collection on gdrive.... https://drive.google.com/drive/folders/1wTOyHKRTKP8_p7d73bdmYTKmweb978kM?usp=drive_link But i still not fully following you, are you using WS281x led strips ? if answer is yes, you dont want to loose ability to use wled effects, as soundswitch is not made for controlling smart led's individually, you want to create some attributes on soundswitch to controll wled's effects for segments, and then use it on autoscript or autoloops.....otherwise it s waste of ws281x ... but i still not get why you need moodmolues and sound-reactive stuff...as sound switch would do it perfectly for you...with effects and segments :D Also you may have some trouble detecting wled on soundswitch as artnet device...if you do let me know i have a work around that i can share...

tomte76 commented 11 months ago

Why should this be waste of ws281x? SoundSwitch is great in scripting chases and I can fully understand the point that someone would just like to use segments of a stripe as a RGB fixture. In my case I have 3m stripes with ws2811. These consists of 300 LEDs. I patched the WLED code to use MultiRGB to always group 30 LEDs into one RGB group. This will create 10 "virtual washers" on the 5m stripe. I can then add every 50cm segment (containing 30 LEDs) as a 3 channel RGB fixture in SoundSwitch. I can group them into washer or spot groups and can handle them like normal washer. Even autoscript seems to be clever enough to understand that and creates chases on both groups. If I manually script them I can do what I want as I can do with several RGB fixtures. And if I play my scripts directly from the control one or the mixstream pro all WS28xx effects are always in sync with the light show and sound. I really love the strobe effects as I have one stripe left and one right and one in the front. The strobe effect is so bright and intense, even with color changes on every flash. Looks very impressive. So I think there would be a need for this mode. And it would be very nice to have it configurable in WLED as there might be other situations where I want WLED effects or WLED sound reactive with or without DMX. It is like the most comsumer fixtures do. They have auto mode or sound mode but they can also behave as a dump RGB fixture with only a few channels and no magic at all.

dzelionis commented 11 months ago

@Coffeetube, as a workaround for your mac wifi issue, there is simple solution use a lan cable + any home wifi router to get esp connected to a lan and then use artnet on soundswitch for controlling wled as lan wifi devices ...

tomte76 commented 11 months ago

@Coffeetube I stopped my patch development because the transition to the new WLED version was in full swing. I didn't want to rebase all the time. I just stuck with my quick in dirty version. Once the new WLED has been released and things have calmed down a bit, I'll be happy to try applying my patch to the current version. However, I haven't developed a GUI integration yet. I simply adapted the code so that MultiRGB groups the LEDs according to a fixed divider.

dzelionis commented 11 months ago

@tomte76 ,it's a waste because you could have your washes of 30 leds to have some nice wled effects + chases for your group of washes...if you use segment dmx mode + soundswitch attribues to change effects for segments.. thats not possible in multi RGB mode...so if you use ws281x as normal RGB strips which has no brains (chip) is that not a waste ?

dzelionis commented 11 months ago

@tomte76 , check this out, https://drive.google.com/file/d/13IPoxnold4-VvtB7MXPqSkKAQ-U55BOv/view?usp=sharing Around my disco ball its one dmx fixture (one segment), but some wled effects are applyed by sound switch. So thats what i call not a waste of ws281x :D sorry about the mess around as just have my aircon install completed, doing some paint work atm :D

Coffeetube commented 11 months ago

@Coffeetube, as a workaround for your mac wifi issue, there is simple solution use a lan cable + any home wifi router to get esp connected to a lan and then use artnet on soundswitch for controlling wled as lan wifi devices ...

thats a good idea. I will try this. thank you