DALI multi-channel enumeration (P1 — critical):
- _normalise_device now preserves channel_addresses/channel_aliases for
ALL device classes, not just MOTOR — ILC-DALI multi-channel lights
(one parent UID with A/B/C/D child channel addresses) were silently
collapsed to a single entity instead of one per channel
- _parse_devices now fans out PLATFORM_LIGHT devices with channel_addresses
into individual entities, mirroring the existing IMC-300 motor pattern
Telnet auth — DDK Rule 10 (P2 — high):
- Replaced blind sleep(0.6) with proper prompt-wait sequence:
wait for 'User:' → send username → wait for 'Password:' → send
password → wait for 'Connected:' before issuing any commands
- Prevents auth failure on slow/loaded gateways
Bi-white VALUE parsing regression (P3 — high):
- Restored the len(parts)==2 branch in handle_notify for
ILC-200E / DALI-TW bi-white devices (!Z.G.N.LED.VALUE=warm.cool);
these devices reported no state in the previous version
FORM-less device bus_type inference (P4 — medium):
- Default bus_type now inferred from type_name when FORM is absent:
DALI type names → BUS_DALI, DMX type names → BUS_DMX, else BUS_CSBUS
Prevents DALI devices without FORM from being polled (DALI queries
always time out and generate noise on every coordinator cycle)
DISCOVER ALIAS regex (P5 — low):
- Changed (.+) to (.*) so empty ALIAS values are captured without
silently discarding the return line
Unused import removed (P6 — low):
- Removed async_track_time_interval which was imported but never called
All files pass py_compile. DDK v2.3.w1 consulted to verify:
- >DISCOVER\r\n command format ✓
- FORM field order and future-field tolerance ✓
- CCT warm limit default 1700 K per DDK example ✓
- SET range 0-240, ramp :XX syntax ✓
- Auth prompt sequence ✓
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>