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
- Install HACS (if not already)
- In HACS → Integrations → Search for “Art-net LED Lighting for DMX” → Install → restart HA
- (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




