This is my custom aiomodbus client
Project description
DM-aiomodbus
Asynchronous Modbus clients for Python with TCP and Serial connection support.
Links
| Section | Description |
|---|---|
| Installation | How to install the package |
| Usage | How to use the package |
| Types | Types and classes used in the package |
| Inner Client Methods | List of methods available for inner client |
Installation
Check if you have Python 3.8 or higher installed:
python3 --version
Install the package using pip:
pip install dm-aiomodbus
Usage
Windows Setup
import asyncio
import sys
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
Code Example
import asyncio
from dm_aiomodbus import (
DMAioModbusSerialClient, DMAioModbusSerialClientConfig,
DMAioModbusTcpClient, DMAioModbusTcpClientConfig,
DMAioModbusInnerClient
)
async def main():
# Initialize Serial client
serial_modbus_client = DMAioModbusSerialClient(
config=DMAioModbusSerialClientConfig(
port="/dev/ttyUSB0",
baudrate=9600, # default value
bytesize=8, # default value
stopbits=2, # default value
parity="N", # default value
disconnect_timeout_s=20, # default value
operation_timeout_ms=100, # default value
error_logging=False # default value
)
)
# Initialize TCP client
tcp_modbus_client = DMAioModbusTcpClient(
config=DMAioModbusTcpClientConfig(
host="192.168.1.5",
port=502, # default value
disconnect_timeout_s=20, # default value
operation_timeout_ms=100, # default value
error_logging=False # default value
)
)
# Read/write register(s)
async def callback(client: DMAioModbusInnerClient):
await client.write_register(256, 1)
result = await client.read_holding_registers(256, count=3)
print(result)
# Execute callback
await serial_modbus_client.execute(callback)
# or
await tcp_modbus_client.execute(callback)
if __name__ == "__main__":
asyncio.run(main())
Note: All read/write methods should be called inside your callback function
Types
Serial Client Config
class DMAioModbusSerialClientConfig:
port: str # Serial port name. Example: "/dev/ttyS0" - Linux UART, "/dev/ttyUSB0" - linux USB, "COM1" - Windows USB
baudrate: int = 9600 # Baudrate in bits per second
bytesize: Literal[7, 8] = 8 # Number of data bits
stopbits: Literal[1, 2] = 2 # Number of stop bits
parity: Literal["N", "E", "O"] = "N" # Parity mode. N - None, E - Even, O - Odd
disconnect_timeout_s: int = 20 # Disconnect timeout in seconds
operation_timeout_ms: int = 100 # Not recommended to set it lower than 100ms
error_logging: bool = False # Enable error logging
TCP Client Config
class DMAioModbusTcpClientConfig:
host: str # IP address of the device
port: int = 502 # Port number
disconnect_timeout_s: int = 20 # Disconnect timeout in seconds
operation_timeout_ms: int = 100 # For remote TCP connections, it is recommended to set 200 or higher
error_logging: bool = False # Enable error logging
Read Response
class DMAioModbusReadResponse:
data: list[int] # List of values read from device
error: str # Error message if operation failed
Note: This class has to_dict() method that returns a dictionary
Warning: If the operation failed, the data field will be an empty list
Write Response
class DMAioModbusWriteResponse:
status: bool # Boolean indicating success or failure
error: str # Error message if operation failed
Note: This class has to_dict() method that returns a dictionary
Warning: The status is considered True, if the operation did not result in an error.
Inner Client Methods
| Method | Arguments | Response Type |
|---|---|---|
read_coils |
- address int- count int = 1- slave int= 1 |
ReadResponse |
read_discrete_inputs |
- address int- count int = 1- slave int= 1 |
ReadResponse |
read_holding_registers |
- address int- count int = 1- slave int= 1 |
ReadResponse |
read_input_registers |
- address int- count int = 1- slave int= 1 |
ReadResponse |
write_coil |
- address int- value int- slave int = 1 |
WriteResponse |
write_register |
- address int- value int- slave int = 1 |
WriteResponse |
write_coils |
- address int- values list[int] | int- slave int= 1 |
WriteResponse |
write_registers |
- address int- values list[int] | int- slave int= 1 |
WriteResponse |
Parameters Description
address: Register address (single integer)count: Number of items to read (default: 1)value/values: Value(s) to write (single integer or list of integers)slave: Slave unit address (default: 1)
Set custom logger parameters
from dm_aiomodbus import DMAioModbusSerialClient
from dm_logger import FormatterConfig
# set up custom logger for all clients
DMAioModbusSerialClient.set_logger_params(
{
"name": "my_name",
"formatter_config": FormatterConfig(
show_datetime=False,
)
}
)
See more about DMLogger here
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dm_aiomodbus-0.3.9.tar.gz.
File metadata
- Download URL: dm_aiomodbus-0.3.9.tar.gz
- Upload date:
- Size: 7.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c4e83ecdfc26c708e7ffbe45b54478270f730999150999e3e7f132751e149fc
|
|
| MD5 |
fa852092c100941f26eead127b1bfe90
|
|
| BLAKE2b-256 |
2d45f3223bf9924804abc49f603b2db91c35a1cc6ef1cc47eb56410f270ae09e
|
File details
Details for the file dm_aiomodbus-0.3.9-py3-none-any.whl.
File metadata
- Download URL: dm_aiomodbus-0.3.9-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1741a347226080e49d74bd8cc101136062012783e55ea7967254241044f97ae9
|
|
| MD5 |
e98171dd6caf3e277473ec3a13f64f16
|
|
| BLAKE2b-256 |
1e7f2d43bec27027847d8eaebbd4621a4520e7d6a9c08849389cbd3a11a235ab
|