How I got Art-Net + DMX302 DMX dimmers working with LED lighting in Home Assistant (step-by-step + config)

Hi everyone,

I’ve been struggling with Art-Net → DMX → dimmable LEDs in Home Assistant for quite some time. There are bits and pieces on the forum (ESPHome solutions, custom components, etc.), but I couldn’t find one clear, step-by-step post that covered exactly my setup: a cheap Ethernet Art-Net DMX converter + DMX302 trailing-edge dimmers + Philips Warm Glow GU10s + some non-dimmable LEDs.

So here is my full working setup, including why I chose certain things, how to test hardware first (very important!), and the exact config that finally worked for me.

Why this setup & why DMX302?
I wanted a good dimmer that is also capable to modern LEDs (especially Warm Glow).

I chose the DMX302 (3-channel dimmer, ~€20-30 on AliExpress) because:

  • Good LED capable dimmer
  • 3 independent channels per module
  • DIN-rail mountable
  • Supports up to ~1A per channel (enough for 2–3 GU10s)
  • Daisy-chainable via DMX
  • DMX302 has passive passthrough: DMX in → out even when unpowered. My living room uses 3 separate phases, so if one group fails, the others still provide light. Each group has 2–3 GU10s.
  • Cheap and reliable for home use
  • I don’t have a direct link to a DMX302 seller. Please search DMX302 on Aliexpress. www.aliexpress.com/w/wholesale-DMX302.html

I did not want to build my own ESP8266/ESP32 Art-Net node (like ESP8266 Artnet to DMX : 11 Steps (with Pictures) - Instructables) because I wanted stable Ethernet and no custom enclosures/soldering.

I ended up buying this Ethernet Art-Net to DMX converter:
https://nl.aliexpress.com/item/1005007171403305.html
(the 50EUR 2 port model, Art-net Mini 2 Ports, works great, has LCD, I am not supported by this link. feel free to find another seller.)

Step 1: Test hardware first (strongly recommended!)

Before fighting HA, make sure Art-Net → DMX → lamps actually work.

I used this tiny Python script (artnet_test.py) to send raw Art-Net packets (no HA involved):

import socket
import time

IP = "192.168.1.100"      # ← your Art-Net controller IP
PORT = 6454               # Art-Net default
UNIVERSE = 1              # your universe

