Registers in.
One envelope out.
Conflux speaks Modbus, BACnet, OPC UA, SNMP and MQTT, normalizes every reading into one canonical JSON envelope, and forwards it northbound — so your apps never deal with registers, object models or byte orders again.
MIT licensed · single binary · runs offline on the plant network
Five ways to say “6.9 °C”. One way to read it.
A Modbus holding register, a BACnet object instance, an OPC UA NodeId, an SNMP OID and an MQTT payload all address the same thing differently. Conflux resolves the address, applies the scale, and publishes the same envelope every time.
Southbound · as the device addresses it
10.4.1.22:502unit 1 · holding 40001int16, scale ÷10Northbound · one envelope, every time
{
"src": {
"proto": "modbus-tcp",
"conn": "plant-a",
"dev": "meter-3",
"addr": "holding:40001"
},
"v": 6.9,
"raw": 69,
"u": "°C",
"ts": 1789345000,
"q": 0
}Live points · normalized every tile below is the same envelope
One node between the plant and everything else
Southbound polling and subscriptions in; a single normalized stream out to whatever consumes it.
Built for the edge, not the datacenter
Everything a gateway on a flaky plant uplink actually needs — and nothing it doesn't.
One Go binary
Pure-Go, no cgo. Cross-compile for arm64 and drop it on the gateway — no runtime, no libc.
Plugin drivers
Every protocol is one small Go interface. Adding one changes nothing else in the system.
Auto-discovery onboarding
It finds devices and asks each what it exposes — no transcribing 200 registers from a PDF.
No-code rules
Thresholds, schedules, alerts, notify and write-back — composed from dropdowns, evaluated on every reading.
Encrypted & audited
Credentials encrypted at rest, never returned by the API. Every change lands in an append-only audit log.
Store-and-forward
A dead broker never loses data. Readings buffer to disk, bounded, and replay in order when the path heals.
Speaks the protocols your plant already runs
Southbound in, canonical envelope out. Write and device-discovery where the protocol allows.
| Protocol | Address looks like | Read | Write | Discover |
|---|---|---|---|---|
| Modbus TCP | holding:40001 | yes | yes | yes |
| Modbus RTU | input:30012 | yes | yes | yes |
| BACnet/IP | analog-input:12 | yes | yes | yes |
| OPC UA | ns=2;s=Motor.Speed | yes | yes | yes |
| SNMP v1/v2c/v3 | 1.3.6.1.2.1.2.2.1.10 | yes | yes | — |
| MQTT (subscribe) | plant/a/ahu2/co2 | yes | yes | — |
| SIA DC-09 (alarms) | event stream | yes | — | — |
| M-Busroadmap | — | — | — | — |
| KNXroadmap | — | — | — | — |
Three stages, no middleware
Connect
Point Conflux at a device. It scans, asks what values exist, and lists them with live readings to tick.
Normalize
Every reading becomes one self-describing envelope: source, value, unit, timestamp and a quality code.
Forward
Publish northbound over MQTT, webhook or Kafka. Downstream owns the meaning — Conflux owns clean data.
Stop writing protocol glue.
Onboard your first device in a minute. It finds them, asks what they expose, and creates everything.