This document describes payloads of FW 1.1.x. Differences with FW 1.0.x 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. Parameter names are used consistently where possible.
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..7 | reserved |
{
"data": {
"packet_type": "status_usage_request",
"usage_requested": true,
"status_requested": 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": []
}
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) |
|
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.
See Uplink packets