Skip to content

Instantly share code, notes, and snippets.

@TimVosch
Created December 4, 2025 11:15
Show Gist options
  • Select an option

  • Save TimVosch/b53f8f949326a5ef9deb63c6b0d6a0a6 to your computer and use it in GitHub Desktop.

Select an option

Save TimVosch/b53f8f949326a5ef9deb63c6b0d6a0a6 to your computer and use it in GitHub Desktop.
MFM V3 waterlevel TTN payload formatter
function version(msb, lsb) {
let v = (msb << 8) | lsb;
return {
proto: (v >> 15) & 0x01,
major: (v >> 10) & 0x1F,
minor: (v >> 5) & 0x1F,
patch: (v >> 0) & 0x1F
};
}
function bytesToFloat(bytes) {
// JavaScript bitwise operators yield a 32 bits integer, not a float.
// Assume LSB (least significant byte first).
var bits = bytes[3]<<24 | bytes[2]<<16 | bytes[1]<<8 | bytes[0];
var sign = (bits>>>31 === 0) ? 1.0 : -1.0;
var e = bits>>>23 & 0xff;
var m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
var f = sign * m * Math.pow(2, e - 150);
return f;
}
function decodeUplink(input) {
let b = input.bytes;
let data = {};
switch(input.fPort) {
case 1:
data.distance = (b[1] << 8) | b[0];
data.temperature = bytesToFloat([ b[2], b[3], b[4], b[5] ]);
break;
case 2:
fw = version(b[1], b[2]);
hw = version(b[3], b[4]);
data.fw_version = fw.major + "." + fw.minor + "." + fw.patch + (fw.proto ? "-proto" : "");
data.hw_version = hw.major + "." + hw.minor + "." + hw.patch + (hw.proto ? "-proto" : "");
break;
}
return {
data: data,
warnings: [],
errors: []
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment