DALI, or Digital Addressable Lighting Interface, is a dedicated protocol for digital lighting control that enables the easy installation of robust, scalable and flexible lighting networks.
DALI was originally developed to allow digital control, configuration and querying of fluorescent ballasts, replacing the simple, one-way, broadcast-like operation of 0/1-10V analog control.
With DALI, the broadcast option is also available; in addition, with simple configuration, each DALI device can be assigned a separate address, allowing digital control of individual devices.
Furthermore, the DALI devices can also be programmed to operate in groups. This provides excellent flexibility since the lighting systems can be reconfigured by software reprogramming, without the need to change the wiring. Different lighting functions and moods can be achieved in different rooms or areas of a building, and then easily adjusted and optimized.
The digital nature of DALI allows two-way communication between devices, so that a device can report a failure, or answer a query about its status or other information.
Wiring is relatively simple; DALI power and data is carried by the same pair of wires, without the need for a separate bus cable. The polarity of the wires does not have to be observed, in contrast with 0/1-10V systems where wiring errors are common.
DALI-2 is the certification program which is based on the latest version of the DALI protocol, and is developed and maintained by the DALI Alliance.
The IEC 62386 standard was restructured in late 2014 for ease of use and to faciliate the development of DALI-2. Many improvements were made to the standard including the addition of new commands and features. One of the most significant changes was the addition of control devices (including application controllers and input devices), which were not included at all in the original version of the standard.
As our controllers do not have a DALI port, we use RS232/DALI transceivers to communicate with the DALI bus.
The driver has been tested with products from the following brands:
https://www.lunatone.com/produkt/dali-sci-rs232
parameter | description |
---|---|
name | Define the name of the gateway, must be uniq |
on duration emit interval | This parameter sets the delay in seconds between each transmission of the onDuration value. |
driver | |
driver |
https://www.lunatone.com/produkt/dali-sci-rs232
Driver prefix | line | target | description |
---|---|---|---|
%dali | [0-9][0-9] | A[0-9][0-9] | gear short address |
%dali | [0-9][0-9] | G[0-9][0-9] | gear groups |
%dali:[0-9][0-9]/A[0-9][0-9]
%dali:[0-9][0-9]/G[0-9][0-9]
Groups allow multiple DALI Devices on the same line to be grouped together which allows the devices to perform an action together.
Each DALI device can be assigned membership to a group or multiple groups. This grouping allows commands to be sent out in groups with all members of the group reacting to one individual group command. If a device is not part of the group it will be ignored.
%dali:[0-9][0-9]/S[0-9][0-9]
A scene is a configurable arc level that can be applied to Electronic Control Gear(ECG). An ECG can have up to 12 scene-values. Scenes can be given a label for each scene for each DALI group. When a scene command is sent across the DALI line, every DALI device receives the command and checks it’s memory. If it has a stored action the DALI device will perform the action, otherwise, it will ignore the command.
method | address | description |
---|---|---|
gearWithdraw | - | Reserved for gear addressing process |
gearRandomise | - | Reserved for gear addressing process |
gearPing | %dali:A[0-9][0-9]/exists | |
gearDTR0 | - | Reserved for gear addressing process |
gearInitialise | - | Reserved for gear addressing process |
gearIdentify | %dali:A[0-9][0-9]/identify | Start or restart a 10s timer. While the timer is running the device will run a procedure to enable an observer to distinguish the device from other devices in which it is not running. This procedure is manufacturer-dependent. Identification will be stopped immediately upon reception of any command other than Initialise, RecallMinLevel, RecallMaxLevel or IdentifyDevice |
gearTerminate | - | Reserved for gear addressing process |
gearCompare | - | Reserved for gear addressing process |
gearSearchAddrH | - | Reserved for gear addressing process |
gearSearchAddrL | - | Reserved for gear addressing process |
gearSearchAddrM | - | Reserved for gear addressing process |
gearAddToGroup0 | %dali:A[0-9][0-9]/groupsMembership value=[1,null,null,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 0 |
gearAddToGroup1 | %dali:A[0-9][0-9]/groupsMembership value=[null,1,null,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 1 |
gearAddToGroup2 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,1,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 2 |
gearAddToGroup3 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,1,null,null,null,null,null,null,null,null,null,null] |
add gear from group 3 |
gearAddToGroup4 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,1,null,null,null,null,null,null,null,null,null] |
add gear from group 4 |
gearAddToGroup5 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,1,null,null,null,null,null,null,null,null] |
add gear from group 5 |
gearAddToGroup6 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,1,null,null,null,null,null,null,null] |
add gear from group 6 |
gearAddToGroup7 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,1,null,null,null,null,null,null] |
add gear from group 7 |
gearAddToGroup8 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,1,null,null,null,null,null] |
add gear from group 8 |
gearAddToGroup9 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,1,null,null,null,null] |
add gear from group 9 |
gearAddToGroup10 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,1,null,null,null] |
add gear from group 10 |
gearAddToGroup11 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,1,null,null] |
add gear from group 11 |
gearAddToGroup12 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,1,null] |
add gear from group 12 |
gearAddToGroup13 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,1] |
add gear from group 13 |
gearAddToGroup14 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,null,1,null] |
add gear from group 14 |
gearAddToGroup15 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1] |
add gear from group 15 |
gearRemoveFromGroup0 | %dali:A[0-9][0-9]/groupsMembership value=[0,null,null,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 0 |
gearRemoveFromGroup1 | %dali:A[0-9][0-9]/groupsMembership value=[null,0,null,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 1 |
gearRemoveFromGroup2 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,0,null,null,null,null,null,null,null,null,null,null,null] |
add gear from group 2 |
gearRemoveFromGroup3 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,0,null,null,null,null,null,null,null,null,null,null] |
add gear from group 3 |
gearRemoveFromGroup4 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,0,null,null,null,null,null,null,null,null,null] |
add gear from group 4 |
gearRemoveFromGroup5 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,0,null,null,null,null,null,null,null,null] |
add gear from group 5 |
gearRemoveFromGroup6 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,0,null,null,null,null,null,null,null] |
add gear from group 6 |
gearRemoveFromGroup7 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,0,null,null,null,null,null,null] |
add gear from group 7 |
gearRemoveFromGroup8 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,0,null,null,null,null,null] |
add gear from group 8 |
gearRemoveFromGroup9 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,0,null,null,null,null] |
add gear from group 9 |
gearRemoveFromGroup10 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,0,null,null,null] |
add gear from group 10 |
gearRemoveFromGroup11 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,0,null,null] |
add gear from group 11 |
gearRemoveFromGroup12 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,0,null] |
add gear from group 12 |
gearRemoveFromGroup13 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,0] |
add gear from group 13 |
gearRemoveFromGroup14 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,null] |
add gear from group 14 |
gearRemoveFromGroup15 | %dali:A[0-9][0-9]/groupsMembership value=[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0] |
add gear from group 15 |
gearIdentify | This allows for the physical identification of the device. | |
gearReset | ||
gearGoToLastActiveLevel | ||
gearQueryContentDTR0 | ||
gearQueryResetState | ||
gearQueryDeviceType | Return the device type. Currently defined: 0: fluorescent lamps 1: emergency lighting 2: HID lamps 3: low voltage halogen lamps 4: incandescent lamps 5: DC-controlled dimmers 6: LED lamps 7: Switching function 8: Colour control. |
|
gearQueryActualLevel | Return the current actual power level. During preheating and if a lamp error occurs the answer will be 0xff ("MASK"). | |
gearQueryGroupsZeroToSeven | ||
gearQueryGroupsEightToFifteen | ||
deviceQueryLightSourceType | %dali:A[0-9][0-9]/type | The answer shall be as follows: 0 - low pressure fluorescent 2 - HID 3 - low voltage halogen 4 - incandescent 6 - LED 7 - OLED 252 - "other" 253 - "unknown" 254 - "none" MASK - multiple 1,5,8..251 - reserved "unknown" will typically be used in case of signal conversion, for example to 1-10v dimming "none" will be used where no light source is connected, for example a relay When the response is "multiple" then the light source types shall be placed into DTR0, DTR1 and DTR2. If there are exactly two light source types, DTR2 shall be "none". If there are more than three then DTR2 shall be MASK. |
gearSetShortAddress | ||
gearExists | %dali:A[0-9][0-9]/exists | |
gearQueryLampFailure | ||
gearQueryLampPowerOn | ||
gearQueryStatus |
%dali:[0-9][0-9]/A[0-9][0-9]/level
Power is either an integer in the range 0..255, or one of two special strings:
"OFF" sets the ballast off (same as power level 0)
"MASK" stops any fade in progress (same as power level 255)
The lamp will fade to the specified power according to its programmed fade time. The MAX LEVEL and MIN LEVEL settings will be respected.
To adjust the brightness intensity of a ballast, write to this address with a value between 0 and 100. 255 is the MASK value.
Commissionning won't overwrite existing addresses. If you wish to reset the existing adrseses, go here
Commissionning won't overwrite existing addresses. If you wish to reset the existing adrseses, go here
Commissionning won't overwrite existing addresses. If you wish to reset the existing adrseses, go here
%dali:[0-9][0-9]/A[0-9][0-9]/onDuration
If you want the value to be stored on the controller's disk, don't forget to set the 'remanent' value to true.
To reset the counter value, you can write 'reset' or 'reset=1000' if you want to set the counter back to 1000 hours.
Driver prefix | line | target | description |
---|---|---|---|
%dali | [0-9][0-9] | D[0-9][0-9] | device short address |
%dali | [0-9][0-9] | DG[0-9][0-9] | event device groups |
%dali | [0-9][0-9] | DI[0-9][0-9] | event device instance |
%dali | [0-9][0-9] | DIG[0-9][0-9] | event device instance group |
method | description |
---|---|
deviceSetShortAddress | |
deviceIdentify | This allows for the physical identification of the device. |
deviceQueryOperatingMode | |
deviceQueryDeviceCapabilities | |
deviceQueryStatus | |
deviceSetEventScheme | %dali:D[0-9][0-9]/instances/[0-9][0-9]/scheme |
deviceQueryNumberOfInstances | %dali:D[0-9][0-9]/instances/[0-9][0-9]/numberOfInstances |
deviceDTR0 | |
deviceDTR1 | |
deviceDTR2 | |
deviceQueryInputValue | |
deviceQueryEventSchemeResponse | |
deviceVerifyShortAddress | |
deviceQueryInstanceStatusResponse | |
deviceTerminate | |
deviceInitialise | This command shall start or re-trigger a timer for 15 minutes; the addressing commands shall only be processed within this period. All other commands shall still be processed during this period. |
deviceRandomise | |
deviceRemoveFromDeviceGroupsZeroToFifteen | |
deviceRemoveFromDeviceGroupsSixteenToThirtyOne | |
deviceCompare | |
deviceDTR2DTR1 | |
deviceSearchAddrH | |
deviceSearchAddrM | |
deviceSearchAddrL | |
deviceProgramShortAddress | |
deviceWithdraw | |
deviceQueryInstanceType | |
deviceQueryDeviceGroupsZeroToSeven | |
deviceAddToDeviceGroupsZeroToFifteen | |
deviceQueryDeviceGroupsEightToFifteen | |
deviceQueryGroupsSixteenToTwentyThree | |
deviceQueryDeviceGroupsTwentyFourToThirtyOne | |
deviceStartQuiescentMode | |
deviceLightSetReportTimer | |
deviceLightSetHysteresis | |
deviceLightSetDeadtimeTimer | |
deviceLightSetHysteresisMin | |
deviceLightQueryHysteresisMin | |
deviceLightQueryDeadtimeTimer | |
deviceLightQueryReportTimer | |
deviceLightQueryHysteresis | |
deviceOccupancySetHoldTimer | |
deviceOccupancySetReportTimer | |
deviceOccupancySetDeadtimeTimer | |
deviceOccupancyQueryDeadtimeTimer | |
deviceOccupancyQueryHoldTimer | |
deviceQueryUnit | |
deviceQueryResolution | |
deviceQueryValueMultiplicator | |
deviceQueryValueDivisor | |
deviceQueryValueOffestMultiplicator | |
deviceQueryValueOffsetDivisor | |
deviceOccupancyQueryReportTimer | |
deviceOccupancyQueryCatching | |
deviceSetPrimaryInstanceGroup | |
deviceQueryPrimaryInstanceGroup | |
deviceQueryInstanceGroup1 | |
deviceSetInstanceGroup1 | |
deviceQueryInstanceGroup2 | |
deviceSetInstanceGroup2 |
An instance is a part of an input device, which is a product that provides information to the DALI system.
An example is a push-button panel with 8 buttons. Each button is one instance, giving 8 in total in the same product. These will implement IEC 62386-301 (push-button), which is instance type 1. Similarly, an occupancy sensor implements IEC 62386-303, which is instance type 3.
It is common for input devices to implement more than once instance. A sensor may implement an occupancy sensor and a light sensor in the same product. These are instance types 3 (Part 303) and 4 (Part 304).
One control device short address can support multiple instances. In the first example, a push-button panel with 8 buttons would normally use only 1 short address (1 logical unit), which is divided into 8 instances numbered 0-7.
Not all application controllers can support the use of input devices. Check with your application controller supplier, as well as the DiiA product database.
Some application controllers can make use of event messages from input devices, for faster response, whilst some may use polling, especially for slow-changing measurements such as light level.
Weble value | DALI value |
---|---|
generic | 0 |
pushButton | 1 |
analogInput | 2 |
occupancySensor | 3 |
lightSensor | 4 |
Is the time that must pass before the state “people in the room and no movement” ischanged to the state “empty room”. Ifmovement is detected during this time the state is changed back to: “People in the room and movement”.
%dali:[0-9][0-9]/D[0-9][0-9]/instances/[0-9]/deadtimeTimer
With deadtime timer parameters, you can block the event transmission. It can be used to reduce the number of events in case events are triggered by a change of the sensor "input-value". The deadtime timer can be set with the command "SET DEADTIME TIMER" and queried with the command "QUERY DEADTIME TIMER".
%dali:[0-9][0-9]/D[0-9][0-9]/instances/[0-9]/reportTimer
Report timer allows the periodic transmission of sensor events. Every time the report timer expires the current "input-value" is sent as a DALI-2 event (encoded according to 5. Events). The report timer can be set with the command "SET REPORT TIMER" and queried with the command "QUERY REPORT TIMER"
%dali:[0-9][0-9]/D[0-9][0-9]/instances/[0-9]/hysteresisMin
%dali:[0-9][0-9]/D[0-9][0-9]/instances/[0-9]/hysteresis
%dali:D[0-9][0-9]/numberOfInstance
By reading this address, the system will send the request for 'NUMBER_OF_INSTANCES' and return the total number of instances supported by the device. After this reading, the gateway will automatically create the instance subaddresses.
%dali:D[0-9][0-9]/instances/[0-9][0-9]
To retrieve all the parameters of an instance, send a read request to the specific instance in question.
%dali:D[0-9][0-9]/instances/[0-9][0-9]/scheme
The event scheme determines which information is transferred with the event. This information is required, to enable recognition and / filtering of events on the bus.
Value | Description |
---|---|
device | |
instance | |
instance group | Each instance of an input device can be assigned to up to 3 instance groups. (of the 32 instance groups available). The "Primary Group" is used for the event. Instances of different input devices can be assigned to the same instance group |
device_instance | |
device_group | The device can be assigned to up to 32 device groups (0...31). The lowest device group is used for the event. |
Only for instance types 2, 3 and 4. The event priority determines the order in which events are sent when they occur simultaneously on the bus. Priority 2 = highest and 5 = lowest.
The event scheme determines which information is transferred with the event. This information is required, to enable recognition and / filtering of events on the bus.
Each instance of an input device can be assigned to up to 3 instance groups. (of the 32 instance groups available). The "Primary Group" is used for the event. Instances of different input devices can be assigned to the same instance group
The device can be assigned to up to 32 device groups (0...31). The lowest device group is used for the event
To change the address of a ballast or device, write the desired address in the corresponding field. Before changing the address, the system will verify if the new address does not already exist.
To physically identify a device, write a value in seconds to the corresponding address of the ballast or device you want to identify. The value represents the number of seconds during which the device can be physically identified. The identification process may vary depending on the manufacturer, but typically, lights will flash, and the devices will have a blinking LED during this phase
A gear/device can belong to multiple groups.
To configure the scheme as 'device_group,' make sure the device belongs to a group.
To configure the scheme as 'instance_group,' make sure that instance primary group is set.