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!
🔌 – Exolink Connect
Section titled “🔌 – Exolink Connect”Exolink Connect - Input
Section titled “Exolink Connect - Input”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.
Exolink Connect - Output
Section titled “Exolink Connect - Output”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.
🐞 – Debugging
Section titled “🐞 – Debugging”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.
Comment
Section titled “Comment”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.
🧠 – Logic
Section titled “🧠 – Logic”OCPP Action Switch
Section titled “OCPP Action Switch”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
actionfield 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 onmsgTypeafter 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.
Switch
Section titled “Switch”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.
📡 – OCPP
Section titled “📡 – OCPP”OCPP Encoder/Decoder
Section titled “OCPP Encoder/Decoder”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.
🌐 – HTTP
Section titled “🌐 – HTTP”HTTP Route
Section titled “HTTP Route”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.
HTTP Response
Section titled “HTTP Response”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.
HTTP Request
Section titled “HTTP 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.
🧷 – Structuring flows
Section titled “🧷 – Structuring flows”Virtual wire in / Virtual wire out
Section titled “Virtual wire in / Virtual wire out”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.
Trigger
Section titled “Trigger”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).
⏱ – Time
Section titled “⏱ – Time”| 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. |
📨 – MQTT
Section titled “📨 – MQTT”| 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. |
🗂 – Storage
Section titled “🗂 – Storage”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. |
📦 – Other components
Section titled “📦 – Other components”| 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. |