Concepts
Almost every CMS setup combines the same few objects. Understanding this chain answers most usage questions.
Application
Represents an integrated system (ERP, MES, WMS, scale, PLC…). It has a short code — used in URLs and reports — and is the grouping unit of the system: interfaces, definitions, tokens, alerts and reports are always organized by Application.
The Application is also the availability monitoring unit: CMS checks its connection in cycles (keep-alive), records online/offline periods and produces the uptime report.
The selector at the top of the screen sets the Application in focus: pick one and the screens show only what belongs to it, and that choice follows you across screens.
Ticket tools (Help Desk) are Applications too, in a category of their own. They show up in Interfaces, Message Definition and the Messages filters, but stay out of the Application in focus selector and out of the shop-floor configuration screens.
Interface
A processing interface. It defines how messages in that flow are consumed:
- Sequential — one message at a time, preserving arrival order.
- Parallel — several messages at once, with configurable concurrency.
An Interface can be blocked (manually or automatically by a business error rule). While blocked, messages keep arriving but are not delivered — which avoids firing hundreds of errors at a destination system already known to be down.
Delivery Definition
The delivery contract: where the message goes and how.
Delivery type
Defines the protocol used to deliver the message to the destination:
| Type | What it does |
|---|---|
HTTP_POST | Sends the payload by POST to the destination endpoint — the most common case |
HTTP_PUT | Sends by PUT, for REST APIs that expect the resource to be replaced |
HTTP_PATCH | Sends by PATCH, for partial updates of the resource |
HTTP_DELETE | Calls the endpoint by DELETE, to remove the resource |
HTTP_SOAP | Builds and sends the SOAP envelope to the destination web service |
MQTT_PUBLISH | Publishes the payload to an MQTT broker topic |
SQL_SERVER_EXEC | Runs a command or procedure on the destination SQL Server |
ORACLE_EXEC | Runs a command or procedure on the destination Oracle |
POSTGRES_EXEC | Runs a command on the destination PostgreSQL |
SQLITE_EXEC | Runs a command on the destination SQLite database — the connection’s .db file |
INFLUXDB_WRITE | Writes points into a time series on the target InfluxDB |
MONGODB_WRITE | Writes the message as a document into a MongoDB collection — inserting, or updating an existing document |
SAP_RFC_CALL | Calls a function module / BAPI in SAP with the message data |
OPC_UA_WRITE | Writes values to OPC UA server tags (goes through the write gate) |
MODBUS_WRITE | Writes values to Modbus TCP registers (goes through the write gate) |
PI_WEB_API_WRITE | Writes values to PI System tags (AVEVA/OSIsoft) |
SPARKPLUG_CMD | Publishes a command on the Sparkplug B namespace, over the same MQTT connection |
FILE_WRITE | Writes the content to a file in the directory configured on the connection |
Fields common to every type
| Field | What it defines |
|---|---|
| Code | Identifier of the definition, unique across the whole system — not just within the Interface. It goes into the receiving URL, so changing it later breaks existing integrations |
| Application and Interface | Who the definition belongs to and which interface the messages go through |
| Message type | ASSINCRONA — persists, queues and replies immediately; SINCRONA — waits for the destination before replying to the caller |
| Receiving URL | Public address generated for this definition: POST /api/{interface-code}/{definition-code} |
| Content-Type | Header used when sending to the destination (default application/json) |
| Validate Content-Type | When enabled, rejects messages whose content type does not match the expected one |
| Encoding | Encoding of the sent body (default UTF-8) |
| Maximum payload size | Limit accepted on reception; above it the message is rejected |
| Message decoding | Converts the body before processing: NENHUM, BASE64, XML_UNESCAPED, URL_ENCODED, HEX, CHARSET_LATIN1, HTML_ENTITIES |
| Transformer | Script applied to the payload before delivery (optional) |
| Content Template | Text with {{alias}} that replaces the payload as the delivered content (optional). Resolves against the Transformer output |
| Send timeout | Seconds to wait for the destination response before calling it a failure (default 30) |
| Maximum retries | How many times to retry a technical failure (default 3). The system waits 10 seconds between attempts |
| Destination credential | Credential used to authenticate the outbound call |
| Forward response | When enabled, returns to the caller the response the destination gave |
| Enable WebService (WSDL) | Publishes the SOAP endpoint with a dynamic WSDL for this definition |
| WS-Security Header | Accepts UsernameToken authentication inside the SOAP envelope |
| Expose as MCP tool | Lets an AI agent call this Delivery, through the MCP integration server |
| Active | Turns the definition off without deleting it — it stops receiving messages |
Fields by delivery type
| Type | Type-specific fields |
|---|---|
HTTP_POST · HTTP_PUT · HTTP_PATCH · HTTP_DELETE | Destination host and URI that make up the address called |
HTTP_SOAP | Destination host, URI and the web service SOAP Action |
MQTT_PUBLISH | QoS — 0 (at most once) or 1 (at least once). The broker comes from the destination application’s connection |
SQL_SERVER_EXEC · ORACLE_EXEC · POSTGRES_EXEC · SQLITE_EXEC | SQL command run on the destination database. The :payload, :datetime and :transformer placeholders become bound parameters, never concatenated text |
SAP_RFC_CALL | Function/BAPI name, the IMPORT and TABLES parameter mapping, the expected input payload (with required fields) and commit after the call — many write BAPIs require an explicit commit |
OPC_UA_WRITE | Write tags (alias → NodeId), plus the optional gate: trigger tag and value that release the write, and the value written afterwards |
MODBUS_WRITE | Write tags (alias → table and address), plus the optional gate: trigger table, address and value, and the value written afterwards |
PI_WEB_API_WRITE | Write tags (alias → PI path), timestamp source (now or a payload field) and the write mode |
INFLUXDB_WRITE | Measurement, column mapping (each alias becomes a tag or a field), precision, timestamp source and the target bucket |
MONGODB_WRITE | Target collection, write mode (insert one, insert batch, update or create, update only), the key fields in the modes that match an existing document, and the write timestamp field |
FILE_WRITE | File path inside the base directory, write mode (create new or append), encoding and atomic write |
SPARKPLUG_CMD | Group, Edge Node and Device of the namespace, and the command metrics (alias → metric name and type) |
For write tags, the message producer sends a flat object {alias: value} — it does not need to
know the PLC’s internal NodeIds or addresses, only the aliases configured here. Each message may
carry just a subset of the aliases: whatever arrives is what gets written.
Collector Definition
The mirror image of the Delivery Definition: instead of waiting for someone to send, CMS goes and fetches.
Collector type
Defines where the data comes from and how it is obtained:
| Type | What it does |
|---|---|
HTTP_GET / HTTP_POST | Calls an external endpoint on a schedule |
MQTT_TOPIC_SUBSCRIBER | Subscribes to an MQTT topic and reacts to each publication |
SQL_SERVER / ORACLE / POSTGRES / SQLITE | Runs a query and turns the result into messages |
SAP_RFC | Calls a function module / BAPI in SAP |
SAP_IDOC | Receives IDocs pushed by SAP |
OPC_UA_TRIGGER | Watches an OPC UA tag and fires when it changes |
MODBUS_TRIGGER / MODBUS_POLL | Watches a change or polls Modbus TCP registers |
INFLUXDB | Runs a Flux, InfluxQL or SQL query against a time series |
MONGODB | Reads documents from a collection by filter (find) or pipeline (aggregate) |
SPARKPLUG_SUBSCRIBER | Subscribes to a Sparkplug B namespace and receives births and metric changes |
PI_WEB_API | Reads PI System tags: current value, recorded, interpolated or summary |
FILE_WATCH | Watches a directory and turns each arriving file into a message |
Fields common to every type
| Field | What it defines |
|---|---|
| Code | Identifier of the collector, unique across the whole system. It goes into the dynamic collector API URL |
| Application and Interface | Who the collector belongs to and which interface the result goes through |
| Forwardings | The destination Interfaces/Definitions the collected payload flows to. A single collector can feed several destinations |
| Input parameters | Fields an external producer can send to POST /api/collect/{interface}/{collector}, which the collector uses to build the fetch. With them, the collector runs on demand |
| Enable WebService (WSDL) | Publishes the same dynamic API in SOAP as well, through the ExecutarColeta operation. Requires input parameters |
| Expose as MCP tool | Lets an AI agent run this collector, through the MCP integration server. Requires input parameters |
| Transformer | Script applied to the collected payload, before forwarding (optional) |
| Maximum retries | How many times to retry a failure (default 3), waiting 10 seconds between attempts |
| Active | Turns the collector off without deleting it — stops the schedule or the subscription |
| Last execution result | Status, timestamp and error message of the last fetch. Applies only to pull types: event-driven types have a real-time connection status instead |
The frequency of pull types belongs to the Interface (interval in milliseconds or a cron expression), not to the Collector. Turning it on and off, and running it now, live on the Schedulers screen.
Fields by collector type
| Type | Type-specific fields |
|---|---|
HTTP_GET · HTTP_POST | Source URL, fixed parameters, payload template (for POST), source credential, send content type and collection timeout (default 30 s) |
MQTT_TOPIC_SUBSCRIBER | Broker external connection, subscribed topic and QoS |
SQL_SERVER · ORACLE · POSTGRES · SQLITE | External connection, SELECT query, result mode, key column and post-collection command — the command that marks as read what was just fetched |
SAP_RFC | External connection, function/BAPI name, the IMPORT and TABLES parameter mapping, and the input variables that come from outside |
SAP_IDOC | External connection (the listener) and the IDoc type, message type and partner filters that decide which IDocs this collector receives |
OPC_UA_TRIGGER | External connection, trigger NodeId and value that fire the collection, read tags (alias → NodeId) and the reset after reading — the value written back to the trigger tag to consume the signal |
MODBUS_TRIGGER · MODBUS_POLL | External connection, trigger table, address and value, read tags (alias → table and address), polling interval, reset after reading and emit only if changed |
INFLUXDB | External connection, query, language (Flux, InfluxQL or SQL) and the bucket/database for this collector |
MONGODB | External connection, operation (find or aggregate), collection, filter or pipeline in JSON, projection, sort, document limit, payload format and the post-collection command that marks the documents read |
SPARKPLUG_SUBSCRIBER | External connection (the broker), group, Edge Node and Device subscribed, and whether it requests a rebirth on connect |
PI_WEB_API | External connection, tags read, read mode (current value, recorded, interpolated or summary), time window, interval and the emission mode |
FILE_WATCH | External connection (the base directory), subfolder, file mask, encoding, emission mode and the action after reading — move, rename or leave as is |
The result mode of SQL queries decides the granularity: LINHA_UNICA_PAYLOAD_UNICO (the whole
result becomes one message) or UMA_LINHA_POR_PAYLOAD (each row becomes its own message).
Transformer
Sandboxed JavaScript (node:vm inside worker_threads, in an isolated pool) that takes a
payload and returns another: JSON ↔ XML, field remapping, aggregate calculation.
The same Transformer is reusable in Delivery Definitions and Collectors. It can be written by hand in the Monaco editor or generated by AI from an input sample, an output sample and a prompt — with generation history and explicit approval before it goes live.
On a Delivery that receives from several systems in different formats, each producer Application can have a Transformer of its own, which converts that producer’s format into the Delivery’s and runs before the Delivery Transformer — see Transformer by producer Application.
External Connection
Reusable connection settings, with a test connection button. Collectors and Deliveries point at a Connection instead of repeating host/port/user in every configuration.
| Category | Available types |
|---|---|
| Databases | SQL Server, Oracle, PostgreSQL (includes TimescaleDB), SQLite, InfluxDB, MongoDB (includes Atlas, Azure Cosmos DB and AWS DocumentDB) |
| Shop floor | OPC UA, MQTT (includes Sparkplug B), Modbus TCP, PI Web API |
| SAP | SAP RFC / BAPI, SAP IDoc, SAP Gateway (OData), SAP CPI (Cloud Integration) |
| Files | Watched and written directory |
The connection type linked to the Application decides which Collector and Delivery types are
available in it — an Application with a MongoDB connection, for instance, only offers the MONGODB
Collector and the MONGODB_WRITE Delivery.
Variables
Reusable values that go into Collector, Delivery and Transformer settings through {{name}} —
addresses, plant codes, names that change from one environment to another. They come in two scopes:
Global (valid across the CMS) and Per Application (valid only inside it). When the same name
exists in both, the Application value wins.
They exist to pull out of each configuration whatever changes between environments: what differs from development to production lives in one place, instead of scattered across dozens of definitions.
Credential
Authentication used on outbound calls (HTTP/SOAP): basic, bearer, header token, WS-Security. Stored encrypted at rest and never returned by the API.
Plain REST integrations do not need a dedicated adapter: use HTTP_GET/HTTP_POST +
Credential + Transformer. The native adapters (SAP, OPC UA, Modbus, MongoDB…) exist only because
those protocols are not HTTP.
How it all fits together
Application (MES)
└── Interface (MES_PALLET) ← ordering, concurrency, blocking
├── Definition (AnyToMES_Pallet) ← destination, timeout, retries, transformer
│ ├── Credential ← how to authenticate at the destination
│ └── Transformer ← how to convert the payload
└── Collector (SAP_ProdOrder) ← external source + forwardings
└── External Connection ← host/port/user for SAP, MQTT, OPC UA…