Systematically discover, resolve address collisions, assign short addresses (0–63), program groups and scenes, configure DT8 color gear, and schedule emergency battery duration tests on DALI and DALI-2 networks per IEC 62386.
Activate this skill when:
Do NOT use this skill when:
The 64-Address Bus Capacity Law:
The Double-Command 100ms Transmission Invariant:
The 15-Minute Hardware Commissioning Timer:
INITIALISE (cmd 258) starts a mandatory 15-minute countdown timer inside every ballast's micro-controller.INITIALISE refresh.TERMINATE (cmd 257) to lock operational memory and exit programming state.24-Bit Random Address Binary Search ($2^{24} = 16,777,216$ Space):
RANDOMISE), each unit generates a pseudo-random 24-bit integer (0x000000 to 0xFFFFFF).SEARCHADDRH, SEARCHADDRM, SEARCHADDRL and COMPARE (cmd 265).PROGRAM SHORT ADDRESS (cmd 267) and immediately transmit WITHDRAW (cmd 266) so the addressed fixture drops out of remaining search iterations.Physical Identify & Non-Destructive Extension Invariant:
IDENTIFY or toggling RECALL MAX LEVEL / OFF before committing to lighting schedules.INITIALISE (all); use INITIALISE (without short address) so already-commissioned ballasts (0–63) preserve their programming.| Anti-Pattern | Manifestation in Code/Workflow | Mandatory Production Counter-Rule |
|---|---|---|
| Single-Shot Addressing Commands | Sending cmd 258 or cmd 267 once without repetition. | Always repeat configuration commands within a strict 100ms window. |
| Exceeding 64 Short Addresses | Attempting to assign address 64 or 65 on one loop. | Partition into Subnet A and Subnet B; enforce 0–63 maximum. |
| Timer Starvation | Letting the 15-minute INITIALISE window expire mid-search. |
Issue keep-alive refresh or optimize binary search loop to < 3 minutes. |
| Ghost Address Overwrite | Assigning address 0 without scanning if address 0 is in use. | Run non-destructive QUERY STATUS (cmd 144) across 0–63 before reassigning. |
| Bus Overcurrent Overload | Connecting 64 ballasts (2mA each) + sensors to a 100mA PSU. | Verify total quiescent load $\le$ PSU rating (250mA max per IEC 62386). |
| DT8 / DT6 Type Mismatch | Controlling tunable white gear with single-channel DT6 arc power. | Issue SELECT DIMMING CURVE / COLOUR (Part 209) and send DT8 color coordinates. |
| Simultaneous Emergency Discharge | Triggering 3-hour duration tests on all emergency lights at once. | Stagger tests across alternating weeks/groups to ensure safety illumination. |
| Missing WITHDRAW Command | Forgetting cmd 266 after addressing a found ballast. | Send WITHDRAW immediately after PROGRAM SHORT ADDRESS to exclude from search. |
| DALI Polarity Panic | Halting installation claiming standard DALI requires polarity. | Note DALI uses an integrated bridge rectifier; polarity is non-critical (though consistent coloring is advised). |
| Energizing Unverified Mains | Commissioning ballasts while 230V live mains work is ongoing. | Enforce physical lockout/tagout (LOTO) prior to terminal connection. |
import time
def send_dali_double_cmd(cmd_byte1: int, cmd_byte2: int):
transmit_dali_frame(cmd_byte1, cmd_byte2)
time.sleep(0.015) # 15ms spacing
transmit_dali_frame(cmd_byte1, cmd_byte2)
def commission_greenfield_bus() -> dict:
assigned = {}
# 1. Start 15-min commissioning session
send_dali_double_cmd(0xA5, 0x00) # INITIALISE (all gear)
send_dali_double_cmd(0xA7, 0x00) # RANDOMISE
time.sleep(0.100) # Wait 100ms for random address generation
next_short_addr = 0
while next_short_addr < 64:
low, high = 0x000000, 0xFFFFFF
found_random_addr = None
# Binary search 24-bit space
while low <= high:
mid = (low + high) // 2
set_search_address(mid)
if query_compare(): # cmd 265: does any gear have random_addr <= mid?
found_random_addr = mid
high = mid - 1
else:
low = mid + 1
if found_random_addr is None:
break # No more unaddressed fixtures on the bus
# Isolate and assign
set_search_address(found_random_addr)
short_addr_payload = (next_short_addr << 1) | 0x01
send_dali_double_cmd(0xB7, short_addr_payload) # PROGRAM SHORT ADDRESS
send_dali_cmd(0xAB, 0x00) # WITHDRAW (cmd 266)
# Physical verify
flash_fixture(next_short_addr)
assigned[next_short_addr] = hex(found_random_addr)
next_short_addr += 1
send_dali_cmd(0xA1, 0x00) # TERMINATE (cmd 257)
return assigned
def replace_single_failed_ballast(expected_short_addr: int):
# Do NOT wipe existing 63 ballasts:
send_dali_double_cmd(0xA5, 0xFF) # INITIALISE (ONLY gear without short address)
send_dali_double_cmd(0xA7, 0x00) # RANDOMISE
time.sleep(0.100)
# Perform binary search for the single new replacement unit
random_addr = search_single_unit()
set_search_address(random_addr)
# Program directly into the missing slot
payload = (expected_short_addr << 1) | 0x01
send_dali_double_cmd(0xB7, payload)
send_dali_cmd(0xAB, 0x00) # WITHDRAW
send_dali_cmd(0xA1, 0x00) # TERMINATE
def configure_dt8_tunable_white(short_addr: int, mirek: int, group_id: int):
# Mirek = 1,000,000 / Kelvin (e.g. 2700K = 370 mirek, 6500K = 153 mirek)
send_dali_cmd(0x01, 0x00) # DTR0: low byte of mirek
send_dali_cmd(0x03, 0x00) # DTR1: high byte of mirek
send_dali_double_cmd(0xE7, 0x20) # SET TEMP COLOUR (DT8 Part 209)
# Add to group (0-15)
group_payload = 0x60 | (group_id & 0x0F)
send_dali_double_cmd(0x01 | (short_addr << 1), group_payload)
Before finalizing any DALI commissioning plan or script, check:
TERMINATE sent at conclusion.WITHDRAW (cmd 266) sent immediately after each address assignment.IDENTIFY / WINK toggle step included for human visual signoff."To assign addresses on DALI, loop from 1 to 100 and send cmd 267 to each light. If lights don't respond, change the positive and negative wires because DALI needs polarity." Problems: Exceeds 64 addresses, addresses start at 1 instead of 0, misses double-command transmission, forgets random search, wrongly asserts DALI polarity dependence.
- Verify bus PSU delivers 16V DC with total load under 250mA (e.g., 42 ballasts $\times$ 2mA = 84mA).
- Send
INITIALISE (all)[cmd 258] twice within 100ms, starting the 15-minute commissioning watchdog.- Transmit
RANDOMISE[cmd 259] twice within 100ms.- Execute 24-bit binary search across
SEARCHADDRspace. For each isolated unit, transmitPROGRAM SHORT ADDRESS(slot 0–41) twice within 100ms, immediately followed byWITHDRAW[cmd 266].- Issue
TERMINATE[cmd 257] to exit programming mode and physically pulse each luminaire to verify mapping.