Skip to main content

Multi Temperature Sensor Box (LoRaWAN)

Lobaro Multi Temperature Sensor Box LoRaWAN

Firmware note: Use the latest available firmware for your hardware whenever possible. See: available firmware downloads

Order Codes / Variants

Order CodeVariant
8000072Default variant
8000150Special variant without external probe and cable gland, available only on special sales request

Quickstart

Opened Multi Temperature Sensor Box

  1. Connect the device to your PC using the Lobaro Maintenance Tool and the Lobaro USB Config Adapter.
  2. Open the configuration view, click Reload Config, and adjust the parameters as required.
  3. Register the device in your LoRaWAN network.
  4. Connect an ER34614 3.6 V D-cell battery via the XH connector or connect the external power supply.

Key Features

  • Supports up to 25 DS18x20 1-Wire temperature sensors.
  • Optional 8-port hub for easier sensor wiring.
  • IP67 outdoor housing with pressure compensation element.
  • Delivered with one sensor attached.
  • Configurable sensor output order.
  • Test mode for easier sensor identification.
  • Large 19 Ah D-size battery enables long battery lifetime, depending on configuration and operating conditions.
  • Supports LoRaWAN 1.0.x and 1.1 network servers.
  • Supports LoRaWAN Class A and Class C operation.
  • Supports LoRaWAN 1.1 time synchronization.
  • Variants with external power supply and/or external antenna are available on request.
  • Housing with quick-closing screws and cover retainer.

Target Measurement / Purpose

The Multi Temperature Sensor Box reads up to 25 DS18x20 1-Wire temperature sensors and transmits the measured values via LoRaWAN.

The device reads the connected sensors periodically. If the resulting payload becomes too large for one LoRaWAN message, the data is automatically split into multiple uplinks. Sensors can be connected either in series or in a star topology.

Additional Hardware

For easier wiring of up to 7 DS18x20 1-Wire sensors, the Modbus & 1-Wire 8-Port Hub can be used.

ItemOrder Number
Modbus & 1-Wire 8-Port Hub8000130

Multiple hubs can be connected to reach the maximum number of 25 sensors per box.

Modbus and 1-Wire 8-Port Hub

LoRaWAN NB-IoT Multi Temperature Sensing Solution

Configuration

The device is configured with the Lobaro Maintenance Tool and the Lobaro USB Config Adapter.

LoRaWAN

The LoRaWAN connection is configured through several parameters. These values must match the target LoRaWAN network and activation mode, otherwise the device cannot join the network or send uplinks.

For more background information, see the LoRaWAN configuration article.

NameDescriptionTypeExample / Values
OTAAActivation mode: OTAA or ABPbooltrue = OTAA, false = ABP
DevEUIDevice EUI used to identify the devicebyte[8]0123456789abcdef
JoinEUIJoinEUI for OTAA, called AppEUI in LoRaWAN 1.0byte[8]0123456789abcdef
AppKeyApplication key for OTAAbyte[16]LoRaWAN 1.0 / 1.1
NwkKeyNetwork key for OTAAbyte[16]LoRaWAN 1.1 only
SFInitial / maximum spreading factorint7 to 12
ADRAdaptive Data Ratebooltrue = enabled, false = disabled
OpModeLoRaWAN operation modestringA = Class A, C = Class C
TimeSyncInterval for time synchronizationintDays, 0 = disabled
RndDelayRandom delay before transmissionintMaximum delay in seconds
RemoteConfRemote configuration supportboolNot supported by this firmware; use false
LostRebootReboot after missing downlinksintDays, 0 = disabled

Operation

Without additional ordering configuration, sensors are transmitted sorted by their 48-bit ID. The sensor family prefix and checksum are ignored for this ordering.

NameDescriptionExample / Values
TestModeRuns the device in test mode to identify sensors. Must be false during normal operation.true or false
MeasureCronCron expression defining when sensors are read.0 0/15 * * * * = every 15 minutes
SendInternalTempEnables or disables the internal temperature sensor in the uplink. If enabled, it is always sent first.true or false
SendSensorIdIncludes sensor IDs in the uplink. This changes payload format and LoRaWAN port.true or false
SensorIdOrderSemicolon-separated list of 48-bit sensor IDs in hex. Up to 25 sensors can be listed.22ffffff0000;44ffffff0000;11ffffff0000

See also: Introduction to Cron expressions

Temperature and Error Values

Temperatures are transmitted in tenths of degrees Celsius, also called d°C, so that no floating-point values are required in the payload.

Error states for individual sensors are represented as temperature values below -300 °C.

TemperatureHex ValueMeaning
-899.0 °C0xdce2Sensor not found. This applies to sensors listed in SensorIdOrder.
-997.0 °C0xd90eCommunication timeout.
-998.0 °C0xd904Temperature readout error.
-999.0 °C0xd8faNo temperature value available.

Sensor IDs

A full DS18x20 sensor ID consists of 8 bytes:

byte 0:    family code
bytes 1-6: serial number
byte 7: CRC checksum

Only the 6-byte serial number is used by the device. The family code and CRC checksum are omitted in uplinks and in the configuration.

