Payload Formatter for EM-ELST01

The Things Stackで動作するEM-ELST01用のPayload Formatterです。

function decodeUplink(input) {
    var bytes = input.bytes;
    var decoded = {};

    decoded.status = (bytes[0] >> 4) & 0xFF;
    decoded.Bat = ((bytes[0] & 0x0F) << 8 | bytes[1]) / 1000;

    if (bytes.length === 4) {
        decoded.TNOMD = (bytes[2] << 8 | bytes[3]) & 0xFFFF;
    }
    else if (bytes.length === 9) {
        decoded.TODE = (bytes[2] << 16 | bytes[3] << 8 | bytes[4]) & 0xFFFFFF;
        decoded.LDOD = (bytes[5] << 16 | bytes[6] << 8 | bytes[7]) & 0xFFFFFF;
        decoded.ALARM = bytes[8];
    }
    else if (bytes.length === 19) {
        decoded.TODE = (bytes[2] << 16 | bytes[3] << 8 | bytes[4]) & 0xFFFFFF;
        decoded.LDOD = (bytes[5] << 16 | bytes[6] << 8 | bytes[7]) & 0xFFFFFF;
        decoded.ALARM = bytes[8];
        decoded.TNOMD = (bytes[9] << 8 | bytes[10]) & 0xFFFF;
        decoded.X = parseAcceleration(bytes[11], bytes[12]);
        decoded.Y = parseAcceleration(bytes[13], bytes[14]);
        decoded.Z = parseAcceleration(bytes[15], bytes[16]);
        decoded.temp_ds = parseTemperature(bytes[17], bytes[18]);
    }

    return {
        data: decoded
    };
}

function parseAcceleration(byte1, byte2) {
    var value = byte1 << 8 | byte2;
    return ((byte1 >> 4 === 0x0F ? (value - 0xFFFF) : value) / 100).toFixed(2);
}

function parseTemperature(byte1, byte2) {
    var value = byte1 << 8 | byte2;
    return ((byte1 >> 4 === 0x0F ? (value - 0xFFFF) : value) / 10).toFixed(1);
}