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 | false | ||||
5 | lamp_error_alert_in_24h | true | ||||
6 | power_alert_in_24h | false | ||||
7 | power_factor_alert_in_24h | 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 | header | 0x03 - d4i_light_sensor | |||
r1 | uint16 | d4i_light_sensor__lx | convert: (10^(value/4000))/1000 (lx) note: sent, if D4i light sensor is detected 0xFFFF - unavailable |
|||
r2 | ||||||
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 | dig_input | ||
r1 | uint8 | tilt_sensor__deg | range: 0° (upright) - 180° (upside down) 0xFF - unavailable note: available on newer hardware |
|||
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
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 | ||
2 | uint8 | 0x02 | dimming_steps_length | max: 10 | ||
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": []
}
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