Decode decodes an array of bytes into an object.
  - fPort contains the LoRaWAN fPort number
    - bytes is an array of bytes, e.g. [225, 230, 255, 0]
        - variables contains the device variables e.g. {calibration 3.5 } (both the key  value are of type string)
 The function must return an object, e.g. {temperature 22.5 }
function Decode(fPort, bytes, variables) {
     O5 Door contact sensor
    if (fPort === 4) {
        return [
            {
                led_state bytes[0] === 0  Off  On,
                mtm_code_1 bytes[1],
                mtm_code_2 bytes[2],
                hw_code bytes[3],
                battery_level bytes[4] + %,
                size_value bytes[5],
                HALL_1_state bytes[6] === 1  Door_Open  Door_Close,
                HALL_2_state bytes[7] === 1  Door_Open  Door_Close,
            }
        ];
    }
    heart - beat of O5
    else if (fPort === 5) {
        return [
            {
                led_state(bytes[0] & 0x7f) === 0  Off  On,
                    battery_level bytes[4] +  %,
            }
        ];
}
     R4 soapsanitizer sensor
    else if (fPort === 7) {
    return [
        {
            led_state bytes[0] === 0  Off  On,
            mtm_code_1 bytes[1],
            mtm_code_2 bytes[2],
            hw_code bytes[3],
            battery_level bytes[4] + %,
            size_value bytes[5],
            measure_tech bytes[6] === 0  Capacitive  Other,
            liquid_level_event bytes[7] === 0  Liquid Detected  No Liquid,
        }
    ];
}
     R4 soapsanitizer heart - beat
    else if (fPort === 8) {
    return [
        {
            led_state(bytes[0] & 0x7f) === 0  Off  On,
                battery_level bytes[1] +  %,
            }
        ];
    }
     R1D dual roll toilet paper sensor
    else if (fPort === 57) {
    return [
        {
            led_state bytes[0] === 0  Off  On,
            mtm_code_1 bytes[1],
            mtm_code_2 bytes[2],
            hw_code bytes[3],
            battery_level bytes[4] + %,
            size_value bytes[5],
            distance_1_mm bytes[6]  8  bytes[7],
            distance_2_mm bytes[8]  8  bytes[9],
            distance_unit mm,
        }
    ];
}
R1D, Heart - beat 
    else if (fPort === 58) {
    return [
        {
            led_state(bytes[0] & 0x7f) === 0  Off  On,
                battery_level bytes[4] +  %,
            }
        ];
    }
     R5 waste bin sensor
    else if (fPort === 11) {
    return [
        {
            led_state bytes[0] === 0  Off  On,
            mtm_code_1 bytes[1],
            mtm_code_2 bytes[2],
            hw_code bytes[3],
            battery_level bytes[4] + %,
            size_value bytes[5],
            distance_1_mm(bytes[6]  8  bytes[7]),
    distance_2_mmbytes[8]256 + bytes[9],
        distance_3_mmbytes[10]256 + bytes[11],
            distance_unit mm,
            }
        ];
    }
R5, Heart - beat 
    else if (fPort === 12) {
    return [
        {
            led_state(bytes[0] & 0x7f) === 0  Off  On,
                battery_level bytes[4] +  %,
            }
        ];
    }
UPLINK, RFAC
    else if (fPort === 1) {
    var data = {};
    data.length = bytes.length;
    if (bytes[0] === 0x59) {
        if (bytes[1] === 0x44) {
            data.Uplink_interval = (bytes[2] - 0x30)  60 + (bytes[3] - 0x30);
            data.Uplink_interval_unit = String.fromCharCode(bytes[4]);
        }
        else if (bytes[1] === 0x53) {
            data.Heart_Beat_interval = (bytes[2] - 0x30)  60 + (bytes[3] - 0x30);
            data.Heart_Beat_interval_unit = String.fromCharCode(bytes[4]);
        }
    }
    else if ((bytes[0] === 0x41) && (bytes[1] === 0x43)) {
        data.RFAC = OK;
    }

    return { Yunhorn_SmarToilets_data data };
}
}