Skip to content

Components

This page describes the components you will use in almost every Lab flow, followed by a short overview of the others. Every component also has a built-in help text – select it and open the Help tab in the designer.

All text settings support variables (@[NAME]).

📘 Missing a component or a setting? Do not hesitate to contact us!

✉️ support@exolink.com


Delivers every OCPP message and connection event of your chargers into the flow.

Output Contains
From CPMS Messages sent by a CPMS to a charger: requests (e.g. RemoteStartTransaction), answers to charger requests, and SESSION_CREATED_RESPONSE events.
From Charger Messages sent by a charger: requests (e.g. BootNotification), answers to CPMS requests, and the SESSION_CREATED / SESSION_CLOSED events.

The format of the messages is described in The message object. This component has no settings and cannot be deleted.

Sends messages to a charger or a CPMS.

Input Sends to
To Charger The charger in chargerId.
To CPMS <id> That CPMS. There is one input per CPMS configured in the Charger Profiles that use this Lab.

Messages need at least chargerId and ocpp (connection events need chargerId and action). Messages without them are rejected with an error in the component’s status. This component has no settings and cannot be deleted.


Shows the received data in the Console tab of the designer.

Setting Description
Output type Message data (default) – the message object. Message repository and Message data + Message repository also show the internal data that travels with the message; you rarely need it.
Path to the property Show only a part of the message, e.g. $.ocpp or $.ocpp[3].meterValue. Leave empty to show everything.

Output is only shown while the designer is open. Put a Debug component after a Switch to watch only the messages you are interested in.

A text label on the canvas. It does nothing with messages – use it to explain what a part of your flow does. Links in the text are clickable.


Routes messages by OCPP action – the quickest way to handle e.g. only MeterValues.

Setting Description
Protocol Version 1.6 or 2.0.1. Determines which actions you can choose.
Message direction Charger -> CPMS or CPMS -> Charger. Determines which actions you can choose. Use the direction that matches the output of Exolink Connect - Input the component is connected to.
Outputs One output per action you add, plus a grey no match output for everything else.

Things to know:

  • The switch compares the action field only. Because answers carry the action of their request, the answer to a matching request goes to the same output. If you only want requests, add a Switch on msgType after it.
  • Each direction lists the actions that side starts. For Charger -> CPMS you’ll also find connect (SESSION_CREATED) and disconnect (SESSION_CLOSED).
  • Always connect the no match output. Everything you don’t handle – including connection events – ends up there. If it is left unconnected, those messages are dropped.

Routes messages by conditions on their content.

Setting Description
Path to object JSONPath to the value to check, e.g. $.msgType or $.ocpp[3].connectorId. Leave empty to check the whole message.
Logic operator OR – one output per condition; the message goes to every output whose condition matches, or to the grey no match output. AND – output 1 if all conditions match, otherwise output 2. XOR – output 1 if exactly one condition matches, otherwise output 2.
Conditions Data type (Number, String, Boolean), operator and value. Strings support ===, !==, includes, startsWith, endsWith, their negations, and Regex (written as /pattern/flags).

The whole message is passed on unchanged; the path only decides what is compared. For a Boolean condition, the value must be a real true/false, not the text "true".

Examples:

Goal Path Condition
Only requests $.msgType String === CALL
Only charger DE*EXO*E0001 $.chargerId String === DE*EXO*E0001
Only chargers whose ID starts with TEST $.chargerId String startsWith TEST
Only connector 2 $.ocpp[3].connectorId Number === 2

If you need a different path per condition, use Multi Switch. For anything more complex, use a Code component.

Runs your own JavaScript for each message – change messages, filter them, build new ones or route them to several outputs. It’s the most flexible component in the Lab and has its own page: Code component.


Builds a valid OCPP 1.6 message (a request or an answer) from a simple object, so you don’t have to assemble the OCPP frame yourself.

Setting Description
Message direction Charger -> Backoffice to build a message a charger would send, Backoffice -> Charger to build a message a CPMS would send, or Response (Auto-detect) to answer a received request.
Message type The OCPP action (or <action> (Response) for an answer). The Example and Schema fields show what the component produces and which fields it accepts.
Path Optional JSONPath to the part of the input that contains the fields.

The input is an object with chargerId and the payload fields at the top level:

{ "chargerId": "DE*EXO*E0001", "type": "Hard" }

With message type Reset this becomes [2, "<new id>", "Reset", {"type": "Hard"}], ready to be connected to To Charger.

Response (Auto-detect) answers the message you connect to it: it keeps chargerId, msgId and action of the received request, and takes the answer fields from the top level of the input. Add the fields before the encoder, e.g. with a Code component:

data.status = 'Accepted';
send(0, data);

Clicking the component creates an example message with default values for the selected type, which is handy for testing with a Debug component.


Creates an HTTP endpoint on your Lab, so other systems can send data into your flow.

