Pressure Sensor LoRaWAN

Order number: 8000089
LoRaWAN Pressure Sensor

Multiple different Variants

There are different kinds of Pressure Probes that use very different kinds of communication. As a consequence there exist different Variants of our Hardware for using Pressure Probes. Please take care that you only install the correct Variant of firmware on your device.

Consider using the latest firmware on your hardware

Target Measurement / Purpose

Precise liquid level measurement, e.g. for tanks, via LoRaWAN.


  • Cable length 1-15m
  • 0..1,5 Bar (15m water level)
  • Waterproof IP66 Housing
  • Multi-year Battery life, ultra low power (~ 20µA)


The (initial) configuration is normally done using our free Lobaro Maintenance Tool and the USB PC configuation adapter.

Beside this the configuration can also be changed or read remotely in the field using LoRaWAN downlink messages, see Downlinks description.


Advanced Lobaro LoRaWAN Stack

The Hardware Variant Keller Sensor uses our advanced LoRaWAN Stack and supports Remote Configuration and LoRaWAN V1.1, starting with firmware v0.3.0. Refer to Lobaro LoRaWAN stack for a description of those new features.

Older Versions and the Variant Lobaro Sensor only support the features described here.

The connection to the LoRaWAN network is defined by multiple configuration parameters. This need to be set according to your LoRaWAN network and the way your device is supposed to be attached to it, or the device will not be able to send any data.

For a detailed introduction into how this values need to be configured, please refer to the chapter LoRaWAN configuration in our LoRaWAN background article.

Name Description Type Values
OTAA Activation: OTAA or ABP bool true= use OTAA, false= use ABP
DevEUI DevEUI used to identify the Device byte[8] e.g. 0123456789abcdef
JoinEUI Used for OTAA (called AppEUI in v1.0) byte[8] e.g. 0123456789abcdef
AppKey Key used for OTAA (v1.0 and v1.1) byte[16]
NwkKey Key used for OTAA (v1.1 only) byte[16]
SF Initial / maximum Spreading Factor int 7 - 12
ADR Use Adaptive Data Rate bool true= use ADR, false= don't
OpMode Operation Mode string A= Class A, C= Class C
TimeSync Days after which to sync time int days, 0=don't sync time
RndDelay Random delay before sending int max seconds
RemoteConf Support Remote Configuration bool true=allow, false=deactivate
LostReboot Days without downlink before reboot int days, 0=don't reboot


Configuration values defining the behaviour of the device. The Min and Max values will be preconfigured when receiving the device. In case of using "Restore Default" they will be reset to standard values and have to be set again using the values printed on the sensor or given separately.

name description example value
sendCron Cron expression defining when to read and send 0 0/15 * * * * for every 15 minutes
rangeMin min range in mh2o in most cases 0
rangeMax max range in mh2o in most cases 15
outputMin min digital output value of the sensor in most cases 819
outputMax max digital output value of the sensor in most cases 11664

See also our Introduction to Cron expressions.

Payload Format

Port: 1 Payload: 8 Bytes

Temperature is transmitted in 1/100°C, battery voltage in Millivolt and pressure in Bar.

flaot32 float32 float32 float32 int16 int16 int16 int16
Byte 0 Byte 1 Byte 2 Byte 3 LSB MSB LSB MSB

Payload Format



The Things Network

function decodeFloat32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128)
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);

function decodeInt16(bytes) {
    if ((bytes & 1 << 15) > 0) { // value is negative (16bit 2's complement)
        bytes = ((~bytes) & 0xffff) + 1; // invert 16bits & add 1 => now positive value
        bytes = bytes * -1;
    return bytes;

function int16_LE(bytes, idx) {
    bytes = bytes.slice(idx || 0);
    return bytes[0] << 0 | bytes[1] << 8;

function int32_LE(bytes, idx) {
    bytes = bytes.slice(idx || 0);
    return bytes[0] << 0 | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24;

function Decoder(bytes, port) {
    // Decode an uplink message from a buffer
    // (array) of bytes to an object of fields.
    var decoded = {
        pressure: decodeFloat32(int32_LE(bytes, 0)),
        temp: decodeInt16(int16_LE(bytes,4)) / 100,
        v_batt: decodeInt16(int16_LE(bytes,6)) / 1000,

    // if (port === 1) decoded.led = bytes[0];

    return decoded;

CE Declaration of Conformity

CE Declaration of Conformity (pdf).