Skip to main content

modpoll2mqtt — Modbus to MQTT Gateway

Release License checks tests Downloads

Documentation: yoch.github.io/modpoll2mqtt

modpoll2mqtt is a command-line Modbus-to-MQTT gateway. It polls Modbus devices (RTU, TCP, UDP) using CSV configuration files, publishes values to an MQTT broker, and accepts write commands by CSV reference name.

Install the PyPI package as modpoll2mqtt; the executable command remains modpoll.

Fork of modpoll, using the latest pymodbus release, with semantic MQTT writes by CSV reference name and numerous bugfixes and improvements.

Features

  • Modbus RTU, TCP, and UDP (CSV configuration files)
  • Local display of polled data (debug mode)
  • MQTT publishing of references (configurable topics)
  • MQTT writes by CSV reference name (modpoll/<device>/set)
  • Local CSV export of polled data
  • Bit-level access on registers and coils

Installation

Python 3.10+ required.

pip install modpoll2mqtt

Optional serial support (pyserial):

pip install 'modpoll2mqtt[serial]'

Upgrade:

pip install -U modpoll2mqtt

On Windows, pipx is recommended:

pipx install modpoll2mqtt

Quickstart

Single poll of a Modbus TCP device (replace the IP address with yours):

modpoll --once \
  --tcp 192.168.1.10 \
  --config examples/modsim.csv

Publish to an MQTT broker:

modpoll \
  --tcp 192.168.1.10 \
  --mqtt-host broker.emqx.io \
  --config examples/modsim.csv

Data is published to modpoll/<device_name>/data by default.

Add --mqtt-retain so the broker keeps the last data and diagnostics message per topic for new subscribers. The status topic modpoll/status is always retained. If a device goes offline, retained data values may still appear live until the next successful publish.

MQTT write by reference

Once connected to the broker, modpoll subscribes to modpoll/+/set. Publish to modpoll/<device>/set:

{
  "holding_reg01": 100,
  "coil01-08": [true, false, false, false, false, false, false, false]
}

Unknown reference names in the payload are skipped with a warning.

bool8 / bool16 references require a JSON array of 8 or 16 booleans at write time. Single-coil bool references accept a scalar boolean.

Example: an int16 reference with scale 0.1 accepts 21.5 as input; the raw register value 215 is written.

Only coil and holding_register references can be written. input_register and discrete_input are read-only at the Modbus protocol level even when marked rw in the CSV.

Migration from modpoll 1.6.x: the low-level format (object_type, address, value) is no longer supported.

Migration from modpoll2mqtt 2.0.x: the {"ref": "...", "value": ...} object format was removed in 2.1.0; use a reference map ({"ref_name": value}) instead.

Configuration pitfalls

  • On coil or discrete_input pollers, use bool with the absolute Modbus coil address for a single boolean.
  • bool8 / bool16: legacy grouped reads (group index, not a direct coil address).
  • On holding_register or input_register, use bool with address:bit (0–15), e.g. 40019:15,bool.
  • <endian> must be BE_BE, LE_BE, LE_LE, or BE_LE only.
  • --autoremove disables a poller after 3 consecutive Modbus failures.

Examples

# Modbus TCP
modpoll --tcp 192.168.1.10 --config examples/modsim.csv

# Modbus serial
modpoll --serial /dev/ttyUSB0 --serial-baud 9600 --config contrib/eniwise/scpms6.csv

# MQTT + CSV export
modpoll --tcp 192.168.1.10 --mqtt-host localhost --export data.csv --config examples/modsim.csv

# Multiple config files
modpoll --tcp 192.168.1.10 --config examples/modsim.csv examples/modsim2.csv

See examples/ and contrib/ for more device configurations.

Credits

This project builds on:

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

modpoll2mqtt-2.2.0.tar.gz (27.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

modpoll2mqtt-2.2.0-py3-none-any.whl (30.7 kB view details)

Uploaded Python 3

File details

Details for the file modpoll2mqtt-2.2.0.tar.gz.

File metadata

  • Download URL: modpoll2mqtt-2.2.0.tar.gz
  • Upload date:
  • Size: 27.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for modpoll2mqtt-2.2.0.tar.gz
Algorithm Hash digest
SHA256 3f52d16f62e6cc0fc97494b830653c9533f4398cb288daa282ecbcdf2f465e96
MD5 dff3c0626d3e0c7f582a7607dc571117
BLAKE2b-256 dec290ac4e8d78fc53ac0665f117aad7566f68253f66df944572d4392c1424c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for modpoll2mqtt-2.2.0.tar.gz:

Publisher: on-release-main.yml on yoch/modpoll2mqtt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file modpoll2mqtt-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: modpoll2mqtt-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 30.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for modpoll2mqtt-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 389283182cf0d08b2b09b46ee7aa3b4a3a5b3466e7357ff60496a1203f22ad18
MD5 e9ca4044e841eb398b6008dc9c368c4d
BLAKE2b-256 4b24854015559a45328cb2f341eaff1de4c1fb4eb29b36823ba9b524f507b509

See more details on using hashes here.

Provenance

The following attestation bundles were made for modpoll2mqtt-2.2.0-py3-none-any.whl:

Publisher: on-release-main.yml on yoch/modpoll2mqtt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page