Skip to main content

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.

Not the Art-Net path

This driver is distinct from the Art-Net DMX path (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-0xCD traffic, 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

  1. On the Devices page choose System → Devices → Add Device and pick the driver edidio.
  2. Set ip to the controller's LAN IP (or hostname). Leave port at 443 unless you have changed it.
  3. Save and reload. The driver connects over TLS, reads the controller's firmware/hardware and line layout, and the device comes up Connected.
  4. On first connect the driver runs sync_zones automatically, creating one GEM zone per fixture found in the controller's commissioned Spektra fixture profile. Auto-created zones land under the Lights subsystem (see sync_zones below). Re-run it anytime with the sync_zones command.
  5. To add a fixture by hand instead, create a zone under Zones bound (Device field) to this eDIDIO device, set its Subsystem to Lights (the zone editor will not pre-select it for you — see the note under sync_zones), then set the zone's address and fixture_mode (see Addressing).

Addressing

zone.address depends on the fixture mode:

  • DMX fixtures (fixture_mode = dimmer / rgb / rgbw) — the 1-based starting DMX channel (1–512). dimmer occupies 1 channel, rgb occupies 3 consecutive channels, rgbw occupies 4 (address + the next 3). An rgbw fixture's address therefore cannot exceed 509.
  • DALI fixtures (fixture_mode = dali) — the DALI short address (0–63) on the line set by dali_line.

Attributes

Device

AttributeRequiredDefaultDescription
ipyesController LAN IP or hostname.
portno443Protobuf-over-TLS port.
universe_maskno1Binary mask of DMX universes to drive. Universe 1 = 1, universe 2 = 2, both = 3.
fade_msno0Default DMX fade duration (ms) applied to level/color changes. 0 = instant.
status_poll_msno5000How 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_subsystemnolightWhich subsystem sync_zones places auto-created fixtures under, matched by name substring — the default light resolves to the seeded Lights subsystem (internal name lights). Override only to target a different subsystem.
secure_usernamenoOnly if the controller has Secure Session enabled (currently stubbed — see below).
secure_passwordnoSecure 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

AttributeDefaultDescription
fixture_modergbw*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). *When unset, a zone whose control is light_switch, light_dimmer, or power_default is treated as dimmer; everything else defaults to rgbw.
dali_line1DALI line number (1–8) for fixture_mode = dali.
default_white255White channel level (0–255) used when turning on without a stored color (rgbw only).
fade_msPer-zone fade duration override (ms). 0 = instant. Falls back to the device default.
color_presetsThe fixed 11-slot color palette ([{name, color, white}]) for rgb/rgbw fixtures. Edited in place from the zone control (tap a swatch to apply, edit mode to recolor a slot). Empty until customized — the control and driver fall back to a shared default palette. See Color presets.

Runtime-populated (read-only, written by the driver): red, green, blue, white (0–255), color (hex), level (0–100), state (on/off).

Commands

CommandArgsEffect
onaddressTurn the fixture on (restores its last color/level).
offaddressTurn the fixture off.
leveladdress, levelSet brightness 0–100 (hue preserved for color fixtures).
coloraddress, colorSet hex color #RRGGBB (rgb/rgbw fixtures).
whiteaddress, whiteSet the white channel 0–255 (rgbw fixtures).
rgbwaddress, red, green, blue, whiteSet raw R/G/B/W channel values 0–255.
apply_presetaddress, presetApply a saved color preset by name or index (rgb/rgbw fixtures).
save_presetaddress, name, color, whiteSave the current color (or a given color/white) as a named preset; overwrites a same-name preset. Capped at 11 presets — a new name past the cap is rejected (overwrites are always allowed).
delete_presetaddress, presetDelete a saved color preset by name or index (available from macros/API; the zone control no longer surfaces deletion).
recall_sceneaddress, sceneRecall a DALI scene (0–15) on a dali fixture.
all_onDMX broadcast all configured fixtures to full.
all_offDMX broadcast all configured fixtures off.
sync_zonesAuto-create GEM zones from the controller's Spektra fixture profile. Idempotent.
refreshRe-read firmware, lines, temperature, and battery from the controller.
triggertype, value, index, lineRun an arbitrary eDIDIO TriggerType (advanced).
raw_dmxaddress, levels, fade_msWrite raw DMX levels starting at a channel (1–512) — no zone required. levels is a comma-separated list of 0–255 values (e.g. 255,0,128) written to consecutive channels; fade_ms optionally overrides the device fade for this write.
raw_daliline, address, levelSend a raw DALI arc level (0–100) to a short address (0–63) on a line — no zone required. line defaults to 1.
DALI fixtures

