You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 33 Next »

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 SensorLobaro Pressure Sensor

KELLER Series 26X


Lobaro Pressure and Temperature Sensor

To read out the pressure & temperature probe, the Hybrid Modbus Gateway must be configured as follows:

ParameterValueComment
WANlorawanFor LoRaWAN OTAA usage.
PlFmt5Sets the payload to a short format.
MbCmd0 0/5 * * * *:R,9600,8N1:010300160002,010300260002,fa0400050001Reads 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.
PowerOnDelay1500Battery 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  |


All values are encoded big-endian

FieldTypeValue
Headeruint80x00 on success, 0x80 if an error occurred
Pressurefloat32Pressure in mH2O, ffffffff on error.
Temperaturefloat32

Temperature in °C, ffffffff on error.

Voltageuint16Voltage in mV, ffff on error

Example

# 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:

ParameterValueComment
WANlorawanFor LoRaWAN OTAA usage.
PlFmt5Sets the payload to a short format.
MbCmd0 0/5 * * * *:R,9600,8N1:010300040001,fa0400040001,fa0400050001Reads 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.
PowerOnDelay1500Battery 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 |


All values are encoded big-endian

FieldTypeValue
Headeruint80x00 on success, 0x80 if an error occurred
Pressureint16BE

Pressure in mmH2O

Temperatureint16BE Temperature in °C inside Bridge
Voltageuint16BE Voltage in mV, ffff on error

Example

# 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)

Pressure Probe Parser
/**
 * 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);
}

Keller PR26X

Configuration

Connected pressure sensor probe from Keller Druckmesstechnik PR26X series.


ParameterValueComment
WANlorawanFor LoRaWAN OTAA usage.
PlFmt5Sets the payload to a short format.
MbCmd0 0/5 * * * *:R,9600,8N1:010301000004Reads four Registers: 256 + 257 (Float, Pressure in Bar) and 258 + 259 (Float, Probe Temperature)
PowerOnDelay1500Battery variant only. Sets time (in ms) between activating sensor power and reading value (time for sensor to be ready).

Example response

Hex to float converter: https://gregstoll.com/~gregstoll/floattohex/

  • Pressure in Bar: 0x3f75e3d2
  • Temperature in °C: 0x41b61c20

Parser

Will follow


  • No labels