Process Inbound Twilio SMS message in Maximo

In the last post, I uploaded some demos on how we can process inbound text messages to create SR and route Workflow. There are a few people on LinkedIn asked me how to do it. I also like to explore the option of integrating Maximo with Twilio directly without the need for App Connect. With Maximo 7.6, we can create a simple API using automation script. So, the video below is how we can create a simple script API and direct Twilio HTTP requests to Maximo:



Interacting with Maximo via SMS

Voice call and SMS are being used as a user interaction interface in many systems and services provided by large organizations. However, in the past, this integration is quite complex and expensive, and thus, I never had a chance to play around with. Recently, I posted an article on how we can easily configure Maximo to send notification as SMS message. This is made easy and (free for developers) by using Twilio. 

Sending inbound command to a system from Twilio is more complex as it requires setting up of a Web Server and writing code to parse HTTP POST data and forward the message to an on-premise Maximo system. With App Connect, it becomes easy (and free for developers) to set up an API gateway on cloud and routing message to a system hosted in-house. So I decided to give it a try by imagine a two easy-to-achieve use cases as follow:
  • Field workers sending a text message to Maximo to create a new Work Request, report Incident, or Defect. This could be useful to quickly register an action item without having a smart device or 3G connection. Below is a quick demo of this scenario:


SMS Notification for Maximo using Twilio

Every once in a while, someone would ask me if we can configure Maximo to send notification via text messages? With Maximo, the answer to such questions is always Yes. However, with this one, it will cost some money, very cheap though.

Since it is not free, I would say for most Maximo notification scenarios, the user would be ok with email notification which is free. However, there are certain scenarios where SMS notification can add value such as:
  • Notify a field worker when a new high priority Work Order is assigned to him/her
  • Notify an asset owner when the asset deviates from normal operating parameter range or when downtime is reported
  • Notify Maximo admin when there are repeated login attempts from an uncommon IP address or when there is a major problem tracked by Escalation app.


IBM App Connect - Integrate Maximo with Google Sheet, SalesForce, and ServiceNow

While having a break between projects, I have some free time to play around with IBM’s new toy: App Connect. After several years working with Enterprise applications, I’ve got to a point where I can tell if a system is great or not after playing around with it for a short time.  Some examples of great systems or platforms I have experience with is Maximo (of course), React Native (for mobile development), and SAP. Some examples of *not so great* systems I played with include Oracle EBS, Infor SunSystems, Maximo Anywhere mobile platform.

With App Connect, I can tell this is an excellent tool after going through a few beginner tutorials. I can immediately come up with some useful use case using it to enhance Maximo by integrating it with other cloud applications. Below are two examples:

Maximo Crash Course on Youtube - Starting point for a complete beginner

After posting a bunch of Maximo training videos in Vietnamese on Youtube, I got some requests for similar contents in English. On the web, there are plenty of Maximo resources in English; so I didn’t think it is necessary to create new duplicated content. But someone recently pointed out to me that as a beginner, he doesn’t know where to start. So here it is, a bunch of *super short* videos to get you started with Maximo. After going through these, I’m sure you will have a better idea on which direction you want to learn more about the software.

 - Basic concepts in Maximo asset management: These tutorials are done on the IBM public Maximo preview site, so you don’t need to set up anything to do some exercises




Deploy Maximo 7.6.1 on Websphere 8.5

Out of curiosity, I installed Maximo 7.6.1 on a VM to explore the new features. Then I found that I kind of like it, so I wanted to deploy it on my host OS to get rid of the VM. The trouble is I have Websphere 8.5.5.3 which comes with Maximo 7.6.0.0. I can run maxinst.bat to create demo data with Oracle 11g without a hiccup, but the deployment of the EAR file to Websphere didn't go well.

It turned out Maximo 7.6.1 requires Java 1.8 and Websphere 9. It's not possible to upgrade Websphere from version 8 to 9. We will have to install a new Websphere environment and migrate all of the settings which sounds like a lot of work. I decided to tweak it a little bit to make Maximo 7.6.1 runs on Websphere 8.5 using the following process:


Basic steps integrating Maximo Spatial and ArcGIS

Due to many changes in different versions, documentation provided by IBM for Maximo Spatial integration is scattered and inconsistent. In this video, I’ll give a quick demo on how to carry out the most basic configuration to enable integration between Maximo Spatial version 7.6 and ArcGIS.