Setting Description
Method GET, POST, PUT, DELETE, PATCH, OPTIONS.
URL address Path of the endpoint; /api is added in front automatically. /remote-start/{chargerId} creates the endpoint https://<your Lab's address>/api/remote-start/<chargerId>, with chargerId available as params.chargerId.
Body type How the request body is decoded: JSON, URL-encoded, Text or Raw.
Timeout Seconds after which the caller receives 408 and the request goes to the second (orange) output. 0 = no timeout of your own.
Automatically respond with 200 OK? Answer every request immediately with 200. Use this if the caller doesn’t need a result; you don’t need an HTTP Response component then.

Output: { method, url, path, params, query, body, headers, ip, … }.

Unless you enable the automatic answer, every request must end in an HTTP Response component. The endpoint is public: protect it, e.g. with a token in a header that you check with a Switch.

Sends the answer to the request that started this message in an HTTP Route.

Setting Description
Data type JSON (default) sends the message as JSON. HTML, Plain text, XML and Raw expect a string or a buffer. Empty response sends only the status code.
Status code HTTP status, default 200.

Every component between HTTP Route and HTTP Response must keep Keep instance enabled, otherwise the response can’t find its request.

Calls an external HTTP API.

Setting Description
URL, Method Target of the request.
Data passthrough serialization How the incoming message becomes the request: JSON – sent as JSON body (or as query parameters for GET), URL-encoded, Raw, or None – the incoming data is not sent. Must be set.
Headers, Cookies, Query Fixed values. Typical: Authorization: Bearer @[API_TOKEN].
Username / Password Basic authentication.
Request timeout in seconds Default 30.
Output format Auto (parse JSON responses), JSON or Raw.

The first output returns { status, headers, data, … }. A 4xx or 5xx answer is not an error – check status with a Switch if it matters. The second output contains the request that was sent, including its headers; don’t connect it to a Debug component when the headers contain credentials.


Connect parts of a flow without drawing a line – also across tabs. Everything that reaches a Virtual wire out with the name metervalues comes out of every Virtual wire in with the name metervalues.

Use them to keep larger flows readable, e.g. one tab per use case that all start from a virtual wire fed by the main Input/Output tab.

Virtual wire names are global in the whole Lab. If you duplicate a tab, rename its wires, otherwise messages are delivered twice.

Starts a flow when you click it in the designer – ideal for testing or for sending a one-off command.

Setting Description
Data type String (default), Integer, Float, Boolean, Date, Object, Base64 as Buffer.
Data The value to send. For Object, write a JavaScript object, e.g. { chargerId: 'DE*EXO*E0001', type: 'Soft' }.

Combined with an OCPP Encoder, a Trigger sends a command to a charger with one click (see Examples).


Component What it does
Delay Holds messages for the given milliseconds. Messages are released one after the other: 10 messages with a delay of 1000 ms take 10 seconds.
Timer Sends a fixed value every n seconds, starting one interval after saving. Select a data type explicitly.
Cron Sends a value on a schedule. One job per line: <cron expression> | <data>, e.g. 0 6 * * * | morning (every day at 06:00 in the selected time zone). @startup | init runs once after the Lab starts.
Unique in interval Passes a message only if its key (computed by a small piece of code) wasn’t seen in the given interval, e.g. forward only one StatusNotification per charger and status every 5 minutes.
Rate Limiter Releases one queued message per interval. Click to release all.

Component What it does
MQTT Broker Connection to your MQTT broker (host, port, TLS, username/password or client certificate). It has no wires; Publish and Subscribe select it in their settings. For TLS, set the port (usually 8883) yourself.
MQTT Publish Publishes the message to the configured Topic. Objects are sent as JSON. To choose the topic per message, send { topic: '…', data: … }. Messages are published with QoS 0.
MQTT Subscribe Receives messages from a topic (wildcards + and # allowed) and sends { topic, data }. JSON objects are parsed automatically.

Connect a storage first, then use the file components with it.

Component What it does
S3 Storage Connector S3-compatible storage (AWS S3 or others). Authenticates with an access key or, on AWS, by assuming a role in your account.
SFTP Storage Connector SFTP server, with password or private key. Every file operation opens its own connection.
WebDAV Storage Connector WebDAV server with basic authentication.
Write File Writes the incoming data to a file. Send { fileName, contentType, data } to choose the name per message. Existing files are overwritten.
Read File Reads a file and outputs it as text (or as a buffer with Output as Buffer, required for binary files).
List Files Lists the files below a prefix or directory.
Delete File Deletes a file.

Component What it does
Multi Switch Like Switch, but each condition has its own JSONPath.
Condition Two outputs: all conditions true / not. Prefer Switch for new flows.
Split Sends each element of an array as its own message.
Collect Collects messages into an array and sends it after n messages, after a time without new messages, or when its second input receives anything.
Pass A gate: messages pass only while all its enable inputs last received true. Starts closed.
Template Turns an object into text with a template, e.g. Charger @{model.chargerId} is @{model.status}.
Object to XML Converts an object to an XML string.
JSON Converter Converts between text and JSON objects.
Event Sends a message when the flow starts, is saved, or when variables change.
Console Outputs the Lab’s own log lines. Rarely needed.