Lobaro Pressure or Lobaro Pressure and Temperature Sensor
Select the correct sensor by checking the cable flag. The Pressure and Temperature sensor got a "P+T" marking.
Lobaro Pressure and Temperature Sensor | Lobaro Pressure Sensor |
---|
| |
Lobaro Pressure and Temperature Sensor
To read out the pressure & temperature probe, the Hybrid Modbus Gateway must be configured as follows:
Parameter | Value | Comment |
---|
WAN | lorawan | For LoRaWAN OTAA usage. |
PlFmt | 5 | Sets the payload to a short format. |
MbCmd | 0 0/5 * * * *:R,9600,8N1:010300160002,010300260002,fa0400050001 | Reads the Registers 22-23, 34-35 and internal Register 5. fa0400050001 reads the battery voltage and is optional. The CRON Expressions can be adjusted to set time of sensor reading. |
PowerOnDelay | 1500 | Battery variant only. Sets time (in ms) between activating sensor power and reading value (time for sensor to be ready). |
Data Uplink (Port 20)
Bytes | 0 . | 1 . 2 . 3 . 4 . | 5 . 6 . 7 . 8 . | 9 . 10 . |
------+--------+-----------------+-----------------+----------+
Field | Header | Pressure | Temperature | Voltage |
Field | Type | Value |
---|
Header | uint8 | 0x00 on success, 0x80 if an error occurred |
Pressure | float32 | Pressure in mH2O , ffffffff on error. |
Temperature | float32 | Temperature in °C , ffffffff on error. |
Voltage | uint16 | Voltage in mV, ffff on error |
Example
Code Block |
---|
# Example of a successful measurement
'003d94ce4541b7a5120e2a'
'00' -> Successful readout
'3d94ce45' -> 0.073 mH2O
'41b7a512' -> 22.96 °C
'0e2a' -> 3626 mV / 3.626 V
# Example
'80ffffffffffffffff'
'80' -> An error occurred.
'ffffffff' -> Pressure could not be read.
'ffffffff' -> Temperature could not be read.
'ffff' -> Voltage could not be read. |
Reference Parser
see below
Lobaro Pressure Sensor
Reading from the Lobaro Pressure Sensor using the Hybrid Gateway can be done by setting the following parameters in the configuration:
Parameter | Value | Comment |
---|
WAN | lorawan | For LoRaWAN OTAA usage. |
PlFmt | 5 | Sets the payload to a short format. |
MbCmd | 0 0/5 * * * *:R,9600,8N1:010300040001,fa0400040001,fa0400050001 | Reads the register 4 inside probe and 4 and 5 inside Bridge. fa0400050001 reads the battery voltage and is optional. The CRON Expressions can be adjusted to set time of sensor reading. |
PowerOnDelay | 1500 | Battery variant only. Sets time (in ms) between activating sensor power and reading value (time for sensor to be ready). |
Data Uplink (Port 20)
Bytes | 0 . | 1 . 2 . | 3 . 4 . | 5 . 6 . |
------+--------+----------+-------------+---------|
Field | Header | Pressure | Temperature | Voltage |
Field | Type | Value |
---|
Header | uint8 | 0x00 on success, 0x80 if an error occurred |
Pressure | int16BE | Pressure in mmH2O |
Temperature | int16BE | Temperature in °C inside Bridge |
Voltage | uint16BE | Voltage in mV, ffff on error |
Example
Code Block |
---|
# Example of a successful measurement
'000211001a0e2a'
'00' -> Successful readout
'0211' -> 529 -> 0.529 mH2O
'001a' -> 26 -> 26°C (inside Box)
'0e2a' -> 3626 -> 3626 mV / 3.626 V |
Reference Parser (Both variants)
Code Block |
---|
language | js |
---|
title | Pressure Probe Parser |
---|
linenumbers | true |
---|
|
/**
* Parser for Lobaro Pressure Probe via LoRaWAN (hybrid gateway).
* Usable for Pressure Probe as or with Presure+Temperature Probe.
* Works with TTN, ChirpStack, or the Lobaro Platform.
*/
function signed(val, bits) {
// max positive value possible for signed int with bits:
var mx = Math.pow(2, bits-1);
if (val < mx) {
// is positive value, just return
return val;
} else {
// is negative value, convert to neg:
return val - (2 * mx);
}
}
function int16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return signed(bytes[0] << 8 | bytes[1] << 0, 2*8);
}
function uint16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[0] << 8 | bytes[1] << 0;
}
function uint32_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3] << 0;
}
function float32FromInt(asInt) {
var sign = (asInt & 0x80000000) ? -1 : 1;
var exponent = ((asInt >> 23) & 0xFF) - 127;
var significand = (asInt & ~(-1 << 23));
if (exponent === 128)
return null;
// 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 float32_BE(bytes, idx) { return float32FromInt(uint32_BE(bytes, idx)); }
/**
* TTN decoder function.
*/
function Decoder(bytes, port) {
var vals = {};
if( port == 20 ){
if (bytes.length==5) {
// Pressure Probe without temperature sensor and Bridges internal Temperature
vals["error"] = !!(bytes[0]&0x80);
vals["pressure"] = int16_BE(bytes, 1)/1000;
vals["temperature"] = int16_BE(bytes, 3);
} else if (bytes.length==7) {
vals["error"] = !!(bytes[0]&0x80);
vals["pressure"] = int16_BE(bytes, 1)/1000;
vals["temperature"] = int16_BE(bytes, 3);
vals["voltage"] = uint16_BE(bytes, 5) / 1000;
} else if (bytes.length==9) {
vals["error"] = !!(bytes[0]&0x80);
// pressure in mH2O
vals["pressure"] = float32_BE(bytes, 1);
// temperature in Degree Celsius
vals["temperature"] = float32_BE(bytes, 5);
} else if (bytes.length==11) {
vals["error"] = !!(bytes[0]&0x80);
// pressure in mH2O
vals["pressure"] = float32_BE(bytes, 1);
// temperature in Degree Celsius
vals["temperature"] = float32_BE(bytes, 5);
vals["voltage"] = uint16_BE(bytes, 9) / 1000;
}
}
if (port === 64 && bytes.length == 13) { // status packet
vals["Firmware Identifier"] = String.fromCharCode(bytes[0]) + String.fromCharCode(bytes[1]) + String.fromCharCode(bytes[2]);
vals["FirmwareVersion"] = bytes[3] + '.' + bytes[4] + '.' + bytes[5];
vals["status"] = bytes[6];
vals["reboot reason"] = bytes[7];
vals["final words"] = bytes[8];
vals["voltage [V]"] = uint16_BE(bytes,9)/1000.0
vals["temperature [°C]"] = int16_BE(bytes,11)/10.0;
}
return vals;
}
/**
* TTN V3 Wrapper
*/
function decodeUplink(input) {
return {
data: {
values: Decoder(input.bytes, input.fPort)
},
warnings: [],
errors: []
};
}
/**
* ChirpStack decoder function.
*/
function Decode(fPort, bytes) {
// wrap TTN Decoder:
return Decoder(bytes, fPort);
}
/**
* Lobaro Platform decoder function.
*/
function Parse(input) {
var data = bytes(atob(input.data));
var port = input.fPort;
return Decoder(data, port);
} |