To read out the pressure & temperature probe, the Hybrid Modbus Gateway must be configured as follows:
Parameter | Value | Comment |
---|---|---|
PlFmt | 5 | Sets the payload to a short format. |
MbCmd | 0 0/5 * * * *:R,9600,8N1:010300160002,010300260002 | Reads the Registers 22-23 and 34-35. 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). |
Bytes | 0 . | 1 . 2 . 3 . 4 . | 5 . 6 . 7 . 8 . |
------+--------+-----------------+-----------------+
Field | Header | Pressure | Temperature |
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 |
# Example of a successful measurement '003d94ce4541b7a512' '00' -> Successful readout '3d94ce45' -> 0.073 mH2O '41b7a512' -> 22.96 °C # Example '80ffffffffffffffff' '80' -> An error occurred. 'ffffffff' -> Pressure could not be read. 'ffffffff' -> Temperature could not be read. |
see below
Reading from the Lobaro Pressure Sensor using the Hybrid Gateway can be done by setting the following parameters in the configuration:
Parameter | Value | Comment |
---|---|---|
PlFmt | 5 | Sets the payload to a short format. |
MbCmd | 0 0/5 * * * *:R,9600,8N1:010300020003 | Reads the Registers 2 to 4. 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). |
Bytes | 0 . | 1 . 2 . | 5 . 6 . | 7 . 8 |
------+--------+---------+-----------+----------+
Field | Header | Unit | Precision | Pressure |
Field | Type | Value |
---|---|---|
Header | uint8 | 0x00 on success, 0x80 if an error occurred |
Unit | uint16BE | 0x0007 = mH2O |
Precision | uint16BE | 0x0003 = 3 decimals |
Pressure | int16BE | Pressure in mH2O |
# Example of a successful measurement '00000700030211' '00' -> Successful readout '0007' -> 0.073 mH2O '0003' -> 22.96 °C '0211' -> 529 -> 0.529 mH2O |
/** * 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==7) { // Pressure Probe without temperature sensor // make sure that unit is mH2O and precision is 3 decimals if( (uint16_BE(bytes, 1)==7) && (uint16_BE(bytes, 3)==3)){ vals["error"] = !!(bytes[0]&0x80); vals["pressure"] = int16_BE(bytes, 5)/1000; } else{ vals["error"] = true; vals["pressure"] = null; } } 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); } |