Page cover image

Wisely CarbonSense

Device Profile for Tesenso IoT Cloud

Decoder/Payload Converter for Tesenso IoT Cloud

https://github.com/Tesenso-GmbH/Device-Decoder/blob/main/Avelon_Wisely_CarbonSense.js
// V1.0, 02.09.2021, DS

if(msg.data)
{
var decoded = decodeFromHex(msg.data);
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
};  
}

//Functions

function decodeFromHex(data) {
    // Decode an uplink message from a buffer
    // (array) of bytes to an object of fields.

    var decoded = {};
    var bytes = parseHexString(data);
    
    var a = bytes[1] << 8;
    var b = bytes[2];
    decoded.barometricPressure = (a|b)*10.0;
    
    var c = bytes[3] << 8;
    var d = bytes[4];
    decoded.temperature = (c|d)/10.0;
    
    decoded.humidity = bytes[5]/2.0;
    
    return decoded;
}
function getTimestamp(ddmmyy, hhmmss) {
    day = parseInt(ddmmyy / 10000, 10);
    month = parseInt(ddmmyy / 100 - day * 100, 10);
    year = parseInt(ddmmyy - month * 100 - day * 10000 +
        2000, 10);
    hour = parseInt(hhmmss / 10000, 10);
    minute = parseInt(hhmmss / 100 - hour * 100, 10);
    second = parseInt(hhmmss - minute * 100 - hour * 10000,
        10);

    date = new Date(year, month - 1, day, hour, minute,
        second)
    return date.valueOf();
}
function parseHexString(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2) {
        bytes.push(parseInt(hex.substr(c, 2), 16));
    }
    return bytes;
}
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';
    }
}

function parseHexStringToBytes(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2)
        bytes.push(parseInt(hex.substr(c, 2), 16));
    return bytes;
}

function parseHexStringToNibbles(hex) {
    for (var nibbles = [], c = 0; c < hex.length; c += 1)
        nibbles.push(parseInt(hex.substr(c, 1), 16));
    return nibbles;
}

function convertToBinary(x) {
    var bin = 0;
    var rem, i = 1,
        step = 1;
    while (x != 0) {
        rem = x % 2;
        x = parseInt(x / 2);
        bin = bin + rem * i;
        i = i * 10;
    }
    return bin;
}

function decodeToJson(payload) {
    // covert payload to string.
    var str = decodeToString(payload);
    // parse string to JSON
    var data = JSON.parse(str);
    return data;
}
function convertToBinaryString(x) {
    var bin = "";
    var rem, i = 1,
        step = 1;
    while (x != 0) {
        rem = x % 2;
        x = parseInt(x / 2);
        bin = rem + bin;
        i = i * 10;
    }
    if (bin == "")
    {
        return "0";
    }
    else
    {
        return bin;
    }
}

Device Labels

in manual
dataKey
dataType
dataFormat

Luftdruck

barometricPressure

telemetry

integer

Temperatur

temperature

telemetry

integer

Feuchtigkeit

humidity

telemetry

integer

Co2

co2

telemetry

integer

{
    "cmd": "gw",
    "seqno": 635000,
    "EUI": "7C604AFFFE0006B6",
    "ts": 1661261569714,
    "fcnt": 4347,
    "port": 5,
    "freq": 867900000,
    "toa": 107,
    "dr": "SF7 BW125 4/5",
    "ack": false,
    "gws": [{
        "rssi": -62,
        "snr": 9.8,
        "ts": 1661261569768,
        "time": "2022-08-23T14:22:25.991659Z",
        "gweui": "000800FFFF4AA78E",
        "ant": 0,
        "lat": 47.4165437,
        "lon": 8.5425527
    }, {
        "rssi": -95,
        "snr": 5.5,
        "ts": 1661261569733,
        "time": "2022-08-23T15:23:09.538303Z",
        "gweui": "000800FFFF4A4CBA",
        "ant": 0,
        "lat": 47.4071896,
        "lon": 8.403396199999975
    }, {
        "rssi": -117,
        "snr": -5,
        "ts": 1661261569714,
        "time": "2022-08-23T13:32:49.650905Z",
        "gweui": "9C65F9FFFF43367E",
        "ant": 0,
        "lat": 0,
        "lon": 0
    }],
    "bat": 254,
    "data": "fe25de00eb59021825de00eb58021125de00ea57020125dd00ea57020125dc00ec57021925dc00ed57022700",
    "_id": "6304d701d5633f05dd4bcada"
}
{
    "msg": {
        "barometricPressure": 96940,
        "temperature": 23.5,
        "humidity": 44.5,
        "co2": 536,
        "absoluteHumidity": 8.378970567096994,
        "ts": 1660999112051,
        "rssi": -61,
        "dr": "SF7 BW125 4/5",
        "bat": 95.2755905511811,
        "hex": "fe25de00eb59021825de00eb58021125de00ea57020125dd00ea57020125dc00ec57021925dc00ed57022700"
    },
    "metadata": {
        "deviceType": "default",
        "deviceName": "Test Device",
        "ts": "1661264573420"
    },
    "msgType": "POST_TELEMETRY_REQUEST"
}

Downlink Port: 10

Zähler für zyklische Übertragung

Das Gerät überträgt seine Daten nach Zähler für zyklische Übertragung × Sensor-Abtastzeit ab der letzten Übertragung.

Downlink-Meldung

ID

FUNC

CTC

Feld

Beschreibung

Wert

ID

Bezeichner

0xFF

FUNC

Funktionscode

0xF0

CTC

Zähler für zyklische Übertragung

0x01 - 0xFF

Standardeinstellung

Der Standardwert des Zählers für zyklische Übertragung ist 0x3C (= 60).

change sendintervall to every 10min:

FFF00A

Docs: https://avelon.cloud/docs/de/appendix/wisely-payload.html#wisely-carbonsense

Last updated