LoRaWAN Device
Network Server
TTN, ChirpStack, Helium
HTTPS Webhook
HydroNode

One unified webhook endpoint

HydroNode exposes a single webhook URL that auto-detects whether the incoming uplink is from TTN (v3) or ChirpStack (v4/v3). There are no separate endpoints and no per-network configuration.

POST https://hydronode.tech/api/webhook/lorawan/uplink/{webhookToken}
Token auth
A secret token (wht_…) in the URL proves the request belongs to your account. You have one per account. It never expires unless you press Rotate Token in your profile.
DevEUI ownership
After decoding, HydroNode verifies the DevEUI is registered to the token's owner. Unknown or foreign devices are rejected.
fPort decoding
The binary payload is decoded with the sensor's configured fPort mapping, then stored. The same pipeline for every network.
Helium: Helium Console emits ChirpStack-compatible payloads. Add an HTTP integration pointing at your webhook URL and follow the ChirpStack page.

Before you start

  1. 1
    A sensor exists in HydroNode
    Press Create sensor on the Dashboard, give it a name and press Create sensor again. Every account can have 20 sensors for free. The Sensor ID and Secret it shows are for WiFi devices. A LoRaWAN device does not need them.
  2. 2
    The sensor is Outdoor
    A LoRaWAN device always becomes a station, and only outdoor sensors can be stations. Pick Outdoor when you create the sensor. For an existing sensor, open Settings, then General, set Environment to Outdoor and save.
  3. 3
    The physical DevEUI is at hand
    16 hex characters printed on the device, for example a840411b2182cd44.
  4. 4
    You know your payload layout
    Which fPort carries which channels and at which byte offsets (see Decode payloads).

Pick your network server

The steps that differ between networks have their own page: registering the device, the webhook for uplinks and the setup for downlinks.

Bind the device to your sensor

This happens in the HydroNode web app. Open your sensor, press Settings at the top right and open Connection. The LoRaWAN group links the device.

  1. 1
    Check that the sensor is Outdoor
    If it is still Indoor, the LoRaWAN group shows a warning with a link to General, and Link device stays disabled. Set the environment to Outdoor there, save, and come back.
  2. 2
    Enter the DevEUI
    16 characters, digits and letters a to f. Use the same DevEUI you registered in your network server.
  3. 3
    Enter the Application ID
    TTN: the application ID. ChirpStack: the application UUID from the URL. The field is required and must match exactly, otherwise uplinks are rejected as an unknown device.
  4. 4
    Press Link device
    HydroNode makes the sensor a station and shows the Webhook address in the same group. The button now reads Save, for later changes, and Unlink appears next to it.
  5. 5
    Copy the webhook address
    Press the eye icon to show it, or the copy button to copy it right away. Your profile shows the same address as Webhook URL. You paste it into your network server, as the page for your network server describes.
Connection settings of a LoRaWAN sensor with Direct connection, the LoRaWAN group with DevEUI, Application ID and Webhook address, and Record signal qualityConnection settings of a LoRaWAN sensor with Direct connection, the LoRaWAN group with DevEUI, Application ID and Webhook address, and Record signal quality
Settings, Connection of a linked LoRaWAN sensor.

Once the device is linked, two more parts appear below. Signal quality has the switch Record signal quality: it stores RSSI and SNR of the gateway that heard each uplink best as two more values on the sensor chart. It starts with the next uplink and never shows on the station. Below that sits Payload formats (fPort), see Decode payloads.

The webhook address contains a secret token. Anyone who has it can submit data as you. Keep it private and never commit it to source control.
Unlink stops readings from this DevEUI. The sensor, its readings and your webhook address for other devices stay. The station is a separate switch: Use as a station under General.

Configure fPort decoding

Each fPort carries a fixed set of channels packed into the payload bytes. You tell HydroNode how to read them in the card Payload formats (fPort), at the bottom of Settings, Connection. The card appears once the device is linked. See Sensor Types for the supported types.

  1. 1
    Press Add fPort
    Enter the fPort your firmware sends on, 1 to 223, and an optional Description.
  2. 2
    Add one channel per value
    Press Add Channel and pick a Sensor Type. The presets fill in bytes, encoding, scale and unit. Adjust Bytes, Encoding, Byte Order, Scale Factor, Offset, Channel Name and Unit if needed. Choose Custom for a type not in the list.
  3. 3
    Order the channels
    Channels decode top to bottom with no gaps. Use the up and down arrows so the order matches the bytes your device sends.
  4. 4
    Try it before saving
    Test this layout decodes a payload you paste against the fields above, on the server, without saving anything. Copy a real payload from your network server.
  5. 5
    Press Create
    Repeat for every fPort your device uses. Edit and Delete sit on each saved fPort. Test a payload below the list checks a payload against all saved fPorts at once.
