modbus-mqtt
v2.0.0
Published
This module bridges Modbus and MQTT in both directions. It publishes Modbus read/write results to MQTT and accepts MQTT commands that write to Modbus devices.
Maintainers
Readme
Modbus-Mqtt
This module bridges Modbus and MQTT in both directions. It publishes Modbus read/write results to MQTT and accepts MQTT commands that write to Modbus devices.
Supported Modbus Functions
Modbus-to-MQTT topic structure
modbus-iot/{modbusId}/{functionName}
Example; modbus-iot/12/readInputRegisters
MQTT-to-Modbus write commands
Publish a JSON command to the following topic:
modbus-iot/{modbusId}/command/{functionName}Supported write functions are writeCoil, writeRegister, writeCoils, and writeRegisters. The payload must contain an integer addr (or address) and value (or values).
# Write one coil
mosquitto_pub -t modbus-iot/1/command/writeCoil -m '{"addr":0,"value":true}'
# Write one holding register
mosquitto_pub -t modbus-iot/1/command/writeRegister -m '{"addr":10,"value":123}'
# Write multiple holding registers
mosquitto_pub -t modbus-iot/1/command/writeRegisters -m '{"addr":20,"values":[10,20,30]}'Each command publishes a result to modbus-iot/{modbusId}/command/{functionName}/result. Successful commands include addr and value; failures also include err. Modbus write results are additionally published to the existing modbus-iot/{modbusId}/{functionName} topic.
Tests
npm test starts local in-memory MQTT and Modbus TCP devices to verify both directions:
- Modbus holding-register read → MQTT message
- MQTT
writeRegistercommand → Modbus holding-register update
Example
Modbus to MQTT
const ModbusMqtt = require('./index')
const options = {
mqttOptions: {
brokerUrl: 'mqtt://broker.mqttdashboard.com'
},
modbusOptions: {
type: 'TCP',
tcp: {
ip: '127.0.0.1',
port: 802
},
id: 1
}
}
const modbusMqtt = new ModbusMqtt(options)
modbusMqtt.on('modbus-connect', () => {
setInterval(() => {
modbusMqtt.modbusClient.readInputRegisters(0, 10, (err, response) => {
if (err) return console.log('Err ', err.message)
console.log('READ INPUT REGISTERS ', response)
})
}, 1000)
setInterval(() => {
modbusMqtt.modbusClient.readInputRegisters(20, 10)
}, 2000)
})MQTT to Modbus
With the bridge running, use any MQTT client to publish a command. This Node.js example writes holding register 10 with the value 123 and prints the result:
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.mqttdashboard.com')
const commandTopic = 'modbus-iot/1/command/writeRegister'
const resultTopic = `${commandTopic}/result`
client.on('connect', () => {
client.subscribe(resultTopic, err => {
if (err) throw err
client.publish(commandTopic, JSON.stringify({ addr: 10, value: 123 }))
})
})
client.on('message', (topic, message) => {
if (topic !== resultTopic) return
console.log('Modbus write result:', JSON.parse(message.toString()))
client.end()
})Output:
{"addr":10,"value":123}The bridge also publishes the Modbus write response to modbus-iot/1/writeRegister.

