This document describes the payloads of firmware version 1.1.x.
Differences with FW 1.0.x documentation are marked with light blue.
nas-codec Live Decoder can be used to decode any payload.
Every packet has an example which is also decoded using nas-codec.
Direction: uplink (⭡).
The boot_packet is sent once right after LoRaWAN join.
Example:
00 0D008350 010105 F37F205E 00 2C FE 01 04
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x00 | packet_type | 0x00 - boot_packet | boot_packet | |
| 1 | uint32 | 0x0D | device_serial | format: hex | 5083000D | |
| 2 | 0x00 | |||||
| 3 | 0x83 | |||||
| 4 | 0x50 | |||||
| 5 | uint8 | 0x01 | firmware_version |
major | 1.1.5 |
|
| 6 | uint8 | 0x01 | minor | |||
| 7 | uint8 | 0x05 | patch | |||
| 8 | uint32 |
0xF3 | device_unix_epoch |
Number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT) Notice: if device has not received time form LoRaWAN DevTimeReq it starts from Jan 1 2000. |
0x5E207FF3 → January 16, 2020 |
|
| 9 | 0x7F | |||||
| 10 | 0x20 | |||||
| 11 | 0x5E | |||||
| 12 | uint8 | 0x00 | device_config | 0x00 - config_dali (DD) 0x01 - config_dali_nc (DC) 0x02 - config_dali_no (DO) 0x03 - config_analog_nc (AC) 0x04 - config_analog_no (AO) 0x05 - config_dali_analog_nc (UC) 0x06 - config_dali_analog_no (UO) 0x07 - config_dali_analog_nc_no (UU) |
config_dali | |
| 13 | bit8 | 0x2C | optional_features | Bit | Function | |
| 0..1 | reserved | |||||
| 2 | dig_input (config D) | true | ||||
| 3 | ldr_input (config L) | true | ||||
| 4 | open_drain_output (config O) | false | ||||
| 5 | metering (config M) | true | ||||
| 6..7 | reserved | |||||
| 14 | bit8 | 0xFE | Bit | Function | ||
| 0..6 | dali_supply_state 0x7E - bus_high 0x7F - bus_error (shorted, overloaded) |
bus_high | ||||
| 7 | dali_power_source_external | true | ||||
| 15 | bit8 | 0x01 | Bit | Function | ||
| 0..6 | dali_addressed_driver_count | 1 | ||||
| 7 | dali_unaddressed_driver_found | true | ||||
| 16 | bit8 | 0x04 | reset_reason | Bit | Function | |
| 0 | reserved | |||||
| 1 | watchdog_reset | false | ||||
| 2 | soft_reset (e.g. from DFU) | true | ||||
| 3..7 | reserved | |||||
{
"data": {
"packet_type": "boot_packet",
"device_serial": "5083000D",
"firmware_version": "1.1.5",
"device_unix_epoch": "2020-01-16T15:23:31.000Z",
"device_config": "dali",
"optional_features": {
"dig_input": true,
"ldr_input": true,
"open_drain_output": false,
"metering": true
},
"dali_supply_state__V": "bus_high",
"dali_power_source_external": "external",
"dali_addressed_driver_count": 1,
"dali_unaddressed_driver_found": false,
"reset_reason": [
"soft_reset"
]
},
"errors": [],
"warnings": []
}
This packet is a response to a faulty downlink. It reports the first encountered error. Invalid configurations or commands will not be applied.
Example:
13 32 03
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x13 | packet_type | 0x13 - invalid_downlink_packet | invalid_downlink_packet |
| 1 | uint8 | 0x32 | downlink_from_fport | 0x32 → 50 (fPort) | |
| 2 | uint8 | 0x03 | error_reason | 0x02 - unknown_fport 0x03 - packet_size_short 0x04 - packet_size_long 0x05 - value_error 0x06 - protocol_parse_error 0x07 - reserved_flag_set 0x08 - invalid_flag_combination 0x09 - unavailable_feature_request 0x0A - unsupported_header 0x0B - unreachable_hw_request 0x0D - internal_error 0x0E - packet_size_error 0x81 - profile_id_seq_error 0x82 - profile_destination_error 0x83 - profile_days_error 0x84 - profile_step_count_error 0x85 - profile_step_value_error 0x86 - profile_step_unsorted_error |
packet_size_short |
{
"data": {
"packet_type": "invalid_downlink_packet",
"downlink_from_fport": 50,
"error_reason": "packet_size_short"
},
"errors": [],
"warnings": [
"downlink_packet_size_short"
]
}
Direction: uplink. status_packet contains all input and output states. Its interval can be configured using status_config_packet. status_packet can be requested at any time using the status_usage_request command.
Example:
01 F37F205E 82C4 32 09 16 20 07 01 D2 02 9455 04 01 FE 50 19 00
Example 2 (DALI driver connected):
01 F37F205E 82C4 32 09 16 20 07 01 D2 02 9455 04 01 FE 50 19 00 12 50 19 00
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x01 | packet_type | 0x01 - status_packet | status_packet | |
| 1 | uint32 |
0xF3 | device_unix_epoch |
Number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT) Notice: if the device has not received the timestamp form LoRaWAN DevTimeReq, it will start from Jan 1 2000. |
0x5E207FF3 → January 16, 2020 |
|
| 2 | 0x7F | |||||
| 3 | 0x20 | |||||
| 4 | 0x5E | |||||
| 5 | bit8 | 0x82 | status | Bit | Function | |
| 0 | reserved | |||||
| 1 | dali_connection_error | true | ||||
| 2-4 | reserved | |||||
| 5 | metering_com_error | false | ||||
| 6 | ext_rtc_warning (since 1.1.14 internal RTC keeps time instead) | false | ||||
| 7 | internal_relay_closed | true | ||||
| 6 | bit8 | 0xC4 | status | Bit | Function | |
| 0-1 | reserved | |||||
| 2 | open_drain_output_on | true | ||||
| 3-5 | reserved | |||||
| 6 | lumalink_connected | true | ||||
| 7 | lumalink_connected_after_boot | true | ||||
| 7 | uint8 | 0x32 | downlink_rssi__dBm | convert: *-1 | 0x32 → 50 50 * -1 = -50 (dBm) |
|
| 8 | int8 | 0x09 | downlink_snr__dB | 0x09 → 9 (dB) | ||
| 9 | int8 | 0x16 | mcu_temperature__C | 0x16 → 22 (°C) | ||
| 10 | bit8 | 0x20 | active_alerts | Bit | Function | |
| 0..3 | reserved | |||||
| 4 | voltage_alert_in_24h (min_voltage, max_voltage) | false | ||||
| 5 | lamp_error_alert_in_24h (min_power) | true | ||||
| 6 | power_alert_in_24h (max_power) | false | ||||
| 7 | power_factor_alert_in_24h (min_power_factor) | false | ||||
| note: only relevant if device hardware supports onboard metering. | ||||||
| 11 | uint8 | 0x07 | len_of_sensor_source | note: always consume len_of_sensor_source number of bytes, so the following dimming_source data is decoded correctly when new sensor_source type is added (to the end). | 0x07 → 7 | |
| sensor_source. The following sensor_source block can contain any of the following sensors. | ||||||
| r0 | uint8 | 0x01 | header | 0x01 - ldr_input | ldr_input | |
| r1 | uint8 | 0xD2 | ldr_input | note: available on certain hardware with LDR option config. | 0xD2 → 210 | |
| r0 | uint8 | 0x02 | header | 0x02 - light_sensor | light_sensor | |
| r1 | uint16 | 0x94 | light_sensor__lx | convert: (10^(value/4000))/1000 (lx) note: available on certain hardware 0xFFFF - unavailable |
0x5594 → 21908 21908 / 4000 = 5.477 10^5.477 = 299916,3 299916,3/1000 = 299,9 (lx) |
|
| r2 | 0x55 | |||||
| r0 | uint8 | 0x04 | header | 0x04 - dig_input | dig_input | |
| r1 | bits8 | 0x01 | dig_input | Bit | Comment | |
| 0 | dig_input_1_on | true | ||||
| 1-7 | reserved | |||||
| r0 | uint8 | header | 0x08 - tilt_sensor | |||
| r1 | bits8 | tilt_sensor_alerts | Bit | Comment | ||
| 0 | data_ok | |||||
| 1 | motion_in_15s | |||||
| 2 | motion_in_1h | |||||
| 3 | motion_in_24h | |||||
| 4 | shake_in_15s | |||||
| 5 | shake_in_1h | |||||
| 6 | shake_in_24h | |||||
| r2 | uint8 | tilt_sensor__deg | range: 0° (upright) - 180° (upside down) 0xFF - unavailable note: available on newer hardware and with FW version ≥1.1.30 |
|||
| r0 | uint8 | header | 0x09 - d4i_motion_sensor | |||
| r1 | uint8 | motion_sensor_address | 0xFF (only supports broadcast at this point) | |||
| r2 | uint8 | motion_sensor_state | 0x00 - no_movement_vacant 0x55 - movement_vacant 0xAA - no_movement_occupied 0xFF - movement_occupied |
|||
| dimming_source. The following dimming_source block repeats once for each output. | ||||||
| r0 | uint8 | 0xFE | address | see address encoding | dali_broadcast | |
| r1 | uint8 | 0x50 | reason | 0x00…0x07 - profile_x (0-7) 0x21 - calendar_day 0x22 - calendar_night 0x30…0x3F - calendar_dawn_step_n (0-15) 0x50…0x5F - calendar_dusk_step_n (0-15) 0x70 - dig_indactive 0x71 - dig_active 0x80…0x87 - light_monitor_step_n (0-7) 0xF5 - relay_off* 0xF6 - driver_not_found* 0xF8 - fallback_active 0xFA - ldr_input_active 0xFC - dig_input_active 0xFD - manual_active 0xFF - unknown note: * driver_not_found, probably because relay is off |
calendar_dusk_step | |
| r2 | uint8 | 0x19 | dimming_level__percent | range: 0-100 0xFF - n/a |
0x19 → 25 (%) | |
| r3 | bit8 | 0x00 | status | note: ignore when address is analog_0_10v (see address encoding) | ||
| Bit | Value | |||||
| 0 | driver_error (control gear failure) |
false | ||||
| 1 | lamp_failure | false | ||||
| 2 | lamp_on (lamp arc power on) |
false | ||||
| 3 | limit_error | false | ||||
| 4 | fade_running | false | ||||
| 5 | reset_state | false | ||||
| 6 | missing_short_address | false | ||||
| 7 | power_failure | false | ||||
{
"data": {
"packet_type": "status_packet",
"device_unix_epoch": "2020-01-16T15:23:31.000Z",
"status": {
"dali_connection_error": true,
"metering_com_error": false,
"ext_rtc_warning": false,
"internal_relay_closed": true,
"open_drain_output_on": true,
"lumalink_connected": true,
"lumalink_connected_after_boot": true
},
"downlink_rssi__dBm": -50,
"downlink_snr__dB": 9,
"mcu_temperature__C": 22,
"active_alerts": {
"voltage_alert_in_24h": false,
"lamp_error_alert_in_24h": true,
"power_alert_in_24h": false,
"power_factor_alert_in_24h": false
},
"sensor_source": {
"ldr_input": 210,
"light_sensor__lx": "299.9",
"dig_input_1_on": true
},
"dimming_source": [
{
"address": "dali_broadcast",
"reason": "calendar_dusk_step",
"dimming_level__percent": 25,
"status": {
"driver_error": false,
"lamp_failure": false,
"lamp_on": false,
"limit_error": false,
"fade_running": false,
"reset_state": false,
"missing_short_address": false,
"power_failure": false
}
}
]
},
"errors": [],
"warnings": [
"dali_connection_error",
"lamp_error_alert_in_24h"
]
}
Direction: uplink. The usage_packet includes instant and accumulated energy values currently available. Its interval can be configured using the usage_config_packet and can be requested at any time with the status_usage_request command.
Notice: active_energy and active_power are measured at power inputs (either DALI driver or LCU). load_side_energy and load_side_power exclude controller's consumption for LCU and DALI Bus and AUX supply consumption for DALI driver.
Example:
00 12 FF 47940300 2A00 F94A0300 2700 5D E5 C072D902 D0EF2F01
Example 2:
00 FF 80 D0EF2F01 12 FF 47940300 2A00 F94A0300 2700 5D E5 C072D902 D0EF2F01
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x00 | packet_type | 0x00 - usage_packet | usage_packet | |
| consumption. The consumption block repeats, first for internal_measurement and then for all the DALI drivers that support either the D4i or SR protocol. | ||||||
| r0 | uint8 | 0x12 | address | see address encoding 0xFF - internal_measurment |
||
| r1 | bit8 | 0xFF | reported_fields | Bit | Parameter | |
| 0 | active_energy_reported | true | ||||
| 1 | active_power_reported | true | ||||
| 2 | load_side_energy_reported | true | ||||
| 3 | load_side_power_reported | true | ||||
| 4 | power_factor_reported | true | ||||
| 5 | mains_voltage_reported | true | ||||
| 6 | driver_operating_time_reported | true | ||||
| 7 | lamp_on_time_reported | true | ||||
| r0 | uint32 | 0x47 | active_energy__Wh | when: active_energy_reported | 0x00039447 → 234567 (Wh) |
|
| r1 | 0x94 | |||||
| r2 | 0x03 | |||||
| r3 | 0x00 | |||||
| r0 | uint16 | 0x2A | active_power__W | when: active_power_reported | 0x002A → 42 (W) | |
| r1 | 0x00 | |||||
| r0 | uint32 | 0xF9 | load_side_energy__Wh | when: load_side_energy_reported | 0x00034AF9 → 215801 (Wh) |
|
| r1 | 0x4A | |||||
| r2 | 0x03 | |||||
| r3 | 0x00 | |||||
| r0 | uint16 | 0x27 | load_side_power__W | when: load_side_power_reported | 0x0027 → 39 (W) | |
| r1 | 0x00 | |||||
| r0 | uint8 | 0x5D | power_factor | when: power_factor_reported convert: / 100.0 0xFF - unknown note: its instant value |
0x5D → 93 93 / 100 = 0.93 |
|
| r0 | uint8 | 0xE5 | mains_voltage__V | when: mains_voltage_reported | 0xE5 → 229 (V) | |
| r0 | uint32 | 0xC0 | driver_operating_time__h | when: driver_operating_time_reported | 0x02D972C0 → 47805120 (s) → 13279.2 (h) |
|
| r1 | 0x72 | |||||
| r2 | 0xD9 | |||||
| r3 | 0x02 | |||||
| r0 | uint32 | 0xD0 | lamp_on_time__h | when: lamp_on_time_reported | 0x012FEFD0 → 19918800 (s) → 5533 (h) |
|
| r1 | 0xEF | |||||
| r2 | 0x2F | |||||
| r3 | 0x01 | |||||
{
"data": {
"packet_type": "usage_packet",
"consumption": [
{
"address": "dali_single_9",
"active_energy__Wh": 234567,
"active_power__W": 42,
"load_side_energy__Wh": 215801,
"load_side_power__W": 39,
"power_factor": 0.93,
"mains_voltage__V": 229,
"driver_operating_time__h": 13279.2,
"lamp_on_time__h": 5533
}
]
},
"errors": [],
"warnings": []
}
Example payload (Since FW 1.1.11):
80 40 41010000
Example payload (Up until FW 1.1.10):
80 20 4101
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x80 | packet_type | 0x80 - dig_input_notification | dig_input_notification | |
| 1 | bit8 | 0x40 | Bit | Function | ||
| 0 | dig_input_on | false | ||||
| 1..3 | reserved | |||||
| 4..7 | counter_length | 0x4 → 4 (bytes) | ||||
| 2 | uint32 | 0x41 | dig_input_event_counter Up until FW 1.1.10 its uint16 (2 bytes) |
0x00000141 → 321 | ||
| 3 | 0x01 | |||||
| 4 | 0x00 | |||||
| 5 | 0x00 | |||||
{
"data": {
"packet_type": "dig_input_notification",
"dig_input_on": false,
"dig_input_event_counter": 321
},
"errors": [],
"warnings": [
"dig_input_alert"
]
}
Example payload:
81 20 01 91
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x81 | packet_type | 0x81 - ldr_input_notification | ldr_input_notification | |
| 1 | bit8 | 0x20 | reserved | |||
| 2 | uint8 | 0x01 | Bit | Function | ||
| 0 | ldr_input_on | true | ||||
| 1..7 | reserved | |||||
| 3 | uit8 | 0x91 | ldr_input_value | 0x91 → 145 | ||
{
"data": {
"packet_type": "ldr_input_notification",
"ldr_input_on": true,
"ldr_input_value": 145
},
"errors": [],
"warnings": [
"ldr_input_alert"
]
}
Example payload:
83 20 12 02
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x83 | packet_type | 0x83 - dali_driver_alert | dali_driver_alert | |
| 1 | bit8 | 0x20 | Bit | Function | ||
| 0..3 | reserved | |||||
| 4..7 | length note: in bytes |
2 | ||||
| drivers, Follows list of drivers blocks, amount determined by length / 2. | ||||||
| r0 | uint8 | 0x12 | address | see address encoding | 0x12 >> 1 → 9 | |
| r1 | bit8 | 0x02 | status | Bit | Function | |
| 0 | driver_error (control gear failure) |
false | ||||
| 1 | lamp_failure | true | ||||
| 2 | lamp_on (lamp arc power on) |
false | ||||
| 3 | limit_error | false | ||||
| 4 | fade_running | false | ||||
| 5 | reset_state | false | ||||
| 6 | missing_short_address | false | ||||
| 7 | power_failure | false | ||||
{
"data": {
"packet_type": "dali_driver_alert",
"drivers": [
{
"address": "dali_single_9",
"status": {
"driver_error": false,
"lamp_failure": true,
"lamp_on": false,
"limit_error": false,
"fade_running": false,
"reset_state": false,
"missing_short_address": false,
"power_failure": false
}
}
]
},
"errors": [],
"warnings": [
"dali_single_9_lamp_failure"
]
}
Example payload:
84 02 5A00 E200 59
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x84 | packet_type | 0x84 - metering_alert | metering_alert | |
| 1 | bit8 | 0x02 | Bit | Function | ||
| 0 | lamp_error_alert (min_power) | false | ||||
| 1 | over_current_alert (max_power) | true | ||||
| 2 | under_voltage_alert (min_voltage) | false | ||||
| 3 | over_voltage_alert (max_voltage) | false | ||||
| 4 | low_power_factor_alert (min_power_factor) | false | ||||
| 5..7 | reserved | |||||
| 2 | uint16 | 0x5A | power__W | 0x005A → 90 (W) | ||
| 3 | 0x00 | |||||
| 4 | uint16 | 0xE2 | voltage__V | 0x00E2 → 226 (V) | ||
| 5 | 0x00 | |||||
| 6 | uint8 | 0x59 | power_factor | converting: /100 | 0x59 → 89 89 / 100 = 0.89 |
|
{
"data": {
"packet_type": "metering_alert",
"lamp_error_alert": false,
"over_current_alert": true,
"under_voltage_alert": false,
"over_voltage_alert": false,
"low_power_factor_alert": false,
"power__W": 90,
"voltage__V": 226,
"power_factor": 0.89
},
"errors": [],
"warnings": [
"metering_over_current"
]
}
This notification is replaced by dim_notify functionality since FW 1.1.22 which means status_packets will be sent.
Example payload:
85 01
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x85 | packet_type | 0x85 - light_sensor_notification_deprecated | light_sensor_notification_deprecated | |
| 1 | uint8 | 0x01 | active_dim_step | 0x01 → 1 | ||
{
"data": {
"packet_type": "light_sensor_notification_deprecated",
"active_dim_step": 1
},
"errors": [],
"warnings": []
}
location_notification contains GNSS last position and is transmitted every 24h.
Example payload:
86 00 B3046942 B3EFB341 EE68B466
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x86 | packet_type | 0x86 - location_notifcation | location_notifcation | |
| 1 | uint8 | 0x00 | location_status | 0x00 - good_fix 0x01 - no_fix 0x02 … 0xFF - internal_error |
good_fix | |
| 2 | float | 0xB3 | latitude__deg |
included only when location_status is good_fix
|
0xB3046942 → 58.254589 | |
| 3 | 0x04 | |||||
| 4 | 0x69 | |||||
| 5 | 0x42 | |||||
| 6 | float | 0xB3 |
longitude__deg
|
included only when location_status is good_fix | 0xB3EF341 → 22.492041 | |
| 7 | 0xEF | |||||
| 8 | 0xB3 | |||||
| 9 | 0x41 | |||||
| 10 | uint32 | 0x66 | last_fix_utc_time | included only when location_status is good_fix | 0xEE68B466 → 1723099374 → "2024-08-08T06:42:54.000Z" |
|
| 11 | 0xB4 | |||||
| 12 | 0x68 | |||||
| 13 | 0xEE | |||||
{
"data": {
"packet_type": "location_notification",
"location_status": "good_fix",
"latitude__deg": "58.254589",
"longitude__deg": "22.492041",
"last_fix_utc_time": "2024-08-08T06:42:54.000Z"
},
"errors": [],
"warnings": []
}
Downlink: Send command to fPort 50. The same command will be returned if it was accepted and applied.
Note: If using firmware >1.1.10, please see 0x29 light_sensor_config_packet.
Example of how to turn ldr on when signal gets below 40 and off when it gets above 80.
01 50 28 00
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x01 | packet_type | 0x01 - deprecated_ldr_input_config_packet | deprecated_ldr_input_config_packet | |
| 1 | uint8 | 0x50 | ldr_off_threshold_high | 0 ... 254 0xFF - disabled comment: switch off / alert off threshold |
0x50 → 80 | |
| 2 | uint8 | 0x28 | ldr_on_threshold_low | 0 ... 254 0xFF - disabled comment: switch on / alert on threshold |
0x28 → 40 | |
| 3 | bit8 | 0x00 | Bit | Function | ||
| 0..1 | reserved | |||||
| 2 | trigger_alert_enabled | false | ||||
| 3..7 | reserved | |||||
{
"data": {
"packet_type": "deprecated_ldr_input_config_packet",
"ldr_off_threshold_high": 80,
"ldr_on_threshold_low": 40,
"trigger_alert_enabled": false
},
"errors": [],
"warnings": []
}
Note: If using firmware >1.1.10, please see 0x28 dig_input_config_packet.
Example of how to configure motion on dig_input to be on for 30 s for dali_broadcast address, no alert sent:
03 1E00 00 FE 64
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x03 | packet_type | 0x03 - deprecated_dig_input_config_packet | deprecated_dig_input_config_packet | |
| 1 | uint16 | 0x1E | light_on_duration__s | 0xFFFF - dig_input_disabled default: dig_input_disabled |
0x001E → 30 (s) | |
| 2 | 0x00 | |||||
| 3 | bit8 | 0x00 | Bit | Function | ||
| 0 | reserved | |||||
| 1 | signal_edge_rising | false | ||||
| 2 | trigger_alert_enabled default: false |
false | ||||
| 3..7 | reserved | |||||
| 4 | uint8 | 0xFE | address | see address encoding | dali_broadcast | |
| 5 | uint8 | 0x64 | dimming_level__percent | 0..100 | 0x64 → 100 (%) | |
{
"data": {
"packet_type": "deprecated_dig_input_config_packet",
"light_on_duration__s": 30,
"signal_edge_rising": false,
"trigger_alert_enabled": false,
"address": "dali_broadcast",
"dimming_level__percent": 100
},
"errors": [],
"warnings": []
}
Example of how to set status_interval to 10 minutes:
07 58020000
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x07 | packet_type | 0x07 - status_config_packet | status_config_packet |
| 1 | uint32 |
0x58 | status_interval__s | default: 3600 s reasonable min: 600 s maximum: 86400 s note: for testing purposes 60 s minimum is allowed |
0x00000258 → 600 |
| 2 | 0x02 | ||||
| 3 | 0x00 | ||||
| 4 | 0x00 |
{
"data": {
"packet_type": "status_config_packet",
"status_interval__s": 600
},
"errors": [],
"warnings": []
}
UL20xx requests time once a day since FW 1.1.14 by sending out LoRaWAN deviceTimeRequest which makes time_config_packet obsolete.
Example of how to sync time to January 16, 2020 15:23:31 (UTC):
09 F37F205E
Example of how to force time sync (using FW 1.1.15 or later):
09 00000000
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x09 | packet_type | 0x09 - time_config_packet | time_config_packet |
| 1 | uint32 | 0xF3 | device_unix_epoch |
Number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT) Notice: if the device has not received the timestamp form LoRaWAN DevTimeReq, it will start from Jan 1 2000. 0x00000000 - force_lorawan_devicetimereq (since FW 1.1.15) |
0x5E207FF3 → January 16, 2020 |
| 2 | 0x7F | ||||
| 3 | 0x20 | ||||
| 4 | 0x5E |
{
"data": {
"packet_type": "time_config_packet",
"device_unix_epoch": "2020-01-16T15:23:31.000Z"
},
"errors": [],
"warnings": []
}
Example of how to configure a 15 minute interval:
0B 84030000 FF
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x0B | packet_type | 0x0B - usage_config_packet | usage_config_packet |
| 1 | uint32 | 0x84 | usage_interval__s | minimum: 600 s 0x00 - disabled (does not turn off measuring) default: 1800 s |
0x00000384 → 900 (s) |
| 2 | 0x03 | ||||
| 3 | 0x00 | ||||
| 4 | 0x00 | ||||
| 5 | uint8 | 0xFF | reserved / mains_voltage__v* *only for some UL2014 that dont measure voltage |
default: 230 0xFF - ignore |
ignore |
{
"data": {
"packet_type": "usage_config_packet",
"usage_interval__s": 900
},
"errors": [],
"warnings": []
}
Boot delay helps when controllers are power-cycled daily, causing many devices to start regularly joining within a very short time window. boot_delay_range sets the max range from which the device can randomly pick a boot delay, easing network load during power recovery.
Example of how to set boot delay to 2 minutes:
0D 7800
Example of how to set boot delay to 10 minutes:
0D 5802
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x0D | packet_type | 0x0D - boot_delay_config_packet | boot_delay_config_packet |
| 1 | uint16 |
0x78 | boot_delay_range__s |
default: 15 s (boot_delay_range set to 0) note: since 1.1.14 if boot_delay_range is set doubles the initial time request interval. |
0x0078 → 120 (s) |
| 2 | 0x00 |
{
"data": {
"packet_type": "boot_delay_config_packet",
"boot_delay_range__s": 120
},
"errors": [],
"warnings": []
}
Useful for UL202x or UL203x where the green lights on top of lamp poles might disturb people looking down from higher buildings.
Notice: status_led_enabled is automatically disabled when light_sensor_config_packet is configured.
Example of how to turn off green status led:
15 00
| Byte | Type | Example | Parameter | Details | Example value | ||
|---|---|---|---|---|---|---|---|
| 0 | uint8 | 0x15 | packet_type | 0x15 - onboard_led_config_packet | onboard_led_config_packet | ||
| 1 | bit8 | 0x00 | Bit | Function | Default | status_led_enabled: false | |
| 0 | status_led_enabled | true | |||||
| 1..7 | reserved | ||||||
{
"data": {
"packet_type": "onboard_led_config_packet",
"status_led_enabled": false
},
"errors": [],
"warnings": []
}
For configuring metering alerts. Available only on controllers with a Metering chip. To avoid false positive alerts, please set all parameters with sufficient margin.
Example of how to set min_power to 5 W and min_voltage to 190 V:
16 01 0500 FFFF BE00 FFFF FF
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x16 | packet_type | 0x16 - metering_alert_config_packet | metering_alert_config_packet |
| 1 | uint8 | 0x01 | reserved | ||
| 2 | uint16 | 0x05 | min_power__W (lamp error) |
note: only monitored when dim ≥ 20% 0xFFFF - alert_off |
0x0005 → 5 (W) |
| 3 | 0x00 | ||||
| 4 | uint16 | 0xFF | max_power__W | 0xFFFF - alert_off | alert_off |
| 5 | 0xFF | ||||
| 6 | uint16 | 0xBE | min_voltage__V | 0xFFFF - alert_off | 0x00BE → 190 (V) |
| 7 | 0x00 | ||||
| 8 | uint16 | 0xFF | max_voltage__V | 0xFFFF - alert_off | alert_off |
| 9 | 0xFF | ||||
| 10 | uint8 | 0xFF | min_power_factor | note: only monitored when dim ≥ 20% value: 0-100 0xFF - alert_off |
alert_off |
{
"data": {
"packet_type": "metering_alert_config_packet",
"min_power__W": 5,
"max_power__W": "alert_off",
"min_voltage__V": 190,
"max_voltage__V": "alert_off",
"min_power_factor": "alert_off"
},
"errors": [],
"warnings": []
}
Astronomical calendar_config_packet contains rough coordinates to calculate location's sunrises/sunsets and then list of sunrise_steps and then sunset_steps.
Horizon and zenith_angle are 90° apart. So civil dusk would be 96°.
Example of how to set to 48.77°, 13.84° sunset_step 89.66° to 25% and sunrise_step 90.83° back to 0%:
20 11 00 0D13 6805 05 00 FE 19
Example similar to the above example, but sunrise_step disables the calendar in the morning so that e.g. fallback_dim_level takes over:
20 11 00 0D13 6805 05 FF FE 19
Example of how to disable calendar:
20 00 00 FFFFFFFF
| Byte | Type | Example | Parameter | Details | Example value | ||
|---|---|---|---|---|---|---|---|
| 0 | uint8 | 0x20 | packet_type | 0x20 - calendar_config_packet | calendar_config_packet | ||
| 1 | bit8 | 0x11 | Bit | Function | |||
| 0..3 | sunrise_step_length | 1 | |||||
| 4..7 | sunset_step_length | 1 | |||||
| note: if sunrise_step_length and sunset_step_length are 0, then 90.83° is assumed and dimming level is 50%. | |||||||
| 2 | uint8 | 0x00 | Bit | Function | Default | ||
| 0 | calendar_prefers_meta_pos* | 1 | 0 | ||||
| 1 | calendar_clamps_profiles* | 1 | 0 | ||||
| 2 | calendar_clamps_dig* | 1 | 0 | ||||
| 3 | ignore_gnss | 0 | 0 | ||||
| 4..7 | reserved | ||||||
| * - Available in firmware version 1.1.0 and onward | |||||||
| 3 | int16 | 0x0D | latitude__deg | convert: /100 | 0x130D → 4877 4877 / 100 = 48.77 (°) |
||
| 4 | int16 | 0x13 | |||||
| 5 | int16 | 0x68 | longitude__deg | convert: /100 | 0x0568 → 1384 1384 / 100 = 13.84 (°) |
||
| 6 | int16 | 0x05 | |||||
| sunrise_steps . sunrise_step_length number of following sunrise_steps blocks will follow: | |||||||
| r0 | int8 | 0x05 | zenith_angle__deg | convert: 90 + 1/6 * angle | 0x05 → 5 5 / 6 + 90 = 90.83 (°) |
||
| r1 | uint8 | 0x00 | dimming_level__percent | 0 ... 100 0xFF - disabled (calendar active, but not driving) |
0x00 → 0 (%) | ||
| sunset_steps . sunset_step_length number of following sunset_steps blocks will follow: | |||||||
| r0 | int8 | 0xFE | zenith_angle__deg | convert: 90 + 1/6 * angle | 0xFE → -2 -2 / 6 + 90 = 89.66 (°) |
||
| r1 | uint8 | 0x19 | dimming_level__percent | 0 ... 100 0xFF - disabled (calendar active, but not driving) |
0x19 → 25 (%) | ||
Notice: both sunrise and sunset zenith_angle_degs are positive numbers for simplicity. The block where they belong determines whether the angle belongs to sunrise or sunset.
The calendar_clamps_profiles setting essentially enables you to only activate the profile between sunset and sunrise (when calendar is active). The calendar_clamps_dig setting works similarly - the motion sensor will not light up when the sun is up if this is set to ‘true’.
In EU868 region calendar_config defaults to 48.77°, 13.84°, sunrise_steps: 96° → 25%, 90.83° → 0%, sunset_steps: 90.83° → 25% 96° → 50%.
{
"data": {
"packet_type": "calendar_config_packet",
"calendar_prefers_meta_pos": false,
"calendar_clamps_profiles": false,
"calendar_clamps_dig": false,
"ignore_gnss": false,
"latitude__deg": 48.77,
"longitude__deg": 13.84,
"sunrise_steps": [
{
"zenith_angle__deg": "90.83",
"dimming_level__percent": 0
}
],
"sunset_steps": [
{
"zenith_angle__deg": "89.67",
"dimming_level__percent": 25
}
]
},
"errors": [],
"warnings": []
}
Profiles have higher priority than calendar and lower than dig, unless set otherwise via calendar_config_packet.
Example of how to set profile to dim to 20% from 1:00 - 5:30 for weekdays (at GMT+0):
21 00 02 FE 3E 00 06 14 21 FF
Example of how to set profile to dim to 20% from 1:00 - 5:30 for weekdays (at GMT+1):
21 00 02 FE 3E 00 0C 14 27 FF
To clear (default) profile config, see reset-all-profiles.
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x21 | packet_type | 0x21 - profile_config_packet | profile_config_packet | |
| 1 | uint8 | 0x00 | profile_id | 0 ... 7 | 0 | |
| 2 | uint8 | 0x02 | dimming_steps_length | max: 10 | 2 | |
| 3 | uint8 | 0xFE | address | see address encoding | dali_broadcast | |
| 4 | bit8 | 0x3E | days_active | Bit | Function | |
| 0 | holiday | false | ||||
| 1 | mon | true | ||||
| 2 | tue | true | ||||
| 3 | wed | true | ||||
| 4 | thu | true | ||||
| 5 | fri | true | ||||
| 6 | sat | false | ||||
| 7 | sun | false | ||||
| 5 | uint8 | 0x00 | reserved | |||
| dimming_steps . Follows length number of dimming_steps blocks. | ||||||
| r0 | uint8 | 0x06 | step_time (UTC) |
minutes from the start of day note: convert local time to UTC. |
0x06 → 6 6 * 10 = 60 min → 1:00 AM |
|
| r1 | uint8 | 0x14 | dimming_level__percent | 0...100 0xFF - inactive |
0x14 → 20 (%) | |
Notes:
step_time must be converted from local time to UTC. E.g. for 21:00 GMT-1 set 20:00 UTC. E.g. for 21:00 GMT+5 set 02:00 UTC.
dimming_steps' step_times must be increasing in time, and must not roll over midnight.
E.g. following profile:
21:00 → 70%, 23:00 → 40%, 02:00 → 20%, 07:00 → inactive
should be entered as:
00:00 → 40%, 02:00→ 20%, 07:00→ inactive, 21:00 → 70%, 23:00 → 40%
If the first dimming_step's step_time is not 00:00, the profile is inactive until the first step.
If the last dimming_step's dimming_level is not inactive then the level is active until 00:00.
Multiple simultaneously active profiles on the same address may result in undefined behaviour.
{
"data": {
"packet_type": "profile_config_packet",
"profile_id": 0,
"address": "dali_broadcast",
"days_active": [
"mon",
"tue",
"wed",
"thu",
"fri"
],
"dimming_steps": [
{
"step_time": "01:00",
"dimming_level__percent": 20
},
{
"step_time": "05:30",
"dimming_level__percent": "inactive"
}
]
},
"errors": [],
"warnings": []
}
Sets fade_duration to all detected DALI drivers and also to analog_0_10v output.
Example of how to fade super smoothly with 16 s:
22 0A
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x22 | packet_type | 0x22 - fade_config_packet | fade_config_packet |
| 1 | uint8 | 0x0A | fade_duration__s |
default: 4 s 0x00 - 0.50 |
16.00 s |
| * - does not configure DALI driver fade, it is left as is | |||||
{
"data": {
"packet_type": "fade_config_packet",
"fade_duration__s": 16
},
"errors": [],
"warnings": []
}
Example configuration to set the 1st of May as a holiday:
23 01 05 01
Example configuration to set the 1st of January, 1st of May and 23rd of Dec as holidays.
23 03 01 01 05 01 0C 17
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x23 | packet_type | 0x23 - holiday_config_packet | holiday_config_packet |
| 1 | uint8 | 0x01 | length | max: 25 | |
| holidays. Following holiday block repeats length number of times . | |||||
| r0 | uint8 | 0x05 | month | 1..12 | 5 → may |
| r1 | uint8 | 0x01 | day | 1..31 | 1 |
{
"data": {
"packet_type": "holiday_config_packet",
"holidays": [
"05/01"
]
},
"errors": [],
"warnings": []
}
LCU polls DALI driver statuses with a certain interval.
Example of how to disable DALI polling:
24 00 0000
| Byte | Type | Example | Parameter | Details | Example value | ||
|---|---|---|---|---|---|---|---|
| 0 | uint8 | 0x24 | packet_type | 0x24 - dali_monitor_config_packet | dali_monitor_config_packet | ||
| 1 | bit8 | 0x00 | Bit | Function | Default | ||
| 0 | send_dali_alert | true | false | ||||
| 1 | correct_dali_dimming_level* | true | false | ||||
| 2 | periodic_bus_scan_enabled | true | false | ||||
| 3..7 | reserved | ||||||
| * - If driver should restart and lose its dim level, it will be corrected at next monitoring_interval. This may cause problems with multi-master setups, then disable. |
|||||||
| 2 | uint16 | 0x00 | monitoring_interval__s | 0 - disabled default: 60 s |
disabled | ||
| 3 | 0x00 | ||||||
{
"data": {
"packet_type": "dali_monitor_config_packet",
"send_dali_alert": false,
"correct_dali_dimming_level": false,
"periodic_bus_scan_enabled": false,
"monitoring_interval__s": 0,
"monitoring_interval": "disabled"
},
"errors": [],
"warnings": []
}
Fallback dim configures the default lamp state when nothing else is controlling the lamp (e.g. when astronomical calendar's last sunrise step is 0xFF - inactive). fallback_dim_level also applies when no valid time is available (when RTC time is lost and LoRaWAN not joined).
Example of how to set fallback_dimming_level to 80%:
25 50
Example of how to set fallback_dimming_level to 20%:
25 14
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x25 | packet_type | 0x25 - fallback_dim_config_packet | fallback_dim_config_packet |
| 1 | uint8 | 0x50 | fallback_dimming_level__percent | 0 ... 100 default: 25% note: can not be 0xFF |
0x50 → 80 (%) |
{
"data": {
"packet_type": "fallback_dim_config_packet",
"fallback_dimming_level__percent": 80
},
"errors": [],
"warnings": []
}
Example of how to set 59.4272704°, 24.6622098° and "Ööbiku Str. 2-16":
26 12 AC5E6D23 0017C10E C396C3B662696B75205374722E20322D3136
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x26 | packet_type | 0x26 - location_config_packet | location_config_packet |
| 1 | uint8 | 0x12 | address_ length | 0x12 → 18 | |
| 2 | int32 | 0xAC | latitude__deg | convert: /10e7 0x7FFFFFFF - not_configured |
0x236D5EAC → 594370220 594272704 / 10000000 = |
| 3 | 0x5E | ||||
| 4 | 0x6D | ||||
| 5 | 0x23 | ||||
| 6 | int32 | 0x00 | longitude__deg | convert: /10e7 0x7FFFFFFF - not_configured |
0x0EC11700 → 247535360 246622098 / 10000000 = |
| 7 | 0x17 | ||||
| 8 | 0xC1 | ||||
| 9 | 0x0E | ||||
| 10 ... n |
char array | 0xC3 0x96 0xC3 0xB6 0x62 0x69 0x6B 0x75 0x20 0x53 0x74 0x72 0x2E 0x20 0x32 0x2D 0x31 0x36 |
address | encoding: utf-8 length: address_ length note: does not end with \0 |
0xc3 0x96 0xc3 0xb6 0x62 0x69 0x6b 0x75 0x20 0x53 0x74 0x72 0x2e 0x20 0x32 0x2d 0x31 0x36 → "Ööbiku Str. 2-16" |
{
"data": {
"packet_type": "location_config_packet",
"latitude__deg": 59.437022,
"longitude__deg": 24.753536,
"address": "Ööbiku Str. 2-16"
},
"errors": [],
"warnings": []
}
Example of how to set LumaLink always connectable (convenient for testing):
27 03
Example of how to set LumaLink never connectable:
27 00
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x27 | packet_type | 0x27 - lumalink_config_packet | lumalink_config_packet |
| 1 | uint8 | 0x03 | access_mode | 0x00 - never_advertise 0x01 - first_commission* (default) 0x02 - every_boot (5 minutes) 0x03 - always |
always |
| * - first_commission - 4 h from first LoRaWAN join | |||||
{
"data": {
"packet_type": "lumalink_config_packet",
"access_mode": "always"
},
"errors": [],
"warnings": []
}
This is used for both DIG input as well as D4i motion sensors. Please note that neither DIG input nor D4i is supported by every controller.
Example of how to configure motion on dig_input to be on for 120 s for dali_broadcast address, no notification is sent:
28 00 03 FE 64 FF 0000 7800
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x28 | packet_type | 0x28 - dig_input_config_packet | dig_input_config_packet | |
| 1 | uint8 | 0x00 | dig_enabled | 0x00 - true 0xFF - false |
true | |
| 2 | bit8 | 0x03 | Bit | Function | ||
| 0 | dig_mode_button (false - acting on edge true - acting on on_state) |
true | ||||
| 1 | polarity_high_or_rising | true | ||||
| 2 | notification_on_activation | false | ||||
| 3 | notification_on_inactivation | false | ||||
| 4..6 | reserved | |||||
| 7 | source_d4i_motion_sensor* | false | ||||
| 3 | uint8 | 0xFE | address | see address encoding | dali_broadcast | |
| 4 | uint8 | 0x64 | active_dimming_level__percent | 0..100 0xFF - inactive |
0x64 → 100 (%) | |
| 5 | uint8 | 0xFF | inactive_dimming_level__percent | 0..100 0xFF - inactive |
0xFF → inactive | |
| 6 | uint16 | 0x00 | on_delay__s | delay time when turning on | 0x0000 → 0 (s) | |
| 7 | 0x00 | |||||
| 8 | uint16 | 0x78 | off_delay__s | delay time when turning off | 0x0078 → 120 (s) | |
| 9 | 0x00 | |||||
*replaces physical dig interface (disables it) and searches signals from external occupancy sensor on DALI bus. Available since 1.1.27.
{
"data": {
"packet_type": "dig_input_config_packet",
"dig_mode_button": true,
"polarity_high_or_rising": true,
"notification_on_activation": false,
"notification_on_inactivation": false,
"address": "dali_broadcast",
"active_dimming_level__percent": 100,
"inactive_dimming_level__percent": "inactive",
"on_delay__s": 0,
"off_delay__s": 120
},
"errors": [],
"warnings": []
}
Notice: Configuring onboard light_sensor automatically disables onboard status LED (see onboard_led_config_packet).
Example of how to configure:
29 02 0E 3C FE 0000C441 3C CCCCF642 FF
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x29 | packet_type | 0x29 - light_sensor_config_packet | light_sensor_config_packet | |
| 1 | uint8 | 0x02 | step_count | 2..8 0xFF - disabled |
0x02 → 2 | |
| 2 | bit8 | 0x0E | Bit | Function | ||
| 0 | notification_on_every_step | false | ||||
| 1 | light_sensor_clamps_profile overrides active profile if profile is higher |
true | ||||
| 2 | light_sensor_clamps_dig overrides active dig if dig is higher |
true | ||||
| 3 | interpolate_steps | true | ||||
| 4..7 | reserved | |||||
| 3 | uint8 | 0x3C | measurement_duration__s | how long measurement takes place | 0x3C → 60 (s) | |
| 4 | uint8 | 0xFE | address | see address encoding | dali_broadcast | |
| dim_steps. Following dim_steps block repeats step_count number of times. Note: light_level value must be increasing. |
||||||
| r0 | float | 0x00 | light_level__lx | hw with ambient light sensor: 0..120000 (lx) hw with ldr input: unit: none 0..255 |
0x41C40000 → 24.5(lx) | |
| r1 | 0x00 | |||||
| r2 | 0xC4 | |||||
| r3 | 0x41 | |||||
| r4 | uint8 | 0x3C | dimming_level__percent | 0..100 0xFF - inactive |
0x3C → 60 (%) | |
{
"data": {
"packet_type": "light_sensor_config_packet",
"notification_on_every_step": false,
"light_sensor_clamps_profile": true,
"light_sensor_clamps_dig": true,
"interpolate_steps": true,
"measurement_duration__s": 60,
"address": "dali_broadcast",
"dim_steps": [
{
"light_level__lx": "24.50",
"dimming_level__percent": 60
},
{
"light_level__lx": "123.4",
"dimming_level__percent": "inactive"
}
]
},
"errors": [],
"warnings": []
}
Example of how to request status_packet on every dim level change:
2A 12 05
Example of how to disable dim_notify:
2A FF 00
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x2A | packet_type | 0x2A - dim_notify_config_packet | dim_notify_config_packet |
| 1 | uint8 | 0x12 | random_delay__s |
conversion: *5 0xff - disabled (notifications) |
0x12 → 18 18 * 5 = 90 (s) |
| 2 | uint8 | 0x05 | packet_limit__s | conversion: *60 default: 600 s |
0x05 → 5 5 * 60 = 300 (s) |
{
"data": {
"packet_type": "dim_notify_config_packet",
"random_delay__s": 90,
"packet_limit__s": 300
},
"errors": [],
"warnings": []
}
On the UL2024, the control bus interface can be switched between DALI and 0-10V (analog_0_10v).
Beware: selecting the dali interface applies 19 V to the bus, which may damage 0-10V drivers, if connected.
Example of how to activate DALI interface:
2B 00
Example of how to activate 0-10V interface:
2B 01
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x2B | packet_type | 0x2B - interface_type_config_packet | interface_type_config_packet |
| 1 | uint8 | 0x00 | interface_type |
0x00 - dali * for the UL2024 the default is analog 0-10V for safety, for the late UL2023 the default depends on order config (#A or #D). note: only late UL2023 and all UL2024 models support configuring interface_type |
0x00 → dali |
{
"data": {
"packet_type": "interface_type_config_packet",
"interface_type": "dali",
},
"errors": [],
"warnings": []
}
Example of how to set up multicast device 0:
52 00 44332211 82840C7056429B143D21974557F93A53 82840C70C08494B931FE2FA6F8835C6A
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x52 | packet_type | 0x52 - multicast_config_packet | multicast_config_packet |
| 1 | uint8 | 0x00 | multicast_device | 0 … 3 | 0 |
| 2-5 | uint32 | 0x44 0x33 0x22 0x11 |
devaddr | 11223344 | |
| 6-21 | uint8 array |
0x82 0x84 0x0C 0x70 0x56 0x42 0x9B 0x14 0x3D 0x21 0x97 0x45 0x57 0xF9 0x3A 0x53 |
nwkskey | 82840C7056429B14 3D21974557F93A53 |
|
| 22-37 | uint8 array |
0x82 0x84 0x0C 0x70 0xC0 0x84 0x94 0xB9 0x31 0xFE 0x2F 0xA6 0xF8 0x83 0x5C 0x6A |
appskey | 82840C70C08494B9 31FE2FA6F8835C6A |
{
"data": {
"packet_type": "multicast_config_packet",
"multicast_device": 0,
"devaddr": "11223344",
"nwkskey": "82840C7056429B143D21974557F93A53",
"appskey": "82840C70C08494B931FE2FA6F8835C6A"
},
"errors": [],
"warnings": []
}
Chained configuration allows to chain up (concatenate) any configuration packet to simplify initial configuration and reduce the number of packets.
Example of chained configuration consisting of ldr_input_config_packet and boot_delay_config_packet:
FE 01 50 28 00 0D 5802
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFE | packet_type | 0xFE - chained_config_packet | chained_config_packet |
| payloads will follow. | |||||
And the included config_packets follow (complete packets).
{
"data": {
"packet_type": "chained_config_packet",
"payloads": [
{
"packet_type": "deprecated_ldr_input_config_packet",
"ldr_off_threshold_high": 80,
"ldr_on_threshold_low": 40,
"trigger_alert_enabled": false
},
{
"packet_type": "boot_delay_config_packet",
"boot_delay_range__s": 600
}
]
},
"errors": [],
"warnings": []
}
Example of how to reset holiday_config:
FF 23
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFF | packet_type | 0xFF - clear_config_packet | clear_config_packet |
| 1 | uint8 | 0x23 | reset_target |
0x20 - calendar_config Note: following targets have an extra parameter. See the structure below. |
holiday_config |
{
"data": {
"packet_type": "clear_config_packet",
"reset_target": "holiday_config"
},
"errors": [],
"warnings": []
}
Example of how to reset all profiles:
FF 21 FF
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFF | packet_type | 0xFF - clear_config_packet | clear_config_packet |
| 1 | uint8 | 0x21 | reset_target | 0x21 - profile_config | profile_config |
| 2 | uint8 | 0xFF | profile_id | 0x00 - profile_0 ... 0x07 - profile_7 0xFF - all_profiles |
all_profiles |
{
"data": {
"packet_type": "clear_config_packet",
"reset_target": "profile_config",
"address": "all_profiles"
},
"errors": [],
"warnings": []
}
Example of how to reset all multicast devices:
FF 52 FF
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFF | packet_type | 0xFF - clear_config_packet | clear_config_packet |
| 1 | uint8 | 0x52 | reset_target | 0x52 - multicast_config | multicast_config |
| 2 | uint8 | 0xFF | multicast_device | 0x00 - multicast_device_0 ... 0x03 - multicast_device_3 0xFF - all_multicast_devices |
all_multicast_devices |
{
"data": {
"packet_type": "clear_config_packet",
"reset_target": "multicast_config",
"multicast_device": "all_multicast_devices"
},
"errors": [],
"warnings": []
}
Example of how to reset everything (replace device_serial):
FF FF 0D008350
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFF | packet_type | 0xFF - clear_config_packet | clear_config_packet |
| 1 | uint8 | 0xFF | reset_target | 0xFF - factory_reset | factory_reset |
| 2 | uint32 | 0x0D | device_serial | formatting: hex | 5083000D |
| 3 | 0x00 | ||||
| 4 | 0x83 | ||||
| 5 | 0x50 |
{
"data": {
"packet_type": "clear_config_packet",
"reset_target": "factory_reset",
"device_serial": "5083000D"
},
"errors": [],
"warnings": []
}
Direction: Downlink. Request any configuration packet by its header by sending request to fPort 49.
Example of how to request calendar_config_packet:
20
| Byte | Type | Example | Parameter | Details | Example Value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x20 | packet_type |
0x01 - deprecated_ldr_input_config_request Note: following targets have an extra parameter. See the structure below. 0x21 - profile_config_request |
calendar_config_request |
{
"data": {
"packet_type": "calendar_config_request"
},
"errors": [],
"warnings": []
}
Example of how to request all_profiles:
21 FF
| Byte | Type | Example | Parameter | Details | Example Value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x21 | packet_type | 0x21 - profile_config_request | profile_config_request |
| 1 | uint8 | 0xFF | profile_id | 0 ... 7 - profile_0 ... profile_7 0xFF - all_profiles |
all_profiles |
"data": {
"packet_type": "profile_config_request",
"profile_id": "all_profiles"
},
"errors": [],
"warnings": []
}
Example of how to request multicast_device 0:
52 00
| Byte | Type | Example | Parameter | Details | Example Value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x52 | packet_type | 0x52 - multicast_config_request | multicast_config_request |
| 1 | uint8 | 0x00 | multicast_device | 0 ... 3 | 0 |
{
"data": {
"packet_type": "multicast_config_request",
"multicast_device": 0
},
"errors": [],
"warnings": []
}
Uplink: Send command to fPort 51.
Example of how to send the controller to DFU mode:
FF
Example of how to reboot the controller:
FE
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0xFF | packet_type | 0xFE - reboot_request 0xFF - ota_dfu_request (stays in bootloader for 2 minutes) |
ota_dfu_request |
{
"data": {
"packet_type": "activate_dfu_command"
},
"errors": [],
"warnings": []
}
Downlink: Send command to fPort 60.
Manually override dimming_level for any address. It is recommended to use timed_dimming_command instead. This command is for testing purposes, reboot will reset it. To achieve lasting effect, use calendar_config_packet / profile_config_packet / fallback_dim_config_packet.
Example of how to manually override all DALI drivers to 100%. Does not affect analog output:
01 FE 64
Example of how to manually override all DALI drivers to 0%:
01 FE 00
Example of how to cancel manual override on all DALI drivers:
01 FE FF
Example of how to override analog output to 50%:
01 01 32
Example of how to override DALI drivers 2 to 50% and 4 to 100%:
01 04 32 08 64
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x01 | packet_type | 0x01 - manual_dimming | manual_dimming |
| destination. Add at least one following block: | |||||
| r0 | uint8 | 0xFE | address | see address encoding | dali_broadcast |
| r1 | uint8 | 0x64 | dimming_level__percent | 0..100 0xFF - resume note: relay turns on if at least one output is > 1%. |
0x64 → 100 (%) |
{
"data": {
"packet_type": "manual_dimming",
"destination": [
{
"address": "dali_broadcast",
"dimming_level__percent": 100
}
]
},
"errors": [],
"warnings": []
}
A variant of manual_dimming_command, but safer because manual_timed_dimming_command returns to normal operation after set duration.
Example of how to set all DALI drivers to 100% for 5 minutes:
09 FE 64 05
Example of how to set analog drivers to 100% for 5 minutes:
09 01 64 05
Example of how to cancel previous timed dimming on all DALI drivers:
09 FE FF 00
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x09 | packet_type | 0x09 - manual_timed_dimming | manual_timed_dimming |
| destination. The packet ends with at least one dimming destination block. | |||||
| r0 | uint8 | 0xFE | address | see address encoding | dali_broadcast |
| r1 | uint8 | 0x64 | dimming_level__percent | 0..100 0xFF - resume |
0x64 → 100 (%) |
| r2 | uint8 | 0x05 | duration__min | unit: minutes | 0x05 → 5 (minutes) |
{
"data": {
"packet_type": "manual_timed_dimming",
"destination": [
{
"address": "dali_broadcast",
"dimming_level__percent": 100,
"duration__min": 5
}
]
},
"errors": [],
"warnings": []
}
Example of how to request only usage_packet:
05 01
Example of how to request only status_packet:
05 02
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x05 | packet_type | 0x05 - status_usage_request | status_usage_request | |
| 1 | bit8 | 0x01 | Bit | Function | ||
| 0 | usage_requested | true | ||||
| 1 | status_requested | false | ||||
| 2 | dim_map_report_requested | false | ||||
| 3 | request_gnss_notification* | false | ||||
| 4..7 | reserved | |||||
* Ignore if GNSS is not supported. Available since fw 1.1.23.
{
"data": {
"packet_type": "status_usage_request",
"usage_requested": true,
"status_requested": false,
"dim_map_report_requested": false,
"request_gnss_notification": false
},
"errors": [],
"warnings": []
}
Example response:
05 04 12 94 fe 00
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x05 | 0x05 | |||
| 1 | uint8 | 0x04 | packet_type | 0x04 - dim_map_report | dim_map_report | |
| driver, Follows as many driver blocks as fits. | ||||||
| r0 | uint8 | 0x12 | address | see address encoding | 0x12 >> 0x09 → dali_single_9 | |
| r1 | uint8 | 0x94 | dali_min_level | 0x94 → 148 | ||
| r2 | uint8 | 0xFE | dali_max_level | 0xFE → 254 | ||
| r3 | uint8 | 0x00 | dimming_curve | 0x00 - logarithmic 0x01 - linear |
logarithmic | |
{
"data": {
"packet_type": "status_usage_request",
"dim_map_report_requested": true,
"drivers": [
{
"address": "dali_single_9",
"dali_min_level": 148,
"dali_max_level": 254,
"dimming_curve": "logarithmic"
}
]
},
"errors": [],
"warnings": []
}
Example of how to turn on open_drain_output:
0C 01
Example of how to turn off open_drain_output:
0C 00
| Byte | Type | Example | Parameter | Details | Example value | |
|---|---|---|---|---|---|---|
| 0 | uint8 | 0x0C | packet_type | 0x0C - open_drain_output_control | open_drain_output_control | |
| 1 | bit8 | 0x01 | Bit | Function | ||
| 0 | open_drain_output_on (conducting) | true | ||||
| 1..7 | reserved | |||||
{
"data": {
"packet_type": "open_drain_output_control",
"open_drain_output_on": true
},
"errors": [],
"warnings": []
}
⭣REQUEST COMMAND.
Example of how to query Max Level (161) on DALI short addresss 36:
03 48 A1
Example 2 of how to query Max Level, Min Level, Power-On Level, System Failure Level, Fade Time/Rate on DALI short addresss 36:
03 48 A1 48 A2 48 A3 48 A4 48 A5
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x03 | packet_type | 0x03 - custom_dali_request | custom_dali_request |
| query . At least one query block will follow: | |||||
| r0 | uint8 | 0x48 | address | see address encoding | 0x48 >> 1 = 0x24 → 36 |
| r1 | uint8 | 0xA1 | dali_query | 0xA1 → 161 | |
{
"data": {
"packet_type": "custom_dali_request",
"query_data_raw": "48A1",
"address": "dali_single_36",
"dali_query": 161
},
"errors": [],
"warnings": []
}
⭡ANSWER.
Example response for above query:
03 48 A1 FE
Example response 2 for above query 2:
03 48 A1 FE 48 A2 A8 48 A3 FE 48 A4 FE 48 A5 07
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x03 | packet_type | 0x03 - custom_dali_request | custom_dali_request |
| query . At least one query block will follow: | |||||
| r0 | uint8 | 0x48 | address | see address encoding | 0x48 >> 1 = 0x24 → 36 |
| r1 | uint8 | 0xA1 | dali_query | 0xA1 → 161 | |
| r2 | uint8 | 0xFE | dali_response | 0xFE → 254 | |
{
"data": {
"packet_type": "custom_dali_request",
"query_data_raw": "48A1FE",
"address": "dali_single_36",
"dali_query": 161,
"dali_response": 254
},
"errors": [],
"warnings": []
}
Example of how to configure driver power-on level to 0% on dali_broadcast address:
04 A300FF2DFF2D
Example of how to configure driver power-of level to 100% on dali_broadcast address:
04 A3FEFF2DFF2D
Example of how to set all drivers to maximum dim level:
04 FEFE
04 FF06
Example of how to set all drivers to minimum dim level:
04 FE05
For addressing DALI driver, see address_dali_driver.
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x04 | packet_type | 0x04 - custom_dali_command | custom_dali_command |
| 1 .. .. n |
uint8 array |
0xA3 0x00 0xFF 0x2D 0xFF 0x2D |
dali_command | command specific data |
{
"data": {
"packet_type": "custom_dali_command",
"dali_command": "A300FF2DFF2D"
},
"errors": [],
"warnings": []
}
⭣REQUEST COMMAND.
Example of how to read GTIN from address 2:
07 04 00 03 06
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x07 | packet_type | 0x07 - driver_memory_read | driver_memory_read |
| 1 | uint8 | 0x04 | address | see address encoding | 0x04 >> 1 = 0x02 = 2 (single) |
| 2 | uint8 | 0x00 | memory_bank | 0x00 → 0 | |
| 3 | uint8 | 0x03 | memory_address | 0x03 → 3 | |
| 4 | uint8 | 0x06 | read_size__bytes | note: max read_size depends on LoRaWAN DataRate and memory_bank size. | 0x06 → 6 |
{
"data": {
"packet_type": "driver_memory_read",
"address": "dali_single_2",
"memory_bank": 0,
"memory_address": 3,
"read_size__bytes": 6
},
"errors": [],
"warnings": []
}
⭡RESPONSE.
Example response:
07 04 00 03 06 07EDFACE82E5
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x07 | packet_type | 0x07 - driver_memory_read | driver_memory_read |
| 1 | uint8 | 0x04 | address | see address encoding | 0x04 >> 1 = 0x02 = 2 (single) |
| 2 | uint8 | 0x00 | memory_bank | 0x00 → 0 | |
| 3 | uint8 | 0x03 | memory_address | 0x03 → 3 | |
| 4 | uint8 | 0x06 | read_size__bytes | 0x06 → 6 | |
| 5 … … n |
uint8 ... ... uint8 |
0x07 0xED 0xFA 0xCE 0x82 0xE5 |
data | length: read_size | 0x7EDFACE82E5 → 8718696481509 (GTIN) |
{
"data": {
"packet_type": "driver_memory_read",
"address": "dali_single_2",
"memory_bank": 0,
"memory_address": 3,
"read_size__bytes": 6,
"memory_value": "07EDFACE82E5"
},
"errors": [],
"warnings": []
}
⭣REQUEST COMMAND.
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x08 | packet_type | 0x08 - driver_memory_write | driver_memory_write |
| 1 | uint8 | address | see address encoding | ||
| 2 | uint8 | memory_bank | |||
| 3 | uint8 | memory_address | |||
| 4 ... .. n |
uint8 ... ... uint8 |
data |
⭡RESPONSE.
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x08 | packet_type | 0x08 - driver_memory_write | driver_memory_write |
| 1 | uint8 | address | see address encoding | ||
| 2 | uint8 | memory_bank | |||
| 3 | uint8 | memory_address | |||
| 5 ... .. n |
uint8 ... ... uint8 |
data |
If the operation fails, only header is returned with no contents.
Since FW ver 1.1.9 UL20xx addresses single DALI driver automatically at boot.
Assigns short address to DALI driver. Notice: to avoid address conflicts, use only with single DALI driver.
Example of how to set DALI address 9:
0A 12
To reset the short addresses of all connected drivers please send following custom_dali_command to fPort 60:
04A3FFFF80FF80
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x0A | packet_type | 0x0A - dali_address_driver | dali_address_driver |
| 1 | uint8 | 0x12 | address |
see address encoding 0x00 - dali_single_0 |
0x12 >> 1 = 0x9 → 9 dali_single_9 |
{
"data": {
"packet_type": "address_dali_driver",
"address": "dali_single_9"
},
"errors": [],
"warnings": []
}
Blinks each addressed Dali driver on the bus to help identify what is connected and addressed.
Example of how to blink all addressed drivers:
0B
| Byte | Type | Example | Parameter | Details | Example value |
|---|---|---|---|---|---|
| 0 | uint8 | 0x0B | packet_type | 0x0B - dali_identify | dali_identify |
{
"data": {
"packet_type": "dali_identify"
},
"errors": [],
"warnings": []
}
The address field in many packets is encoded in following way:
| Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 | address values | address range |
|---|---|---|---|---|---|---|---|---|---|
| 0 | x | x | x | x | x | x | 0 | 0x00 - dali_single_0 0x02 - dali_single_1 ... 0x7C - dali_single_62 0x7E - dali_single_63 |
0-63 |
| 0 | x | x | x | x | 0 | 0 | 1 | 0x80 - dali_group_0 0x82 - dali_group_1 ... 0x9C - dali_group_14 0x9E - dali_group_15 |
0-15 |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0xFE - dali_broadcast (since 1.1.x 0xFE does not control analog_0_10v) |
|
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x01 - analog_0_10v | |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0xFF - all_devices (dali_broadcast + analog_0_10v) |
Notice: all DALI addresses start from Bit 1. Thats why there is no conflict between DALI addressses and analog_0_10v.
Help us keep the documentation accurate and up-to-date.
If you find any errors or outdated information, please contact us at support@nasys.no