Skip to main content

A New Command-line Tool for Modbus and MQTT

Project description

Modpoll - A New Command-line Tool for Modbus and MQTT

Release Build status License Downloads

📢 Announcement: Since the release of v1.3.0, our official dockerhub namespace has been changed to topmaker, you can pull the latest images from topmaker/modpoll at dockerhub.

Learn more about modpoll usage at documentation site.

Motivation

The idea for creating this tool originated from my need to efficiently check new devices during site surveys. These surveys are often time-constrained and space-limited, with on-site work adding to the pressure. In such situations, a portable Swiss Army knife toolkit becomes a valuable companion.

This tool can be easily deployed on a Raspberry Pi or similar embedded devices, polling data from a Modbus network or connected devices. Users can choose to log the data locally or publish it to an MQTT broker for further troubleshooting.

The MQTT broker can be set up either on the same Raspberry Pi or in the cloud. Once data is successfully published, users can subscribe to the relevant MQTT topics and conveniently view the data on their smartphones.

Moreover, you can also run this tool continuously on a server as a Modbus-MQTT gateway, i.e. polling from local Modbus devices and forwarding data to a centralized cloud service.

In fact, modpoll helps to bridge between the traditional field-bus world and the new IoT world.

💡 Tips: This tool is designed to be a standalone executable application, which works out-of-the-box on Linux/macOS/Windows. If you are looking for a Modbus python library, please consider the following great open-source projects, pymodbus or minimalmodbus

Feature

  • Support Modbus RTU/TCP/UDP devices
  • Show polling data for local debugging, like a typical modpoll tool
  • Publish polling data to MQTT broker for remote debugging, especially on smart phone
  • Export polling data to local storage for further investigation
  • Provide docker solution for continuous data polling use case

Installation

This tool tested on Python 3.8+, the package is available in the Python Package Index, users can easily install it using pip or pipx.

Using PIP

Install modpoll using the following command,

pip install modpoll

Optionally, pyserial library can be installed for Modbus-RTU communication,

pip install 'modpoll[serial]'

Upgrade the tool via the following command,

pip install -U modpoll

On Windows

It is recommended to use pipx for installing modpoll on Windows, refer to here for more information about pipx.

Once pipx installed, you can run the following command in a Command Prompt terminal.

pipx install modpoll

Upgrade the tool via the following command,

pipx upgrade modpoll

Quickstart

modpoll is a python tool for communicating with Modbus devices, so ideally it makes more sense if you have a real Modbus device on hand for the following test, but it is OK if you don't, we provide a virtual Modbus TCP device deployed at modsim.topmaker.net:502 for your quick testing purpose.

Let's start exploring modpoll with modsim device, run the following command to get a first glimpse,

modpoll --once \
  --tcp modsim.topmaker.net \
  --config https://raw.githubusercontent.com/gavinying/modpoll/master/examples/modsim.csv

the modsim code is also available here

Prepare Modbus configure file

The reason we can magically poll data from the online device modsim is because we have already provided the Modbus configure file for modsim device as following,

device,modsim01,1,,
poll,coil,0,16,BE_BE
ref,coil01-08,0,bool8,rw
ref,coil09-16,1,bool8,rw
poll,discrete_input,10000,16,BE_BE
ref,di01-08,10000,bool8,rw
ref,di09-16,10001,bool8,rw
poll,input_register,30000,20,BE_BE
ref,input_reg01,30000,uint16,rw
ref,input_reg02,30001,uint16,rw
ref,input_reg03,30002,uint16,rw
ref,input_reg04,30003,uint16,rw
ref,input_reg05,30004,int16,rw
ref,input_reg06,30005,int16,rw
ref,input_reg07,30006,int16,rw
ref,input_reg08,30007,int16,rw
ref,input_reg09,30008,uint32,rw
ref,input_reg10,30010,uint32,rw
ref,input_reg11,30012,int32,rw
ref,input_reg12,30014,int32,rw
ref,input_reg13,30016,float32,rw
ref,input_reg14,30018,float32,rw
poll,holding_register,40000,20,BE_BE
ref,holding_reg01,40000,uint16,rw
ref,holding_reg02,40001,uint16,rw
ref,holding_reg03,40002,uint16,rw
ref,holding_reg04,40003,uint16,rw
ref,holding_reg05,40004,int16,rw
ref,holding_reg06,40005,int16,rw
ref,holding_reg07,40006,int16,rw
ref,holding_reg08,40007,int16,rw
ref,holding_reg09,40008,uint32,rw
ref,holding_reg10,40010,uint32,rw
ref,holding_reg11,40012,int32,rw
ref,holding_reg12,40014,int32,rw
ref,holding_reg13,40016,float32,rw
ref,holding_reg14,40018,float32,rw

This configuration tells modpoll to do the following for each poll,

  • Read 16 coils from the address starting from 0 and parse the response as two 8-bits boolean values;
  • Read 16 discrete inputs from the address starting from 10000 and parse the response as two 8-bits boolean values;
  • Read 20 input registers from the address starting from 30000 and parse data accordingly;
  • Read 20 holding registers from the address starting from 40000 and parse data accordingly;

In practical, you usually need to customize a Modbus configuration file for your own device before running modpoll tool, which defines the optimal polling patterns and register mappings according to device vendor's documents.

You can also take a look at contrib folder, which collects a few types of device configuration shared by contributors.

The configuration can be either a local file or a remote public URL resource.

Refer to the documentation site for more details.

Poll local device (modsim)