Internal Sensor

The device board contains an internal temperature sensor. If SendInternalTemp is set to true, the internal temperature value is included in uplinks and is always placed first in the sensor list.

Sensor Order

Sensors are ordered by their sensor ID, without the leading family-code byte.

The upload order can be fixed through SensorIdOrder. Sensors listed in SensorIdOrder are always included in the uplink, even if they are currently not found. If a listed sensor cannot be found, the device transmits -899.0 °C, represented as 0xdce2.

If the internal sensor is enabled with SendInternalTemp=true, it is still transmitted before the sensors listed in SensorIdOrder.

Detected sensors that are neither internal nor listed in SensorIdOrder are appended after the configured sensors and are ordered by their IDs.

Payload

Status Message

LoRaWAN Port: 1

Example payload:

00040001070ce3

Decoded example:

{
"temp": 26.3,
"vBat": 3.299,
"version": "v0.4.0"
}

Data Message with Sensor IDs

LoRaWAN Port: 2

This format is used when SendSensorId=true.

Structure

FieldLengthTypeDescription
success1 byteuint80 = read error, 1 = success
sensor id6 bytesuint8[6]6-byte 1-Wire sensor ID
temperature2 bytesint16 BETemperature in 1/10 °C

The sensor ID and temperature fields are repeated for each sensor.

If the total payload exceeds 50 bytes, the device splits the measurement data into multiple uplinks using the same format.

Example payload:

01551e46920d0200da96b446920c0200d7dafc46920d0200d5202e4692050200dc

Decoded example:

{
"success": true,
"sensors": [
{
"id": "551e46920d02",
"temp": 21.8
},
{
"id": "96b446920c02",
"temp": 21.5
},
{
"id": "dafc46920d02",
"temp": 21.3
},
{
"id": "202e46920502",
"temp": 22.0
}
]
}

Data Message without Sensor IDs

LoRaWAN Port: 3

This format is used when SendSensorId=false.

Before firmware version v0.4.0, this payload format was sent on port 2.

Structure

FieldLengthTypeDescription
success1 byteuint80 = read error, 1 = success
temperature2 bytesint16 BETemperature in 1/10 °C

The temperature field is repeated for each sensor.

If the total payload exceeds 50 bytes, the device splits the measurement data into multiple uplinks using the same format.

Example payload:

0100f500f500f800f500f300f8

Decoded example:

{
"success": true,
"sensors": [
24.5,
24.5,
24.8,
24.5,
24.3,
24.8
]
}

Parser

The Things Network / ChirpStack / Lobaro Platform

function readVersion(bytes) {
if (!bytes || bytes.length < 3) {
return null;
}

return `v${bytes[0]}.${bytes[1]}.${bytes[2]}`;
}

function readInt16BE(bytes, offset) {
const value = (bytes[offset] << 8) | bytes[offset + 1];
return value & 0x8000 ? value - 0x10000 : value;
}

function readUInt16BE(bytes, offset) {
return (bytes[offset] << 8) | bytes[offset + 1];
}

function bytesToHex(bytes, start, end) {
return bytes
.slice(start, end)
.map((value) => value.toString(16).padStart(2, "0"))
.join("");
}

function decodePort1(bytes) {
return {
version: readVersion(bytes),
temp: readInt16BE(bytes, 3) / 10,
vBat: readUInt16BE(bytes, 5) / 1000,
};
}

function decodePort2(bytes) {
let pos = 0;
let success = false;
const sensors = [];

if (bytes.length > 0) {
success = bytes[0] !== 0;
pos = 1;
}

while (bytes.length - pos >= 8) {
sensors.push({
id: bytesToHex(bytes, pos, pos + 6),
temp: readInt16BE(bytes, pos + 6) / 10,
});

pos += 8;
}

return {
success,
sensors,
};
}

function decodePort3(bytes) {
let pos = 0;
let success = false;
const sensors = [];

if (bytes.length > 0) {
success = bytes[0] !== 0;
pos = 1;
}

while (bytes.length - pos >= 2) {
sensors.push(readInt16BE(bytes, pos) / 10);
pos += 2;
}

return {
success,
sensors,
};
}

function Decoder(bytes, port) {
switch (port) {
case 1:
return decodePort1(bytes);
case 2:
return decodePort2(bytes);
case 3:
return decodePort3(bytes);
default:
return {
error: "Invalid port",
port,
};
}
}

// Wrapper for Lobaro Platform
function Parse(input) {
const raw = atob(input.data);
const bytes = Array.from(raw, (char) => char.charCodeAt(0));

return Decoder(bytes, input.fPort);
}

// Wrapper for ChirpStack / LoRaServer
function Decode(fPort, bytes) {
return Decoder(bytes, fPort);
}

// Optional wrapper for Digimondo niota platform
/*
module.exports = function (payload, meta) {
const port = meta.lora.fport;
const bytes = Array.from(Buffer.from(payload, "hex"));

return Decoder(bytes, port);
};
*/

CE Declaration of Conformity

The CE declaration is available as PDF:

CE Declaration of Conformity