A BMS to CMMS integration usually gets the hard parts right. Alerts are deduplicated, severity drives routing, the audit trail holds. Then somebody runs a failure analysis a year later and finds that ninety percent of the automatically raised work orders carry a single fault category, often something like "BMS alarm" or whatever the default was, because the alarm text was copied into the description field and nothing was mapped into the classification the analysis actually reads.
The message up front: the mapping from alarm source to fault classification is a maintained reference table, not a transformation you can derive from alarm text. Map to the problem code only and leave cause and action to the technician, accept a many-to-one collapse rather than inventing categories to match alarms, send anything unmapped to an explicit unmapped bucket that somebody reviews, and version the table because changing it changes the meaning of history.
1. Two vocabularies that were never meant to meet
The difficulty is structural rather than technical. The two systems classify for different reasons.
A BMS alarm identifies a condition that a controller detected, usually tied to a point and a limit: a value outside a band, a device not responding, a status not matching a command. The vocabulary is as wide as the number of configured alarms, it is frequently site-specific, and much of it was written by whoever commissioned the system in free text.
A CMMS fault classification exists to make maintenance history analysable. The problem, cause and action structure described in failure codes is deliberately a short, controlled list, because its value comes entirely from the fact that many events share a code. A classification with hundreds of entries analyses no better than free text.
So the mapping is not a translation between equivalent vocabularies. It is a deliberate collapse from a wide, local, detection-oriented set into a narrow, controlled, analysis-oriented one, and that collapse loses detail by design. The detail is not lost from the record, because the alarm text travels in the description, but it is deliberately not in the field the analysis groups by.
2. Map the problem, not the cause
The most common and most damaging error is mapping an alarm straight through to a cause.
An alarm reports a symptom. It says a temperature is outside a band, or a device did not answer, or a differential is high. It does not and cannot say why, and a mapping table that asserts a cause from a symptom is making an engineering judgement that nobody validated, in a field that will later be aggregated and presented as fact. That is how a reliability report comes to show a dominant cause that nobody ever diagnosed.
- Populate the problem code from the mapping. This is defensible, because the alarm genuinely does identify the observed problem.
- Leave the cause code empty for the technician to complete. It is the only point in the process where somebody has looked at the plant.
- Leave the action code to the closing entry, for the same reason.
- Carry the original alarm identifier and text as reference fields, so the detail is recoverable without being aggregated.
Do not parse alarm text to classify
It is tempting, because the alarm text usually contains a recognisable word and a keyword rule is quick to write. It is also the single most reliable way to produce a classification nobody can trust. Alarm descriptions are free text written by different contractors across different sites and different commissioning years, they get edited without notice, and a keyword rule matches the word in both an alarm and its negation. Map on the stable identifier instead: the device and object identity, or the alarm's configured reference. If no stable identifier exists, that is a finding about the alarm configuration rather than a reason to parse strings, and it belongs on the register described in the point dictionary.
3. What the mapping table holds
| Column | Holds | Why it is there |
|---|---|---|
| Source identity | Device and object reference, or the alarm's configured identifier | The stable key. Text is not a key |
| Asset reference | The asset the point belongs to | Comes from point-to-asset mapping, and decides where the history lands |
| Problem code | One entry from the controlled CMMS list | The field the analysis groups by. The whole point of the table |
| Work order type | Corrective, inspection, investigation | Not every alarm warrants a corrective job, per work order types |
| Trade or crew | Who it routes to | Often derivable from the problem code, sometimes not. Explicit beats inferred |
| Instrument or plant | Whether the fault is in the sensing or in the equipment | A distinction that changes the trade and the asset, and the reason for the routing in faults that clear before arrival |
| Effective dates | When this mapping applied | So that re-running last year's analysis uses last year's mapping |
4. The unmapped bucket, and why it must be visible
Every mapping table is incomplete, permanently, because alarms get added by contractors during works and nobody tells the integration team.
There are three ways to handle an alarm with no mapping, and only one of them works. Blocking it means a real fault produces no work order, which is unacceptable. Silently assigning a default means the job is created, nothing breaks, and the analysis is quietly poisoned, which is what happens by default and is the worst of the three because it is invisible. The third is to create the work order with an explicit unmapped classification that is obviously not a real category, and put the count of unmapped events on a report somebody reads.
That count behaves usefully. It should fall towards zero after the initial mapping exercise, and a sudden rise is a reliable signal that somebody changed the alarm configuration, which is information worth having for reasons beyond classification.
5. Building the table without a six-month project
The exercise sounds enormous and is usually manageable, because alarm occurrence is heavily concentrated.
- Start from a year of alarm history, ordered by frequency. A small number of distinct sources almost always accounts for most occurrences, and mapping those gets most of the coverage.
- Map the critical assets next, regardless of frequency. A rare alarm on an important plant item matters more than a frequent one on a store room, and the criticality classification in asset criticality is the right ordering.
- Do it with a maintenance planner and a controls engineer in the same room. Neither can do it alone: one knows what the alarm means, the other knows what the category is for.
- Leave the long tail unmapped deliberately and let the unmapped report drive the rest. This is far more efficient than trying to be complete up front, and it prioritises by what actually occurs.
- Review deduplication at the same time. Repeated occurrences of a mapped alarm should usually join an existing case rather than create a new job, which is the behaviour in alert deduplication and repeated faults as one case.
6. Changing the table changes history
This is the part that gets missed and causes the most awkward conversation.
If a mapping is corrected, every future event classifies differently from every past one, and a trend that crosses the change date shows a step that has nothing to do with the plant. Somebody will present that step as a finding.
Three practices keep it honest. Hold effective dates on each mapping row so the classification applied at the time is recoverable. Record mapping changes somewhere a report author will see them, ideally as annotations on the trend itself. And decide explicitly whether to reclassify historical records when a mapping is corrected: leaving history alone is usually right, because it preserves what was actually recorded, but it must be a stated decision rather than an accident, and anyone comparing periods needs to know which applies. The same reasoning appears for instrumentation changes in sensor replacement and BMS history.
Limits
No specimen mapping from particular alarms to particular fault codes appears here, deliberately. Which problem code a given alarm should carry depends on your controlled code list, your asset structure and what the alarm was configured to detect on that plant, and a worked example would be copied without that context. More importantly, nothing above should be read as asserting what any alarm condition means mechanically, what equipment fault it indicates, or what threshold is appropriate; those are engineering judgements for the controls engineer and maintenance engineer responsible for the plant, and the whole argument of section two is that the integration should not make them. This is written from the integration and data side.
The idea to walk away with
An alarm-driven work order is only as analysable as its classification, and the classification does not arrive with the alarm. It comes from a reference table that collapses a wide, local, detection-oriented vocabulary into a short, controlled, analysis-oriented one.
Build it on stable identifiers rather than alarm text, populate the problem code and leave cause and action to the person who attends, make the unmapped bucket visible and reported, and hold effective dates because the table is part of what your history means.
Final thoughts
There is a one-query check for whether this is a problem on your estate. Group last year's automatically raised work orders by problem code and look at the distribution.
If it spreads sensibly across the categories your planners recognise, the mapping is doing its job. If one code holds most of them, the integration is working and the failure analysis built on it is not, and the frequency-ordered alarm list is where to start, because a short mapping session will usually recover most of the value.
Disclosure
Alongside advisory work I also build a CMMS and CAFM platform, so I have a commercial interest in this category. Nothing above is a recommendation for it, and no vendor named here has paid for inclusion or had any editorial input. Weigh the analysis accordingly.
Every BMS job in one fault category?
Independent help building the alarm-to-classification mapping on stable identifiers, with an unmapped bucket that gets reviewed and effective dates that keep history meaningful. 22+ years across CMMS, CAFM, EAM and ERP implementations.
Book a conversationRelated reading: Failure codes, Alert deduplication, Point-to-asset mapping, Work order types, Linking faults to asset history, Who owns a BMS alarm.
Muhammad Abbas
CMMS / CAFM Manager & Independent Advisor · 22+ years across enterprise CMMS, EAM, CAFM and ERP implementations in utilities, oil and gas, manufacturing, government and facility operations.
Work with me