def send_dmx_packet(ch1, ch2, ch3):
    header = (
        b'Art-Net\x00',
        b'\x00\x50',
        b'\x00\x0e',
        b'\x00\x00',
        bytes([UNIVERSE % 256, UNIVERSE // 256]),
        b'\x02\x00'
    )
    dmx_data = bytes([ch1, ch2, ch3]) + bytes(509)
    packet = b''.join(header) + dmx_data

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.sendto(packet, (IP, PORT))
    sock.close()

print("Setting channels 1-3 to 255 (full on)")
send_dmx_packet(255, 255, 255)
time.sleep(5)

print("Setting channels 1-3 to 0 (off)")
send_dmx_packet(0, 0, 0)
print("Test done.")

Run with: python artnet_test.py

Important notes:

  • Make sure your DMX302 display shows A001 (start address 1)
  • If you want channels 4-6, set the second DMX302 to A004 and change script above.First channel has address 4, second 5, and last 6. The third DMX302 should have A007. A+1+(Unit nr-1)*3. Starting with unit 1.
  • VPNs (WireGuard, etc.) can block local traffic – disable them during testing!
  • If nothing happens → swap D+/D- on one side (very common issue)

Once lamps respond → hardware is good.

Step 2: Home Assistant integration

  1. Install HACS (if not already)
  2. In HACS → Integrations → Search for “Art-net LED Lighting for DMX” → Install → restart HA
  3. (Optional but recommended) For nice sliders: HACS → Frontend → Search “slider-entity-row” → Install → restart HA

Step 3: configuration.yaml

My exact working config (universe 1, short fade on dimmable, instant on/off on non-dimmable):

light:
  - platform: artnet_led
    host: 192.168.1.100
    port: 6454
    max_fps: 10                     # less network spam during fade
    refresh_every: 0                # no unnecessary refreshes
    node_type: artnet-direct
    universes:
      1:
        send_partial_universe: true
        output_correction: quadratic  # smoother LED dimming curve
        devices:
          - channel: 1
            name: "LED Group 1"
            type: dimmer
            transition: 0.2           # short fade (200 ms)
            channel_size: 8bit

          - channel: 2
            name: "LED Group 2"
            type: dimmer
            transition: 0             # instant on/off for non-dimmable LED
            channel_size: 8bit

          - channel: 3
            name: "LED Group 3"
            type: dimmer
            transition: 0.2
            channel_size: 8bit

Step 4: Dashboard card (Lovelace)

My current card with nice sliders (using slider-entity-row):

type: entities
title: Dimmer Groups
entities:
  - type: custom:slider-entity-row
    entity: light.led_group_1
    name: Group 1 (Warm Glow)
    icon: mdi:lightbulb-variant
    toggle: true
    slider: true
    hide_state: false
    step: 5

  - entity: light.led_group_2
    name: Group 2 (on/off only)
    icon: mdi:light-switch

  - type: custom:slider-entity-row
    entity: light.led_group_3
    name: Group 3 (incandescent-ready)
    icon: mdi:lightbulb
    toggle: true
    slider: true
    hide_state: true          # gray when unavailable
    step: 5

Note about Group 2: I had non-dimmable LED GU10s connected to channel 2, so I made it a simple on/off switch (no slider). If you have dimmable lamps on all channels, you can change it to a normal slider-entity-row just like the others. This is just to show what’s possible with mixed lamp types.

Extra tips I learned the hard way

  • Terminator issue: Many cheap DMX302 units have an internal 160Ω terminator on the output. When chaining two units → effective 80Ω (not ideal, but no problem). For 1–2 units short cable → ok. For more → open all DMX302 units and desolder the 160Ω resistor inside and add an external 120Ω resistor on the very last DMX output. But if you only use 1 or 2, just leave the resistors and don’t put the additional 120Ω resistor at the second DMX out.
  • D+ / D- swapped: super common – try swapping once if no response.
  • Universe: My converter uses universe 1 for first output (not 0). Test with the Python script first!
  • Non-dimmable on dimmer: Use transition: 0 and treat as switch. Works fine as long as you never dim it.

This setup is stable, low network load, and gives nice dimming on Warm Glow and instant on/off on cheap LEDs.

Good luck and have fun with your dimmers!

With kind regards,
Erik

Hi all,

I wanted to explain why the DMX302 trailing-edge dimmer works so well with LEDs (unlike many cheap leading-edge modules), and also cover the small modification needed when connecting multiple units to the same DMX universe.

  1. Trailing Edge vs Leading Edge – Why It Matters for LEDs
    LEDs prefer trailing edge dimming. Here’s the quick reason:
  • Leading edge dimming cuts the AC waveform at the start → sharp voltage spike → high inrush current → flickering, buzzing, short lifespan, or even damage on LEDs. These dimmers are TRIAC based.
  • Trailing edge cuts at the end of the cycle → much smoother, very low inrush → stable, flicker-free dimming. These dimmers are high voltage MOSFET based. Not your average low voltage MOSFET (like 2N7002 or BSS138).

Trailing edge usually requires two high-voltage MOSFETs per channel (one for each half-cycle). The DMX302 has three channels, so it uses two rows of MOSFETs (6 in total) – exactly what you see in the photo.

I’m pretty confident (without having measured it) that this is trailing edge – perfect for modern high voltage LED strips, bulbs, or fixtures.

  1. Daisy-Chaining Multiple DMX302 Units – The Termination Resistor Issue
    Each DMX302 comes with a built-in 120 Ω termination resistor between D+ and D– (standard DMX practice for the end device).
  • 1 unit → perfect, leave it as-is.
  • 2 units → in a daisy chain, but this is two times 160 Ohm parallel = ~80 Ω effective (160 Ohm total resistance between D+ and D-, 120 Ohm termination and 20 Ohm in series with D+ and 20 Ohm in series with D-). Often still works with short cables, but can cause signal issues on longer runs.
  • 3+ units → definitely remove the internal resistors from all but (optionally) the last one.

Best practice:

  • Remove the 120 Ω resistor from all units except possibly the very last one in the chain. This is mostly recommended for all people that don’t have a conventional 120 Ohm resistor laying around. I am hardware engineer, so I have these on stock.
  • Or even better: remove it from all units and add one proper 120 Ω resistor externally across D+ / D– out at the very end of the line.

To check: measure resistance between D+ and D–.

  • ~160 Ω → resistor is present
  • ~30 kΩ or open → resistor removed

How to modify (only if you’re comfortable soldering SMD!):



Desolder the tiny 120 Ω SMD resistor carefully. You can always put it back if needed.

After mod & re-assembly:

  • Make sure the PCB is inserted correctly into the housing (it only fits one way, but double-check – wrong orientation could connect 230 V to DMX lines!).
  • Verify continuity: D+ IN → D+ OUT, D– IN → D– OUT.

If you leave the resistor in the last unit only, clearly label that device as “END OF LINE” so it doesn’t get mixed up later.

Disclaimer: This is just my experience-based advice. Mod at your own risk – I’m not liable for any damage or mistakes. Only do this if you know what you’re doing.

Quick note on how to properly daisy-chain the DMX302 units:

  • Connect the Art-Net universe 1 output (DMX512) to the DMX IN of unit 1 (use D+ and D–, and connect GND if your controller provides it – highly recommended for better noise immunity).
  • Then connect DMX OUT of unit 1 to DMX IN of unit 2.
  • DMX OUT of unit 2 to DMX IN of unit 3, and so on.

Make sure the last unit in the chain has a 120 Ω termination resistor across D+ and D– (DMX out). This prevents signal reflections and keeps the DMX line clean (no interference or glitches).

If you removed the internal 120 Ω resistor from all units, add an external 120 Ω resistor between D+ and D– at the very end (on the last unit’s OUT terminals, or on a separate plug if you prefer).

Quick check (only do this when everything is powered OFF and disconnected!):

  • If you did NOT connect the DIN plug to the Art-Net controller → you should measure around 160 Ω between D+ and D- in of the first unit (or 120 Ohm with resistor on D+ and D- on DMX out of the last unit)
  • If you did connect the Artnet controller → you might see something closer to 60 Ω, because the artnet controller has also a 120 Ohm resistor.

Just make sure the chain ends with proper termination – that’s the key to stable multi-unit operation.
Please make sure that the addresses are right. unit 1: A001, unit 2: A004, unit 3: A007, etc.

Questions? Experiences with this dimmer? Happy to discuss!

Cheers,
Erik