Appearance
Communication Nodes
Last updated
Communication nodes send data to other systems. There is no SMS node — use an alarm pipeline for SMS.
Send Email
| Field | Default | Notes |
|---|---|---|
| To | — | One address, or several separated by commas. Accepts {{var}} |
| Subject | Scada.Ink Alert | Accepts {{var}} |
| Body (or {{var}}) | — | Plain text, several lines allowed. Accepts {{var}}: Oven 3 temperature {{value}} °C at {{time}} |
This node sends through the same mail path as alarm and report email, so it behaves identically (see Email (SMTP) Settings):
- With an SMTP Host in System Settings, it relays through that server, with the same TLS, login and reply checking. The sender is From Address, shown under your Site Name.
- With no SMTP Host, it falls back to the Scada.Ink relay, which needs internet access and is capped at 25 messages a day.
- A refused login, recipient or message fails the node with the server's reply, for example Login rejected by SMTP server: 535 …. A server that doesn't answer within 20 s fails with SMTP timeout; a relay that doesn't answer within 20 s fails with Relay timeout.
- On an appliance with neither SMTP nor internet, the node fails at once with Neither SMTP nor Resend API is configured — cannot send email. Nothing is queued or retried.
- The body is sent as HTML with your line breaks kept. A list or object wired into the Body dot is sent as formatted JSON.
- The Step Log line records which path carried it:
"via":"smtp"or"via":"relay".
Where network nodes may connect
Call URL, Send TCP, Send UDP and Check Network follow two rules:
- They can't reach local services on the appliance itself (InfluxDB, the drivers, other local ports). The one exception is the appliance's own API, over HTTP. The node fails with Workflow network nodes can't reach local services on the appliance (…).
- A workflow started by a script (
workflows.run, or a message the script sent on this appliance), and any workflow it runs or messages in turn, gets that script's Internet and Plant network switches. If the script may not reach the internet, neither may the workflow; see Script Sandbox, Limits & Errors. A workflow started any other way isn't limited by script switches.
Call URL
| Field | Default | Notes |
|---|---|---|
| URL | — | Accepts {{var}}, e.g. http://10.20.1.15:8080/api/line/{{line}}/state |
| Method | GET | GET, POST, PUT, DELETE |
| Headers (JSON) | {} | A JSON object of header names and values. Values accept {{var}} |
| Body (or {{var}}) | — | Text or JSON, sent exactly as typed after {{var}} replacement. Not sent with GET |
| Response variable | response | The reply: parsed JSON if the server says it is JSON, otherwise text |
- Timeout 10 s. A timeout or unreachable host fails the run.
- A reply with status 200–299 continues from Out; any other status continues from Error (the reply is still stored).
- When there is a body and you haven't set a
Content-Typeheader, one is added:application/jsonif the body is valid JSON (or a list/object wired into the Body dot, which is JSON-encoded once), otherwisetext/plain; charset=utf-8.
| What you type | What is sent |
|---|---|
Body {"line": {{line}}, "state": "running"} | {"line": 2, "state": "running"}, as JSON |
Body Line {{line}} running | Line 2 running, as plain text |
Headers {"X-Api-Key": "abc", "X-Line": "{{line}}"} | Headers X-Api-Key: abc and X-Line: 2 |
| Headers that aren't valid JSON, or a JSON value that isn't an object | Nothing — the run fails with Headers are not valid JSON or Headers must be a JSON object |
{{variables}} are replaced as plain text, so quote text values inside a JSON body yourself ("{{state}}") and leave numbers unquoted. For anything that needs more — building a body from a list, or authentication beyond a fixed header — call the service from a script with http.post and start the script with Run Script. See Script API Reference.
On an appliance without internet, Call URL can only reach addresses on the plant network.
MQTT Publish
| Field | Default | Notes |
|---|---|---|
| MQTT Device | — | A device using the MQTT driver |
| Topic | — | Accepts {{var}}, e.g. plant/line1/oven3/alarm |
| Payload (or {{var}}) | — | Text. For JSON, type it in full: {"temp": {{value}}} (this is a normal text field, so variables are replaced) |
Publishes through that device's broker connection. The device must have write access enabled, or the run fails with Write not enabled for MQTT device 4; a device that is not an MQTT device fails with MQTT device 4 not found. See Open Standards.
Send TCP
| Field | Default |
|---|---|
| Host | — |
| Port | 502 |
| Message (or {{var}}) | — |
Opens a connection, sends the message as text and closes the connection. It does not read a reply and sets no variable. Fails with TCP timeout after 5 s or on a refused connection.
Escape sequences are not translated: typing TRG\r\n sends the characters backslash, r, backslash, n. Devices that need a CR/LF terminator (many vision sensors and barcode readers) will not see one. Send those commands from a script instead.
Send UDP
| Field | Default |
|---|---|
| Host | — |
| Port | 9000 |
| Message (or {{var}}) | — |
Sends one datagram as text. UDP gives no delivery confirmation; the step completes as soon as the packet leaves. The same escape-sequence limit applies.
Check Network
| Field | Default |
|---|---|
| Check URL | http://1.1.1.1 |
Sends an HTTP HEAD request with a 3 s timeout. Any response below 500 counts as reachable. Continues from Connected or Disconnected and stores networkConnected (true/false). Use an address on the plant network on an air-gapped appliance.
Send Message
The workflow version of a script's messages.send and messages.sendRequest. It reaches Message Handler scripts and workflows with a Message Received trigger.
| Field | Default | Notes |
|---|---|---|
| Message Name | — | Accepts {{var}}. To a paired appliance: 1–128 letters, digits and _ . : / - |
| Payload (JSON or {{var}}) | {} | A JSON object, with {{variables}} where you need them: {"lot": {{lot}}, "line": "{{line}}"}. Exactly {{name}} sends that variable as it is, so it must hold an object. A value wired into the Payload dot is used instead |
| Paired Appliance | blank | Blank sends on this appliance. Otherwise the name or node ID of a paired appliance; administrators can pick from a list |
| Wait for reply | off | Off: send, and count who received it. On: ask, and wait for one answer |
| Reply variable | reply | With Wait for reply: where the answer is stored |
| Fail if nobody receives it | off | Without Wait for reply: no listener is an error instead of 0 recipients |
| Timeout (ms) | 10000 | How long to wait for a paired appliance to confirm a send, or for any answer. 100 ms to 60 s |
What it does:
- Send (Wait for reply off) hands the message to every listening script and workflow and continues from Out with
recipients, how many it reached. It does not wait for them to run. A workflow that is still running skips it and isn't counted. To a paired appliance, the count is that appliance's. - Wait for reply continues from Out once the answer arrives, with the answer in the Reply variable and on the Reply dot. The answer comes from the first listening script, or, when no script listens, the first listening workflow's Reply node.
- Every failure continues from Error, with the message in
error, when something is wired to Error. When nothing is, the run fails with that message.
| Problem | What happens |
|---|---|
| No listener, without Fail if nobody receives it | Out, recipients 0 |
| No listener, with it, or while waiting for a reply | Error: Message "…" not delivered: no enabled script or workflow listens for it. (or names the disabled recipient) |
| Payload not an object, not JSON, or over 64 KB | Error: Send Message: the payload must be an object, like { lot: 42 }, … is not valid JSON, or … is larger than 64 KB |
| Paired appliance with mesh networking off on this appliance | Error: Send Message: sending to a paired appliance needs mesh networking, which is not enabled on this appliance. An admin turns it on in Settings → Feature Toggles. |
| Paired appliance unknown, offline or too slow, on a send | Out, recipients 0, with a warning in the step log (as messages.send gives 0). With Fail if nobody receives it: Error |
| Paired appliance unknown, offline or too slow, waiting for a reply | Error: No paired appliance "…", Paired appliance "…" is not connected., "…" did not answer within 10 s. |
| The answering script or workflow fails | Error: Message "…" handler failed: … |
| Sixth message in a chain | Error: Message "…" not sent: it would be message 6 in a chain of messages that start each other (limit 5) … |
On a paired appliance, the receiving run's History names this workflow as the sender (sent by workflow "…"). A workflow started by a script passes that script's Internet and Plant network switches on to any workflow its messages start on this appliance.
Reply
| Field | Default | Notes |
|---|---|---|
| Reply (JSON or {{var}}) | {} | The answer: any JSON value ({"good": {{good}}}, 42, "OK"). Exactly {{name}} sends that variable as it is. Text that isn't JSON is sent as text. A value wired into the Value dot is used instead. At most 64 KB |
Answers the request that started this run — a script's messages.sendRequest or a Send Message waiting for a reply, here or on a paired appliance. The asker gets the answer straight away; this run carries on from Out to the end. Only the first Reply a run reaches is sent; a later one is noted in the step log and ignored. In a run nothing is waiting on (a plain send, Run Now, a schedule) it does nothing but note that.