Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
# Example of a successful measurement
'003d94ce4541b7a5120da8003d94ce4541b7a5120e2a'
  '00'       -> Successful readout
  '3d94ce45' -> 0.073 mH2O
  '41b7a512' -> 22.96 °C
  '0da80e2a'     -> 34963626 mV / 3.496626 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.

...

Code Block
# Example of a successful measurement
'000211001a0da8000211001a0e2a'
  '00'           -> Successful readout
  '0211' -> 529  -> 0.529 mH2O
  '001a' -> 26   -> 26°C (inside Box)
  '0da80e2a' -> 34963626 -> 34963626 mV / 3.496626 V

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==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;
		}
		
    } 
    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);
}

...