In the video, what we have is a sample non-secured ArcGIS online server. However, enterprise GIS map services are often provided via SSL layer and can use token-based authentication. So below are some of the common problems

Unboxing Maximo SaaS Flex

I had never been a big fan of Maximo SaaS due to my background comes from a market where labour cost is cheap while license cost is outrageous. As such, we consultants prefer to spend some time building customized apps rather than spending lots of money buying more licenses or add-ons. (To give you a bit of perspective, in Australia, one Maximo license is worth about 15 days cost of an average engineer. In Vietnam, it is equivalent to about 1 year. Which means if you give an engineer a Maximo account; after a year, if it helps to save him or her 15 days, it worth the cost. But in Vietnam, it must save the engineer 1 year of labour to break even).




How to modify (almost) any Maximo data with no database access


Being Maximo consultants, we often come into a scene where the client gives us MAXADMIN access to the system but access to the database is an absolute No-No. This is usually the case with companies which have a clear separation of the App Admin and DB Admin roles. This is also one of the key restrictions with Maximo as a Service.

If you have been doing a bit of admin and config activities, you will surely understand the limitation of having no database access. It’s like having to work with tied hands. Luckily, we can use MXLoader to query/update almost any data tables in Maximo. Below is an example on how to do it.

Let say we're working with a Maximo SaaS and IBM only gives us front-end admin access, but no access to the back-end.

OutOfMemory problem when deploying Maximo

For every client I work with, I always keep a copy of the SMP folder if I can. And every time I need a standard demo instance with exactly the same configuration with the client, I simply deploy it on my local Websphere and Oracle DB.

My current websphere version is 8.5.5.3, and I had problem whenever I deploy a Maximo 7.6 instance with lots of add-ons. I gave up the attempt in the last few times as I didn’t really need it. But recently, as I was working with Maximo Flex (on cloud), having a local instance is a must as Maximo on cloud has lots of limitation in term of what you can do. As such, I when I had the same problem deploying Maximo, I had to investigate and fix the issue. Turned out it is an OutOfMemory issue during the deployment process and it took me quite a bit of time to fix it, so I leave the note here as I’m sure many other will have similar problem.

Solving problems with Update DB process when install or upgrade Maximo


When upgrading Maximo or installing new add-ons or fix packs, new source files will be copied to SMP folder which include Java classes and DBC (database configuration) script files. After that, the installer will run the UpdateDB process to update the database, run the BuidMaximoEar process to build the EAR file, and then deploy the EAR file to Websphere.

The DBC script files contain incremental changes to the Maximo database which add changes to GUI, update data, and modify DB configuration objects. Most of the problems you get when installing fix packs or upgrading Maximo come from the UpdateDB process which execute these DBC files in a set order.

Bulk upload images via Integration Framework



In the previous post, I have provided an example on how we can customize Object Structure to enable import/export binary data via MIF. In Maximo 7.6, the automation scripting framework has been greatly extended to support integration. With this update, we can enable import/export of binary data by adding a simple script without having to write and deploy custom java code. Below is an example how we can configure Maximo 7.6 to bulk upload images to Item Master application:

Step 1: Add an Object Structure integration script
  • Open System Configuration > Platform Configuration > Automation Script application
  • On Select Action menu, choose Create > Script for Integration
  • On the Create Script for Integration pop-up, enter the following details:
    • Select “Object Structure
    • Choose “MXITEM” for Object Structure
    • Select “Inbound Processing
    • Language: Python
    • Paste the following piece of code to the  Source Code text area:


    • Click on Create. Then save the script

Creating high performance service using MaximoCache

Sometimes in our application, we need to build custom services that run when Maximo starts. We can extend the psdi.server.AppService class and register it with MXServer by inserting a new entry into the MAXSERVICE table. If the service executes slow running queries, it is a good idea to cache the data in memory to improve performance. We can implement MaximoCache interface for this purpose. By doing this, we can initialize the service when MXServer starts and pre-load all data required by the service into JVM memory. When the service is called, it will only use cached data to provide instant response which gives a much better user experience. 

Below are the steps to create a sample service that loads all Location’s description into memory. The service will provide a function to check if an input string matches with a location’s description or not. We will call this check when user entering an Item’s description and it will throw an error whenever  the input matches with the description of any existing Location. This is not a very good use-case. But for the sake of simplicity, I hope it gives you an idea on how it can be implemented.