Payload formats (fPort) card with layouts for fPort 2 and fPort 3 and the Test a payload box belowPayload formats (fPort) card with layouts for fPort 2 and fPort 3 and the Test a payload box below
Each saved fPort lists its channels in decode order.

How a channel is decoded

Every channel reads a fixed number of bytes and turns them into one physical value:

value = raw × scaleFactor + offset
FieldAcceptsWhen you need it
Bytes1, 2, 3 or 4 1 byte suits battery percent, wind direction as an octant or a status flag. 4 bytes suit counters and high resolution values.
EncodingSigned or unsigned Signed reads the value as two's complement over the configured width, so a temperature can go below zero.
Byte OrderBig endian or little endian Big endian is the default and is what most devices send. Milesight and several other vendors pack the least significant byte first; pick little endian for those instead of changing your firmware.
Scale FactorAny number above zero Converts the raw integer into the physical unit. A temperature sent in hundredths of a degree uses 0.01.
OffsetAny number, 0 by default Added after scaling. Devices that bias their reading to avoid negative numbers need it: a device sending raw × 0.1 − 40 takes scale 0.1 and offset −40.
Missing value (raw)A raw integer, empty by default Some devices send a fixed raw number when a sensor has no reading. Enter it here and HydroNode stores nothing for that channel instead of a wrong value.
An uplink on an fPort without a layout is rejected and nothing is stored. The console shows it as no fPort configuration. Add the fPort before the device sends live data.

Native payload formats (auto-detected)

No transformation needed. HydroNode reads each network's native JSON and picks the format from its shape: end_device_ids means The Things Stack v3, deviceInfo or a top level devEui means ChirpStack v4. Helium is not a third format; its console runs on ChirpStack and sends the ChirpStack event. Anything else is rejected with 400 rather than guessed at.

Repeat deliveries are recognized by deduplicationId when the network server sends one, and by the frame counter otherwise. If a payload carries neither, deduplication is skipped for that uplink: a duplicate reading can be removed later, a dropped one cannot be recovered.

Sample payloads are on the pages for The Things Network and ChirpStack.

Confirm it works

Send a test uplink: a real transmission, or Simulate uplink on the device page in TTN. Then open the sensor in HydroNode and open its console. Click the Console bar at the bottom of the page or press the backtick key (`). The Live tab lists every uplink your network server delivered, with fPort, frame counter, decoded values, RSSI and SNR. Rejected uplinks show up too, with the reason. Click a line for every detail.

Live tab of the console for a LoRaWAN sensor with uplinks, their fPort, RSSI and SNRLive tab of the console for a LoRaWAN sensor with uplinks, their fPort, RSSI and SNR
The Live tab: one line per uplink, rejected ones with their reason.

LoRaWAN sensors get more tabs. Decoder shows which bytes became which value. Link shows radio quality, received and lost frames, the spreading factor and frequency mix, airtime against the TTN fair use limit and the gateways that heard the device. Payload builder turns real values into the bytes your firmware must send. Details are in the Device Console docs.

Link tab of the console with RSSI and SNR, frames received and lost, the interval and a grid of the last 100 framesLink tab of the console with RSSI and SNR, frames received and lost, the interval and a grid of the last 100 frames
The Link tab shows how well the device reaches your gateways.

A 202 means the values are stored, not merely received. HydroNode waits for its own storage to confirm them before answering, so a 202 is a real delivery receipt. If storage is unavailable you get 503 instead and your network server should redeliver. Repeated deliveries of the same frame are recognized and stored once, so retrying is always safe.

CodeMeaningWhat to do
202Uplink storedNothing, success
204A TTN message without an uplink, for example a location updateNothing. There is nothing to store.
400Payload error: no fPort configuration for fPort …Add a layout for that fPort (Decode payloads)
400Payload error The bytes do not fit the layout. Check bytes and channel order with the Decoder tab of the console.
400Missing payload data, Invalid fPortThe message carried no usable payload. Check what the device sends.
400Unrecognised payload format The JSON is neither TTN nor ChirpStack. Set the format to JSON in your network server.
401Unauthorized The token in the URL is wrong or was rotated. Copy the Webhook URL again from your profile.
404Unknown device Link the DevEUI to a sensor in this account and check the Application ID (Bind in HydroNode)
429Too many requests You are sending faster than the limit allows. Honor Retry-After and slow down. A normal device reports every few minutes and never reaches this.
503Upstream unavailable, retry HydroNode could not store the values and is asking for the uplink again. Configure your network server to retry. The same uplink is accepted on the next delivery and duplicates are filtered out.
500Internal errorSomething failed on the HydroNode side. Let your network server retry.
Once the first 202 arrives and a value shows up on the sensor, the integration is live. Every other device in the same application starts flowing as soon as you link its DevEUI to a sensor.