Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Change configuration for probe without temperature sensor.

...

ParameterValueComment
WANlorawanFor LoRaWAN OTAA usage.
PlFmt5Sets the payload to a short format.
MbCmd0 0/5 * * * *:R,9600,8N1:010300020003010300040001,fa0400040001Reads the Registers 2 to 4register 4 inside probe and 4 inside Bridge. 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 .  | 53 . 64 .   | 7 . 8    |
------+--------+----------+-----------+----------+
Field | Header | UnitPressure | Precision |Temperature Pressure |
Pressure in mH2O
FieldTypeValue
Headeruint80x00 on success, 0x80 if an error occurred
UnitPressureuint16BE0x0007 = mH2O
Precisionuint16BE0x0003 = 3 decimals
int16BE

Pressure in mmH2O

Temperatureint16BE Temperature in °C inside BridgePressureint16BE

Example

Code Block
# Example of a successful measurement
'00000700030211000211001a'
  '00'       -> Successful readout
  '00070211' -> 0.073 mH2O
  '0003'529 -> 220.96529 °CmH2O
  '0211001a' -> 52926 -> 0.529 mH2O26°C (inside Box)

Reference Parser

Code Block
languagejs
titlePressure Probe Parser
linenumberstrue
/**
 * 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==75) {
          // Pressure Probe without temperature sensor
          // make sure that unit is mH2O and precisionBridges isinternal 3 decimals
          if( (uint16_BE(bytes, 1)==7) && (uint16_BE(bytes, 3)==3)){
   Temperature
	         vals["error"] = !!(bytes[0]&0x80);
            vals["pressure"] = int16_BE(bytes, 51)/1000;
            }
          else{
            vals["error   vals["temperature"] = true;
            vals["pressure"] = null;
          }int16_BE(bytes, 3);
        } 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);
        }
    } 
    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);
}

...