MboSet performance, Memory Cache, and DB Call


I recently had to look at ways to improve performance of a custom built operation in Maximo. Essentially, it is one of the many validation operations taken place after a user uploads a PO with a few hundred thousand lines.  The team here already built a high performance engine to handle the process, but even with it, this particular operation still take around 15-17 milliseconds to process each line which is too slow to their current standard. Imagine to process 200,000 PO lines, it will take nearly an hour just for this operation alone. There are a few dozen of these operations need to be executed, plus other standard basic Maximo operations like status change or save, the whole process takes up many hours.

With this millisecond operation, many assumptions or standard recommendations on improving performance may not work. In some instances, following the standard recommendations actually make it slower.

Import/Export Maximo ImageLib Data via Integration Framework

In Maximo, we can upload images as attachments in Doclinks which are stored as files the server or as avatar images which are stored as binary data inside the IMAGELIB table. Avatar image is quite useful to give the user a quick view of how an inventory item or an asset/location looks like.

While Maximo allows us to upload Doclinks attachments via MIF, uploading images to IMAGELIB table via MIF is not supported out-of-the-box. Therefore, in order to upload image, we can only do it manually one-by-one via Maximo’s GUI. For bulk loading, if we have access the DB server, we can write a stored procedure to read the files and import binary data directly into the DB. There are two scenarios I had in the past in which this approach doesn’t work:
  • When we built mobile apps and wanted to upload data to IMAGELIB. In that case, my team mate extended a REST handler class to achieve this requirement.
  • When we needed to bulk upload images, but the client did not allow us access to the database and database server.

Federated MBO – Filling the gap between Maximo and IOT


Recently I got some time to explore the new Federated MBO feature. I like it a lot because it is very simple to configure and quite powerful. Of course, prior to Maximo 7.6, the same functionality can be done with Java programming, but with this new feature, it is so easy to incorporate data from external systems into Maximo business logic and make a seamless experience to the end-users.

Basically, Federated MBO allows you to link API from an external system and make it looks like a standard object in Maximo and treat it like other standard Maximo objects such as displaying data on GUI or setting up workflow conditions or writing automation script against it. The key difference here is that data is not stored inside Maximo database but queried from the API on-the-fly when the object is accessed.

I can immediately think of several applications that are enabled by this feature:

Blanket Contract and Procurement in Maximo


A friend of mine who has experience with SAP asked whether Maximo can handle a “Blanket PO” process similar to SAP. I sent him my answer based on the scenario and requirement he provided and think it is probably worth posting here as some other people may find it interesting:



Maximo custom control (Part IV) – Create a chart control


In the previous posts, we have practised on how to create a JSP page, register it as component, and register a control. We also discussed on how to pass properties from control to its components and use it with conditional UI.

In this post, I will provide an example to build a chart control to display meter data of an asset.





Maximo custom control (Part III) – Conditional UI with custom properties


In the last exercise, we added new properties to a control, and by doing so, we have better understanding that the properties of a control is defined inside the <property-list>…</property-list> XML element. We also know how properties are passed from control level to its components.

If you have some experience with Application Designer, you must already know that, we can dynamically modify value of a property using Conditional UI. We can do the same with the custom properties that we recently added.

With the two properties: “part1size  and “part2size” added to the multipart textbox in the previous exercise, let’s configure a simple Conditional UI to demonstrate this capabily:

Maximo custom control (Part II) – Control properties


In my last post, I created a super simple control with just a “Hello World” label. The goal of the exercise is for us to identify the core components of a control. In this post, I’ll continue to expand the exercise so we can better understand Maximo’s controls.

One common requirement the need modify the size of the multipart textbox control, usually to increase the size of the first textbox to fully display long ID of item or asset.


Application Designer doesn’t provide us with an option to modify this.

Getting Started with Maximo's Custom Control (Part I)

Application Designer is a powerful tool to customise Maxmo’s GUI. However, in certain situation, it couldn’t do what we want to meet the requirements of our clients. In that case, we can look at customising Web UI module.

In this series, I will provide step-by-step instructions on how to customise controls in Maximo. The aim is to help beginners get familiar with the framework by going from the most basic modification then build up from there. 

