This document describes the payloads of firmware version 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.
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_unadressed_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_unadressed_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 contains 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 - profile_0 0x21 - calendar_day |
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"
]
}
Example payload:
85 01
Byte | Type | Example | Parameter | Details | Example value | |
---|---|---|---|---|---|---|
0 | uint8 | 0x85 | packet_type | 0x85 - light_sensor_notification | light_sensor_notification | |
1 | uint8 | 0x01 | active_dim_step | 0x01 → 1 |
{
"data": {
},
"errors": [],
"warnings": [
"metering_over_current"
]
}
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 the DALI addresses start from Bit 1. Thats why there is no conflict between the DALI addresses and analog_0_10v.
See Command_packets