Node Reference
QUBIQ ships 23 node types across eight categories. Each has its own page with the settings that matter, a worked example showing the message going in and the message coming out, and the mistakes that cost people an afternoon.
A pipeline message is an envelope: payload is the data, and the envelope also carries metadata
such as topic and the execution context. Nodes read and write payload unless stated otherwise.
When a node fails, the branch stops — unless you have said what should happen instead. Two features cover that, and they compose: the Catch node reports a failure out of band, and any node's error output carries its own failure down a branch of its own so the flow can carry on.
A machine-readable summary of every node and its exact default configuration is in the pipeline node reference.
Common
| Node | What it does | Reach for it when |
|---|---|---|
| Inject | Starts a flow on a schedule, or once at startup | Anything on a clock — hourly rollups, nightly exports, a poll every 30 seconds |
| Link | Sends messages between pipelines without joining their graphs | One expensive read feeding several independent consumers |
| RBE (Filter) | Passes a message only when the value actually changed | Immediately after any subscribe, unless you genuinely want every sample |
| Switch 1.0.0 | Sends a message down a different branch depending on its value | Sorting one feed into several treatments — critical alarms to a pager, the rest to a log |
| Timer 1.0.4 | Delays, debounces, or watches for silence — one timer per topic | Watching a heartbeat, so silence raises an alarm instead of passing unnoticed |
Realtime
| Node | What it does | Reach for it when |
|---|---|---|
| Industrial I/O | Reads, writes or subscribes to namespace tags | Reading several tags at once on a schedule, behind an Inject |
| Alarm | Subscribes to alarm lifecycle events | Notifying someone when a critical alarm is raised |
Datasource
| Node | What it does | Reach for it when |
|---|---|---|
| SQL Query | Runs SQL against a database connection | Writing production, downtime or quality records to a reporting database |
| MongoDB | Find, insert, update or delete documents | Storing records whose fields differ from one to the next |
| QuestDB | High-speed time-series ingestion, or a SQL query | Storing a calculated value you want to chart over time |
Transform
| Node | What it does | Reach for it when |
|---|---|---|
| Python Script | Arbitrary Python, sandboxed | Computing something from several inputs — a rate, an average, an OEE figure |
| Batch Transform | Transforms every item of a collection, in parallel | Converting units, renaming fields or enriching every row of a result set |
| Array Iterator | Splits an array into one message per element | One outbound API call, or one write, per row of a result set |
| Join | Collects items or messages back into a single array | Recombining after an Array Iterator so a downstream step can act on the whole set |
AI
| Node | What it does | Reach for it when |
|---|---|---|
| AI | Classifies, extracts or summarises with AI | Classifying free-text operator comments into a reportable column |
Notification
| Node | What it does | Reach for it when |
|---|---|---|
| Send Email | Sends an email through a saved SMTP connection | Alarm notification and escalation |
| Telegram | Sends messages, or receives commands, via a bot | Notifying a shift group where people actually look |
| Sends WhatsApp messages, or receives them by webhook | Escalation to people who will not read email out of hours | |
| On-Call Roster | Resolves who is on shift into recipients | Any notification that should reach whoever is on duty rather than a fixed list |
API
| Node | What it does | Reach for it when |
|---|---|---|
| REST API | Publishes an HTTP endpoint, or calls one | Accepting orders, recipes or schedules pushed by an ERP or MES |
| HTTP Response | Sends the reply for a REST ingress pipeline | Every path through an ingress pipeline — success and failure alike |
Output
| Node | What it does | Reach for it when |
|---|---|---|
| Debug | Shows a node’s output in the Debug panel | While building anything — it is the fastest way to see a real payload |
| Catch 1.0.4 | Reports failures from other nodes in the same pipeline | Telling somebody a pipeline broke — a Telegram message, an email, a page |
Patterns
Scheduled aggregation
Inject (cron 5 * * * *) → SQL (current work order) → Industrial I/O (read)
→ Python (compute OEE) → QuestDB (ingress)
Event-driven notification, to whoever is on shift
Alarm (raised, critical) → On-Call Roster → Send Email
Inbound integration
REST API (ingress POST /api/v1/orders) → Python (validate) → MongoDB (insert) → HTTP Response (201)
Noise-suppressed bridge
Industrial I/O (subscribe) → RBE (gap 0.5) → QuestDB (ingress)
Fan-out with recombination
SQL (select rows) → Array Iterator → Python (enrich) → Join → REST API (egress, one batch)
Free text into a reportable column
Inject (15m) → SQL (uncategorised comments) → Array Iterator
→ AI (classify) → SQL (update category)
Routing one feed into several treatments
┌─ 1 → Alarm (raise) → On-Call Roster → Send Email
Industrial I/O → Switch ┼─ 2 → QuestDB (ingress)
└─ 3 → Debug
Silence as an event
Industrial I/O (subscribe Pumps/*) → Timer (watch for silence, 30s) → Alarm (raise)
Recovering from a failure in-flow
┌─ out → compute → write-db
Inject → fetch ──┤
└─ error → Python (last known value) → compute → write-db
Reporting every failure in a pipeline
Catch (all nodes) → Python (shape a row) → SQL (dead-letter table)
Two-way chat
Telegram (receive /data) → Python (validate args) → SQL (query) → Telegram (send → chatId)