If you are blocked by company firewall for online device or prefer a local test, you can launch your own device simulator by running modsim locally,

docker run --rm -p 5020:5020 topmaker/modsim

It will create a virtual Modbus TCP device running at localhost:5020, and you can open a new terminal, poll the virtual device using modpoll tool,

modpoll \
  --tcp localhost \
  --tcp-port 5020 \
  --config https://raw.githubusercontent.com/gavinying/modpoll/master/examples/modsim.csv

Use sudo before the docker command if you want to use the standard port 502.

sudo docker run --rm -p 502:5020 topmaker/modsim

In a new terminal,

modpoll \
  --tcp localhost \
  --config https://raw.githubusercontent.com/gavinying/modpoll/master/examples/modsim.csv

Publish data to MQTT broker

This is a useful function of this new modpoll tool, which provides a simple way to publish collected Modbus data to MQTT broker, so users can view data from a smart phone via a MQTT client.

The following example uses a public MQTT broker mqtt.eclipseprojects.io for test purpose. You can also set up your own MQTT broker locally using mosquitto.

modpoll \
  --tcp modsim.topmaker.net \
  --mqtt-host mqtt.eclipseprojects.io \
  --config https://raw.githubusercontent.com/gavinying/modpoll/master/examples/modsim.csv

With successful data polling and publishing, you can subscribe the default data topic modpoll/modsim01/data on the same MQTT broker mqtt.eclipseprojects.io to view the collected data.

The MQTT topics can be customized by providing the following arguments,

  • mqtt-publish-topic-pattern
  • mqtt-subscribe-topic-pattern
  • mqtt-diagnostics-topic-pattern

See document for details.

⚠️ Note: The old --mqtt-topic-prefix argument is now deprecated and will be removed in the future release. Suggest to use --mqtt-xxx-topic-pattern in new project. If both are used, --mqtt-topic-prefix argument will take precedence in order to keep backward compatibility until it is removed.

Write registers via MQTT publish

The modpoll tool will subscribe to the topic modpoll/{{device_name}}/set by default once it successfully connected to MQTT broker, user can write device register(s) via MQTT publish,

  • To write a single holding register (address at 40001)

    {
      "object_type": "holding_register",
      "address": 40001,
      "value": 12
    }
    
  • To write multiple holding registers (address starting from 40001)

    {
      "object_type": "holding_register",
      "address": 40001,
      "value": [12, 13, 14, 15]
    }
    

Run with docker

A docker image has been provided for user to directly run the tool without local installation,

docker run --rm topmaker/modpoll

It shows the version of the tool by default.

Similar to the above modsim test, we can poll data with docker run, in order to avoid printing out received data, the argument --daemon or -d is recommended to use with docker.

docker run --rm topmaker/modpoll \
  modpoll -d \
    --tcp modsim.topmaker.net \
    --config https://raw.githubusercontent.com/gavinying/modpoll/master/examples/modsim.csv

If you want to load a local configure file, you need to mount a local folder onto container volume, for example, if the child folder examples contains the config file modsim.csv, we can use it via the following command,

docker run --rm -v $(pwd)/examples:/app/examples topmaker/modpoll \
  modpoll -d \
    --tcp modsim.topmaker.net \
    --config /app/examples/modsim.csv

Example Use Cases

  • Connect to Modbus TCP device

    modpoll \
      --tcp 192.168.1.10 \
      --config examples/modsim.csv
    
  • Connect to Modbus RTU device

    modpoll \
      --rtu /dev/ttyUSB0 \
      --rtu-baud 9600 \
      --config contrib/eniwise/scpms6.csv
    
  • Connect to Modbus TCP device and publish data to MQTT broker

    modpoll \
      --tcp modsim.topmaker.net \
      --mqtt-host mqtt.eclipseprojects.io \
      --config examples/modsim.csv
    
  • Connect to Modbus TCP device and export data to local csv file

    modpoll \
      --tcp modsim.topmaker.net \
      --export data.csv \
      --config examples/modsim.csv
    
  • Connect to Modbus TCP devices using multiple config files

    modpoll \
      --tcp modsim.topmaker.net \
      --config examples/modsim.csv examples/modsim2.csv
    

Refer to the documentation site for more details about the configuration and examples.

If you find this tool useful, please support us by starring 🌟 our repository to encourage further improvements.

Credits

The implementation of this project is heavily inspired by the following two projects:

Thanks to Max Brueggemann and Oliver Wagner for their great work.

License

MIT © 2021-2024, Ying Shaodong

Project details


Download files

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

Source Distribution

modpoll-1.4.0.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

modpoll-1.4.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file modpoll-1.4.0.tar.gz.

File metadata

  • Download URL: modpoll-1.4.0.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure

File hashes

Hashes for modpoll-1.4.0.tar.gz
Algorithm Hash digest
SHA256 9671b963c0597c9204099db28636317ff3a11fae2ad89edf7bc0c023866d81d4
MD5 6ae3bb6d256f95056a54c53634764c40
BLAKE2b-256 ed1e695242c3578c990ee032fd923e625467282cd777c0a43f1dbf0e73418de4

See more details on using hashes here.

File details

Details for the file modpoll-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: modpoll-1.4.0-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure

File hashes

Hashes for modpoll-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ab565310ad597021f8eda68cf3d2aec6518db2769518130af2df8024813746d1
MD5 0cd818d5420f38af3e1f01b642706d43
BLAKE2b-256 835ad5cdb703a18b4e9a1eb35dcd6798a55b56bd1d9f8e8b3388bc70c717b5fa

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page