Part I -  Create a simple Label control: 

Let’s get started by displaying a ‘Hello World!’ label on the main screen of the Asset application. We can do that by creating our own custom control.

Maximo's ABC Analysis and Physical Count

A friend recently asked me on LinkedIn about Inventory ABC analysis on Maximo and how to setup physical cycle count. After responding to him, I thought it could be posted on this blog to share with other Maximo users who like to know more about this function.

First page of the ABC Analysis Report


ABC Analysis is the method of categorizing inventory items into three groups: fast moving, average, and low moving. This method is commonly used in ERP systems like SAP or Oracle.

Maximo with Oracle’s InMemory (Part 2) – Huge Performance Gain

Last week, I played around with Oracle’s new toy: the InMemory feature available in Enterprise Edition. Although it made Maximo runs 1.25x faster, but it didn’t meet my expectation which was from 2x to 5x. This has bothered me for the whole week and I kept thinking about it.

If you’ve read my previous blog post, the one thing I pointed out which could lead to no performance improvement is that I ran the test on a tiny demo version. It has only a few hundred assets and less than a thousand work orders. So, any heavy processes or poorly written queries couldn’t make the database 1 second slower. This week, I set out to do a more elaborate test with a setting that looks more similar to a real production environment.

Test Oracle InMemory Database with Maximo

For the last few years, SAP has been pushing hard on its HANA InMemory data platform and everybody talks about it. For me it makes sense because SAP’s ERP is such a huge system usually used by super large enterprises and is both a data intensive and mission critical system.

Maximo on the other hand is usually much less data intensive and for most clients I work with in Vietnam, they have small systems with databases of less than 10-20GB. Thus, I believe InMemory database is not a big deal for Maximo users. As I recently moved to Australia and got a chance to work with a much bigger client. Their Maximo runs on a cluster of more than two dozen JVMs yet somehow is still a bit slow considering the number of active users that they have. I suspect (since I don’t have visibility to their DB server) the bottle neck is the database in this case. Besides from the standard suggestions of looking at disk storage/SAN, network, memory allocation etc., I also mentioned they can consider implementing InMemory. Then I realized I never seen it implemented with Maximo, it would be a huge embarrassment if they look at it and find out that it doesn’t work.

This week I have some free time, so I decided to play around with InMemory database for Maximo to (1) confirm if it is possible and (2) see if it gives any real performance gain for Maximo.

Barcode/RFID Scanning for Maximo Everyplace

I’m in love with Maximo Everyplace. It is so simple and easy to use. And guess what, it is totally free now with Maximo 7.6.

Recently I worked with a client and while the team still discussing various options for mobility solutions, I quickly duplicated and produced an Everyplace mobile app on Test environment and demonstrate a smooth workflow with barcode scanning on my iPhone, all done within 15 minutes. I understand there are certain reasons for choosing a more complex online/offline, even native app solutions. However, since everyplace is so easy and cheap to implement, so why not have it as a backup solution just in case the more complex one doesn’t work. If you have experienced the use of such offline, installed app solution, you will know what I’m talking about. Things like app crashes or hang are quite common. Those things are usually quite difficult to support as the programmers, who for 99% of the time are present not onsite and do not have access to log files to see what happened to investigate and provide timely bug fix. In this case, for the end-users it is extremely frustrating as they cannot proceed with their work.

RFID/Barcode and Integrated Mobile Solutions for Maximo

      I had to look at RFID/Barcode options for Maximo mobility solution recently. Although these technologies have been around for decades and have become a commodity, when integrating with other systems like Maximo Anywhere or Everyplace, there are certain problems that we have to deal with. In this post, I’ll discuss a few concerns related to this topic, hopefully it helps Maximo consultants to save some time when considering the solution. These are just a brain dump of different things related to the topic that I have in mind. Thus, you can read them at any order or only look that the part that you are most interested in.

  • Barcode vs QR code: When it comes to barcode reading, many people think that they can simply use the built-in camera of the phone or tablet to read barcode, as seen in many product comparing apps. However, in industrial setting, one should consider various extreme conditions that field workers have to work in. For example, in construction or in oil & gas, working at night is common. In such case, the camera doesn’t do well in reading barcode. In some of our tests, under pretty good ambient light, reading barcode takes up to 3-5 seconds while QR code reads almost instantly.