Page cover image

iPearl Wasserzähler

iPearl Water Meter

Product Datasheet

Device Profile for Tesenso IoT Cloud

Decoder/Payload Converter for Tesenso IoT Cloud

https://github.com/Tesenso-GmbH/Device-Decoder/blob/main/Tesenso_M-Bus_Sensus_Wasser.js

//Code entry
if (msg.data) {
    var decoded = decodeFromHex(msg.data.toString().substr(6, msg.data.length));
    decoded.ts = msg.ts;
    decoded.rssi = msg.rssi;
    decoded.snr = msg.snr;
    decoded.toa = msg.toa;
    decoded.frequency = msg.frequency;
    decoded.dr = msg.dr;
    decoded.bat = decodeBattery(msg.bat);
    decoded.hex = msg.data;

    return {
        msg: decoded,
        metadata: metadata,
        msgType: msgType
    };
} else {
    return {
        msg: msg,
        metadata: metadata,
        msgType: msgType
    };
}


function decodeFromHex(data) {
    // Decode uplink message
    var decoded = {};

    //scale to manage the different scales with none, one or more decimals on the meter.
    var scale = metadata.ss_scale;

    var headerStart1 = data.substr(0,2);
    var headerLength1 = data.substr(2,2);
    var headerLength2 = data.substr(4,2);
    var headerStart2 = data.substr(6,2);
    var control = data.substr(8,2);
    var address = data.substr(10,2);
    var controlInformation = data.substr(12,2);
    var identificationNumber = data.substr(14,8);
    var manufacturer = data.substr(22,4);
    var generationOfMeter = data.substr(26,2);
    var medium = data.substr(28,2);
    var accessNumber = data.substr(30,2);
    var status = data.substr(32,2);
    var signature = data.substr(34,4);

    // Measurements
    var DIF1 = data.substr(38,2);
    var VIF1 = data.substr(40,2);
    var measurementHex1 = data.substr(48,2) + data.substr(46,2) + data.substr(44,2) + data.substr(42,2);
    
    if (medium == "07" && DIF1 == "04") {
        var volume = parseInt(measurementHex1, 16);
        var sensus_scale = 1;
        switch (VIF1) {
            case "13":
                sensus_scale = 0.001;
                break;
            case "14":
                sensus_scale = 0.01;
                break;
            case "15":
                sensus_scale = 0.1;
                break;
            default:
                break;
        }

        decoded.waterMeter = volume * sensus_scale;
    }
    return decoded;
}

//Helper functions
function decodeBattery(byte) {
    if (byte == 0) {
        return 'External power source';
    } else if (byte > 0 && byte < 255) {
        return byte / 254 * 100;
    } else {
        return 'Unknown battery state';
    }
}

Tesenso IoT Cloud Converter Template

Device Labels

in manual
dataKey
dataType
dataFormat

Durchfluss

waterMeter

telemetry

The uplink message is splitted but when decoded they're combined

  • The first 4 bytes of each data block is the lora header

  • if it's a short message (3 bytes), it's being sent to port 2

  • if it's a long message, it's being sent to port 12

{
    "cmd": "rx",
    "seqno": 43316,
    "EUI": "10CE45FFFE00AAAF",
    "ts": 1661409865191,
    "fcnt": 12163,
    "port": 12,
    "freq": 868100000,
    "rssi": -51,
    "snr": 9.5,
    "toa": 61,
    "dr": "SF7 BW125 4/5",
    "ack": false,
    "bat": 0,
    "offline": false,
    "data": "3a04006832326808017245384921ae4c68073a300000041380373000023b67004413116f2e00426cc12804933c000000000f3202e0000000006916"
}
{
    "msg": {
        "waterMeter": 3159.936,
        "ts": 1661279572780,
        "rssi": -53,
        "snr": 10.2,
        "toa": 61,
        "frequency": 868100000,
        "dr": "SF7 BW125 4/5",
        "bat": "External power source",
        "hex": "3a04006832326808017245384921ae4c68073a300000041380373000023b67004413116f2e00426cc12804933c000000000f3202e0000000006916"
    },
    "metadata": {
        "deviceType": "Sensus Wasserzähler",
        "ss_multi_data": "6832326808017245384921ae4c68073a300000041380373000023b67004413116f2e00426cc12804933c000000000f",
        "deviceName": "10CE45FFFE00AAAF",
        "ts": "1661279572794"
    },
    "msgType": "POST_TELEMETRY_REQUEST"
}

Last updated