Visual interface
Create workflows by dragging and arranging nodes in the visual editor.
Rule Engine
Filter, transform, and route MQTT messages to databases and cloud services with SQL rules or the visual Flow Designer.
SELECT
payload,
'overheat' AS alert,
'critical' AS severity
FROM
"factory/+/status"
WHERE
payload.temp > 45Core features
Use SQL, client events, built-in functions, schemas, and extensions to shape your MQTT data flows.
Filter, transform, and analyze incoming data streams with SQL.
Explore rule SQLSELECT
payload,
now_timestamp() as processed_at
FROM "sensor/+/data"
WHERE payload.temperature > 30Input
{"device_id": "sensor-042", "temperature": 35.2, "humidity": 68}Output
{"payload": {"device_id": "sensor-042", "temperature": 35.2, "humidity": 68}, "processed_at": 1768461629}Trigger processing when clients connect, disconnect, subscribe, or unsubscribe, and when messages are published or delivered.
Explore eventsclient.connectedclient.disconnectedsession.subscribedsession.unsubscribedmessage.publishmessage.deliveredmessage.ackedmessage.droppedParse JSON, convert values, and format strings with built-in SQL functions.
Explore functionsstrstr(100)returns'100'floatfloat('3.14e4')returns31400lowerlower('Hello')returns'hello'splitsplit('a;b;c', ';')returns['a', 'b', 'c']map_getmap_get("a", {"a": 1})returns1sha256sha256('hello')returns'2cf24dba...'Encode and decode Avro and Protobuf payloads, and validate JSON against schemas.
Explore schemasmessage SensorData {
string device_id = 1;
float temperature = 2;
float humidity = 3;
int64 timestamp = 4;
}Binary input
0a0a73656e736f722d30343215cdcc0c421d00008842JSON output
{
"device_id": "sensor-042",
"temperature": 35.2,
"humidity": 68.0,
"timestamp": 1705234567
}Extend data processing with custom logic through HTTP and gRPC.
Explore extensions// gRPC ExHook Server (Go)
func (s *HookProvider) OnMessagePublish(
ctx context.Context,
req *pb.MessagePublishRequest,
) (*pb.ValuedResponse, error) {
msg := req.Message
return &pb.ValuedResponse{}, nil
}Hooks: on_client_connect, on_client_authenticate,
on_message_publish, on_message_delivered...
Languages: Go, Python, Java, ErlangQuery and transform complex JSON payloads with the integrated jq tool.
Explore jqExpression
.payload | {
id: .device_id,
readings: [.temperature, .humidity],
status: (if .temperature > 35
then "alert" else "normal" end)
}Input
{"payload": {"device_id": "sensor-042", "temperature": 35.2, "humidity": 68}}Output
{
"id": "sensor-042",
"readings": [35.2, 68],
"status": "alert"
}Flow Designer
Arrange your data flow with drag-and-drop controls, then work with the same rules in SQL.
Example flow
Drag nodes to arrange your flow. Drag the canvas to pan, or use the zoom controls.
Create workflows by dragging and arranging nodes in the visual editor.
Switch between the visual editor and SQL while keeping rules in sync.
Connect to databases, message queues, and cloud services.
Test workflows with simulated or real data before deployment.
Benefits
Use built-in processing tools to reduce custom development and act on incoming data.
Filter, transform, and route MQTT messages with reusable SQL rules.
Run actions when messages or client events match your rules.
Use built-in functions and integrations to reduce custom development.
Process high message throughput across large numbers of device connections.
Related products
Resources
Documentation
Learn to create SQL rules, process MQTT messages, and route data with EMQX.
Documentation
Learn to manage schemas for encoding, decoding, and validating MQTT message payloads.
Documentation
Learn to build, edit, and test MQTT data flows with the visual Flow Designer.