A dali fixture responds to on, off, level, and recall_scene only. color, white, and rgbw are DMX-only and return an error on a DALI fixture.

Raw commands

raw_dmx and raw_dali bypass the zone lookup entirely — the address goes straight to the wire after protocol range validation. Use them from macros or per-zone action overrides to drive channels/addresses that have no GEM zone. Because no zone is involved, nothing is written back to zone state.

Color presets

rgb / rgbw fixtures carry a fixed 11-slot color palette in the color_presets zone attribute — an array of {name, color, white}. In the zone control the presets render as a 6×2 grid of swatches (11 swatches plus the edit toggle fill the 12 cells):

  • Tap a swatch to apply it — the control drives the driver's own color command with the swatch's stored color, so it reuses the fixture's channel math (no name-based apply_preset round-trip). The apply_preset command is still available for macros and direct use.
  • Edit mode (the pencil toggle) turns each swatch into a native color picker. The fixture live-previews the color as you drag (the same throttled color stream as the main picker), and the slot is saved (save_preset) when the picker closes — its name and white channel are kept. The control never adds or deletes slots, so the count always stays 11.

The palette is shared with the dmx_rgbw Art-Net driver — both expose the same preset commands from a common base, so a preset saved on either kind of fixture uses the identical shape. Until a zone is customized, the control and driver both fall back to a default palette (warm/cool whites plus a color wheel); the defaults are materialized into color_presets the first time a slot is saved, never silently on read. save_preset enforces the 11-preset cap server-side — an overwrite is always allowed, but a new name past the cap is rejected. Saving works for non-admin UI users (the persistence happens server-side).

sync_zones

sync_zones reads the controller's commissioned Spektra fixture profile and the authoritative controller line layout, then creates one GEM zone per fixture under the Lights 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_mode derived from their channel count; DALI fixtures are created with fixture_mode = dali and the resolved dali_line.
  • Every auto-created zone gets the dmx_rgbw zone control, so it renders with the RGBW color/level UI. That control reads fixture_mode and surfaces only the controls each mode supports: the color picker and preset swatches on rgb/rgbw, the white slider on rgbw only, and a DALI scene selector (Scene 0–15, driving recall_scene) on dali fixtures. A dimmer fixture shows the level slider alone.
Subsystem placement

A default GEM install ships a Lights subsystem (internal name lights). sync_zones substring-matches its target (light) against that name, so auto-created fixtures land in Lights with no extra setup. If you instead add a fixture zone by hand, the zone editor will not pre-select the subsystem for you — the driver's hint (lighting) doesn't exactly match the seeded lights name — so choose Lights yourself, or point default_subsystem at another subsystem you create under Subsystems.

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_ms to 0 to disable it entirely.
  • DMX only. DALI fixtures are skipped — the DALI status cache is unverified against hardware.
  • First DMX line only. The poll reads the first DMX line's level cache. Fixtures driven on a second DMX universe/line (via universe_mask) are still commanded normally, but their out-of-band changes won't be reflected back into GEM.

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_off follow 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

SymptomCheck
Device never connectsConfirm 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 unauthorisedThe controller has Secure Session enabled — that login flow is not yet implemented in this driver.
Wrong channels light upCheck fixture_mode against the fixture's real channel count, and that zone.address is the 1-based starting channel.