Configuration
Configuration is managed through the admin web UI under Connections > LoRaWAN and is persisted as Ignition resources. The same objects can be managed via the REST API and the system.lorawan.* scripting functions.
Module Settings
Navigate to Connections > LoRaWAN > Settings to configure the network server. Settings are a singleton (resource lorawan-settings) split into Regional Parameters and Server Configuration.
| Setting | Type | Default | Applied | Description |
|---|---|---|---|---|
| Region | Dropdown | EU868 | Requires gateway restart | Regional frequency plan |
| UDP Port | Integer | 1700 | Requires gateway restart | Semtech Packet Forwarder listening port |
| Bind Address | String | 0.0.0.0 | Requires gateway restart | Network interface to bind to |
| Gateway Timeout | Integer | 120 | Live | Seconds before marking a gateway disconnected |
The module also maintains internal state (a blocked-gateways list and a join-nonce counter) that is not typically edited directly.
Supported Regions
The Region dropdown offers 11 frequency plans. Pick the one your national regulator allows — it must match what your gateways and devices are provisioned for.
| Region | Band | Where it is used |
|---|---|---|
| EU868 (default) | Europe 863–870 MHz | Most of Europe (Albania, Andorra, Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Iceland, Ireland, Italy, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Moldova, Montenegro, Netherlands, North Macedonia, Norway, Poland, Portugal, Romania, Serbia, Slovakia, Slovenia, Spain, Sweden, Switzerland, United Kingdom), plus Türkiye, much of Africa (Angola, Botswana, DR Congo, Eswatini, Madagascar, Malawi, Mauritius, Morocco, Mozambique, Namibia, Seychelles, South Africa, Tanzania, Zambia, Zimbabwe) and the Gulf (Bahrain, Saudi Arabia, UAE) |
| US915 | North/South America 902–928 MHz | United States, Canada, Mexico, Puerto Rico, and much of South and Central America (Argentina, Bolivia, Colombia, Costa Rica, Dominican Republic, Ecuador, Guyana, Panama, Paraguay, Peru, Suriname, Uruguay, Venezuela) |
| AU915 | Australia 915–928 MHz | Australia, New Zealand, Brazil, Chile, and parts of South America (Argentina and Ecuador also permit US915) |
| AS923 | Asia 920–923 MHz (Group 1) | Japan, Malaysia, Singapore, Brunei, Cambodia, Hong Kong, Laos, Taiwan, Thailand |
| AS923-2 | Group 2 — shifted −1.8 MHz | Indonesia, Vietnam |
| AS923-3 | Group 3 — shifted −6.6 MHz | Philippines, Cuba |
| AS923-4 | Group 4 — shifted −5.9 MHz | Israel |
| CN470 | China 470–510 MHz | China |
| IN865 | India 865–867 MHz | India |
| KR920 | South Korea 920–923 MHz | South Korea |
| RU864 | Russia 864–870 MHz | Russia |
A few countries permit more than one plan (Argentina and Ecuador allow both US915 and AU915; Russia allows RU864 and EU868), and national allocations change. The authority is your local regulator, cross-checked against the LoRa Alliance RP002 Regional Parameters and The Things Network's frequency plans by country.
Choose the region that matches your LoRaWAN devices and local regulations. Changing the region requires a gateway restart.
Gateway Management
Navigate to Connections > LoRaWAN > Gateways to manage gateways (grid view with an add wizard). Each gateway is stored as a gateway resource.
Registering a Gateway
- Click Add Gateway
- Enter the Gateway EUI (16-character hex, e.g.,
A840411234567890) - Optionally provide a Name, Description, and Location
- Click Save
If no name is provided, it defaults to Gateway_<last 8 of EUI>.
Gateway Properties
| Property | Description |
|---|---|
| Name | Friendly name for the gateway (defaults to Gateway_<last8>) |
| EUI | 64-bit identifier, 16 hex characters (required) |
| Description | Optional description |
| Location | Optional location information |
Uplinks from gateways that are not registered are rejected. Register every gateway before it can forward traffic. A blocked-gateways list is also maintained to explicitly deny specific gateways.
Runtime Status
The gateway list shows real-time status:
| Column | Description |
|---|---|
| Status | Connected or Disconnected |
| Address | Gateway IP address |
| Last Seen | Timestamp of last communication |
| Uplink Count | Total uplinks received |
| Downlink Count | Total downlinks sent |
Device Management
Navigate to Connections > LoRaWAN > Devices to manage devices. Each device is stored as a device resource. If no name is provided, it defaults to Device_<last 8 of DevEUI>.
Device Registration Wizard
The wizard guides you through 4 steps: Activation Mode → Device Class → Details → Payload Decoder.
Step 1: Activation Mode
| Mode | Description |
|---|---|
| OTAA | Over-the-Air Activation - device joins dynamically using AppKey (default) |
| ABP | Activation By Personalization - pre-provisioned session keys |
OTAA is recommended for most deployments as it provides better security through dynamic session keys.
Step 2: Device Class
| Class | Description |
|---|---|
| Class A | Battery-optimized; receives only after transmitting (RX1/RX2 windows). Default. |
| Class C | Always listening; receives downlinks with minimal delay |
Only Class A and Class C are offered here. Class B (beacon-synchronised receive windows) is not implemented — setting it through CSV import, the REST API, or scripting is rejected with "Class B is not supported. Use Class A or Class C."
Step 3: Device Details
For OTAA devices:
| Field | Format | Description |
|---|---|---|
| Device EUI | 16 hex chars (required) | Unique device identifier |
| Application Key | 32 hex chars | Root key for join and session derivation |
| Name | Text | Friendly name |
For ABP devices:
| Field | Format | Description |
|---|---|---|
| Device EUI | 16 hex chars (required) | Unique device identifier |
| Device Address | 8 hex chars | Pre-assigned network address |
| Network Session Key | 32 hex chars | Key for network layer |
| App Session Key | 32 hex chars | Key for application layer |
| Name | Text | Friendly name |
Step 4: Payload Decoder (Optional)
Select a JavaScript decoder to parse uplink payloads into structured tags (stored on the device as decoderName).
Payload Decoders
Payload decoders transform raw LoRaWAN payloads into meaningful Ignition tags. They are managed on the Decoders tab (a code editor) under Connections > LoRaWAN > Devices, and each is stored as a decoder resource.
Creating a Decoder
- Go to Connections > LoRaWAN > Devices
- Click the Decoders tab
- Add a decoder with a Name (matching
^[a-zA-Z][a-zA-Z0-9_]*$) and JavaScript code - Assign it to a device via the device's Decoder setting
Decoder Script Format
Decoders follow the ChirpStack/TTN decodeUplink(input) contract.
function decodeUplink(input) {
var bytes = input.bytes; // number[] - raw payload bytes
var fPort = input.fPort; // number - LoRaWAN port
var temp = bytes[0] | (bytes[1] << 8);
if (temp > 0x7FFF) temp -= 0x10000; // sign-extend int16
return {
data: {
Temperature: temp / 10,
Humidity: bytes[2]
}
};
}
Input Object
| Property | Type | Description |
|---|---|---|
bytes | number[] | Raw payload as a byte array |
fPort | number | LoRaWAN port |
The decoder runs only for uplinks with fPort > 0 and a non-empty payload.
Return Object
The function returns { data: { field: value } }. Each field under data becomes a dynamic tag at the device root ([LoRaWAN]/Devices/{Name}/{field}).
Type Mapping
| JavaScript Type | Ignition Tag Type |
|---|---|
| integer | Int |
| number | Double |
| boolean | Boolean |
| string | String |
Decoders run in a sandboxed GraalJS environment with no file, network, or system access. Execution is limited by a 500ms watchdog.
Device Extended Configuration
Each device has additional settings accessible via the edit dialog (also available through the API and scripting):
| Setting | Description |
|---|---|
| Name | Friendly name (can be changed anytime) |
| Application Key | OTAA root key |
| Device Class | A or C (B is rejected) |
| Decoder | Assigned payload decoder name |
Session data (DevAddr, NwkSKey, AppSKey, FCntUp, FCntDown, LastRssi, LastSnr, and related fields) is stored per device and, for OTAA devices, populated after join.
Bulk Import / Export
Devices and gateways can be bulk-managed via CSV. Import and export (and a downloadable template) are available through the REST API and the scripting functions.
Per-Device Tags
When a device is registered, tags are created automatically under [LoRaWAN]/Devices/{DeviceName}/:
[LoRaWAN]/Devices/{DeviceName}/
├── {DecodedField} Dynamic tags produced by the decoder (device root)
├── Config/
│ ├── Name
│ ├── DevEUI
│ ├── DevAddr
│ ├── DeviceClass
│ └── Decoder
├── Uplink/
│ ├── Timestamp
│ ├── Counter
│ ├── Port
│ ├── PayloadHex
│ ├── RSSI
│ ├── SNR
│ ├── Frequency
│ ├── DataRate
│ └── GatewayEUI
├── Downlink/
│ ├── Port (writable)
│ ├── Confirmed (writable)
│ ├── Payload (writable, sticky hex)
│ ├── Send (writable, edge-trigger)
│ └── Queue (dataset)
└── Status/
├── Battery
├── Margin
├── Timestamp
└── Request (writable - set true to request DevStatusReq)
Gateway tags are created under [LoRaWAN]/Gateways/{GatewayName}/ with: Name, EUI, Status, Address, LastSeen, UplinkCount, DownlinkCount.