Creative Lighting eDIDIO (DALI/DMX)
Driver: edidio
Local control of the Creative Lighting eDIDIO Series 10 (Control Freak range) Ethernet DALI/DMX lighting controller. One controller drives a whole DMX universe and/or DALI lines; each GEM zone is an individual fixture carrying a fixture_mode (dimmer / rgb / rgbw / dali). The driver reads live channel levels back from the controller for state confirmation.
:::note Not the Art-Net path
This driver is distinct from the Art-Net DMX path (generic_dmx / dmx_rgbw). The eDIDIO speaks Protocol Buffers over TLS on TCP 443 with a custom 0xCD | length frame header, a persistent connection, and a keep-alive — it is not an Art-Net node. Use this driver for eDIDIO hardware; use the Art-Net drivers for Enttec ODE / Art-Net nodes.
:::
Prerequisites
- A Creative Lighting eDIDIO Series 10 controller reachable on the LAN from the GEM server.
- TCP 443 open from the GEM server to the controller (the controller ignores non-
0xCDtraffic, so port scanners and HTTP probes show nothing). - For DMX fixtures: the DMX wiring/addressing already commissioned on the controller. For DALI: a commissioned DALI line with short addresses assigned.
Setup
- In GEM, System → Devices → Add Device with driver
edidio. - Set
ipto the controller's LAN IP (or hostname). Leaveportat443unless you have changed it. - Save and reload. The driver connects over TLS, reads firmware/hardware/line layout, and logs
edidio connected: <id> <name> <ip> <port>. - On first connect the driver runs
sync_zonesautomatically, auto-creating one GEM zone per fixture found in the controller's commissioned Spektra fixture profile. You can re-run it anytime with thesync_zonescommand. - For fixtures you create by hand, set
zone.addressandfixture_mode(see below).
Addressing
zone.address depends on the fixture mode:
- DMX fixtures (
fixture_mode=dimmer/rgb/rgbw) — the 1-based starting DMX channel (1–512).dimmeroccupies 1 channel,rgboccupies 3 consecutive channels,rgbwoccupies 4 (address + the next 3). Anrgbwfixture's address therefore cannot exceed 509. - DALI fixtures (
fixture_mode=dali) — the DALI short address (0–63) on the line set bydali_line.
Attributes
Device
| Attribute | Required | Default | Description |
|---|---|---|---|
ip | yes | — | Controller LAN IP or hostname. |
port | no | 443 | Protobuf-over-TLS port. |
universe_mask | no | 1 | Binary mask of DMX universes to drive. Universe 1 = 1, universe 2 = 2, both = 3. |
fade_ms | no | 0 | Default DMX fade duration (ms) applied to level/color changes. 0 = instant. |
status_poll_ms | no | 5000 | How often to read the controller's DMX level cache and sync each zone's level/color/white/state for changes made outside GEM (keypads, Spektra scenes, another DMX master). 0 disables polling. See Out-of-band sync. |
default_subsystem | no | light | Subsystem sync_zones places auto-created fixtures under (matched by name substring). |
secure_username | no | — | Only if the controller has Secure Session enabled (currently stubbed — see below). |
secure_password | no | — | Secure Session password (encrypted). Only if Secure Session is enabled. |
Runtime-populated (read-only, reported by the controller): firmware, hardware, temperature (chip °C), battery (backup battery mV), controller_lines (line types, e.g. dmx,empty).
Zone
| Attribute | Default | Description |
|---|---|---|
fixture_mode | rgbw | How the fixture maps onto the controller: dimmer (1 ch), rgb (3 ch), rgbw (4 ch), or dali (a DALI short address on dali_line). |
dali_line | 1 | DALI line number (1–8) for fixture_mode = dali. |
default_white | 255 | White channel level (0–255) used when turning on without a stored color (rgbw only). |
fade_ms | — | Per-zone fade duration override (ms). 0 = instant. Falls back to the device default. |
Runtime-populated (read-only, written by the driver): red, green, blue, white (0–255), color (hex), level (0–100), state (on/off).
Commands
| Command | Args | Effect |
|---|---|---|
on | address | Turn the fixture on (restores its last color/level). |
off | address | Turn the fixture off. |
level | address, level | Set brightness 0–100 (hue preserved for color fixtures). |
color | address, color | Set hex color #RRGGBB (rgb/rgbw fixtures). |
white | address, white | Set the white channel 0–255 (rgbw fixtures). |
rgbw | address, red, green, blue, white | Set raw R/G/B/W channel values 0–255. |
recall_scene | address, scene | Recall a DALI scene (0–15) on a dali fixture. |
all_on | — | DMX broadcast all configured fixtures to full. |
all_off | — | DMX broadcast all configured fixtures off. |
sync_zones | — | Auto-create GEM zones from the controller's Spektra fixture profile. Idempotent. |
refresh | — | Re-read firmware, lines, temperature, and battery from the controller. |
trigger | type, value, index, line | Run an arbitrary eDIDIO TriggerType (advanced). |
sync_zones
sync_zones reads the controller's commissioned Spektra fixture profile and the authoritative CONTROLLER_LINES layout, then creates one GEM zone per fixture under the lighting subsystem. It is additive and idempotent:
- Existing zone addresses are skipped — never modified or removed.
- Fixtures are deduped by address, so a factory-default profile (every Spektra zone pointing at one fixture) collapses to a single zone.
- DMX fixtures are created with the matching
fixture_modederived from their channel count; DALI fixtures are created withfixture_mode = daliand the resolveddali_line. - Every auto-created zone gets the
dmx_rgbwzone control, so it renders with the RGBW color/level UI. That control readsfixture_modeand only shows the white slider forrgbwfixtures (dimmer/rgb/dalishow level and color only).
Out-of-band sync
The driver polls the controller's DMX level cache on an interval (status_poll_ms, default 5 s) and reconciles each DMX zone's level / color / white / state with reality, so changes made outside GEM — wall keypads, recalled Spektra scenes, or another DMX master on the line — show up in the UI.
- Change detection compares the live channels against what GEM expects given the zone's stored attributes. A match means nothing external happened, so the zone's own color/level decomposition is left untouched (a fixture at an arbitrary hue is never "corrected" just because its brightest channel is below full). Only a genuine mismatch rewrites the zone.
- The poll self-reschedules, survives auto-reconnects, and stops cleanly on disconnect. Set
status_poll_msto0to disable it entirely. - DMX only. DALI fixtures are skipped — the DALI status cache is unverified against hardware.
Known limitations
- Weak TLS certificate. The controller uses a self-signed RSA-1024 certificate, so TLS verification is disabled by design.
- DALI is coded to spec but not hardware-verified. The DALI command/scene paths and DALI zone auto-create follow the eDIDIO/DALI specification but have not been validated against live DALI hardware (the reference unit is DMX-only). The DMX path is verified.
all_on/all_offfollow the controller's profile. DMX broadcast acts on the controller's Spektra fixture profile, not GEM's per-zone state.- Secure Session login is stubbed. The optional device-side "Secure Session" login flow is scaffolded but not implemented. It is not required unless explicitly enabled on the controller; when enabled, unauthenticated requests are rejected with
ack unauthorised.
Troubleshooting
| Symptom | Check |
|---|---|
| Device never connects | Confirm TCP 443 is reachable. The eDIDIO ignores non-0xCD traffic, so port scanners / HTTP show nothing; Telnet and Art-Net are usually disabled. |
Commands return ack unauthorised | The controller has Secure Session enabled — that login flow is not yet implemented in this driver. |
| Wrong channels light up | Check fixture_mode against the fixture's real channel count, and that zone.address is the 1-based starting channel. |