| Crates.io | R413D08 |
| lib.rs | R413D08 |
| version | 0.3.1 |
| created_at | 2025-04-29 06:50:25.604491+00 |
| updated_at | 2025-08-28 18:51:03.604022+00 |
| description | R413D08 protocol and commandline tool |
| homepage | |
| repository | https://github.com/acpiccolo/R413D08-Controller |
| max_upload_size | |
| id | 1653208 |
| size | 1,182,697 |
This Rust project enables communication with an R413D08 8 Channel Module using Modbus RTU/TCP from the command line. It should also work with the R421A08 relay card because it has the same Modbus commands.
To use this tool, you need:

For more detailed information, please refer to the official datasheets available in the docs/ directory:
| Feature | Details |
|---|---|
| Operating Voltage | 5V DC (5V version) or 6-24V DC (12V version) |
| Operating Current | 10-15mA |
| Baud Rates | 9600 |
| Data Format | N, 8, 1 (No parity, 8 data bits, 1 stop bit) |
| Communication Protocol | Modbus RTU/TCP |
Ensure you have the following dependencies installed before proceeding:
git clone https://github.com/acpiccolo/R413D08-Controller.git
cd R413D08-Controller
cargo build --release
The compiled binary will be available at:
target/release/relay
cargo install --path .
This installs relay to $HOME/.cargo/bin, making it accessible from anywhere.This tool provides a range of commands for device discovery, configuration, and data acquisition.
You can connect to the relay module via Modbus RTU (serial) or TCP.
relay rtu --address 1 <COMMAND>
relay tcp 192.168.0.222:502 <COMMAND>
To see a full list of commands and options:
relay --help
relay tcp 192.168.0.222:502 status
# Turn on relay 0
relay rtu --address 1 on 0
# Turn off relay 3
relay rtu --address 1 off 3
This project can also be used as a library in your own Rust applications. It provides a high-level, thread-safe SafeClient for easy interaction with the R413D08 module, available in both synchronous and asynchronous versions.
Here's a quick example of how to use the synchronous SafeClient to read relay statuses over a TCP connection.
First, add the required dependencies to your project:
cargo add R413D08@0.3 --no-default-features --features "tokio-tcp-sync,safe-client-sync,serde"
cargo add tokio-modbus@0.16
cargo add tokio@1 --features full
use r413d08_lib::{
protocol::{Address, Port},
tokio_sync_safe_client::SafeClient,
};
use tokio_modbus::client::sync::tcp;
use tokio_modbus::Slave;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Connect to the device and create a stateful, safe client
let socket_addr = "192.168.1.100:502".parse()?;
let ctx = tcp::connect_slave(socket_addr, Slave(*Address::default()))?;
let client = SafeClient::new(ctx);
// Use the client to interact with the device
client.set_port_open(Port::try_from(0)?)?;
let status = client.read_ports()?;
println!("Successfully turned on relay 0. Current status: {}", status);
Ok(())
}
For more advanced use cases, the library also provides low-level, stateless functions in the r413d08_lib::tokio_sync and r413d08_lib::tokio_async modules.
This crate uses a feature-based system to minimize dependencies. When using it as a library, you should disable default features and select only the components you need.
default: Enables bin-dependencies, intended for compiling the relay command-line tool.tokio-rtu-sync: Synchronous (blocking) RTU client.tokio-tcp-sync: Synchronous (blocking) TCP client.tokio-rtu: Asynchronous (non-blocking) RTU client.tokio-tcp: Asynchronous (non-blocking) TCP client.safe-client-sync: A thread-safe, stateful wrapper for synchronous clients.safe-client-async: A thread-safe, stateful wrapper for asynchronous clients.serde: Implements serde::Serialize and serde::Deserialize for protocol structs.
bin-dependencies: All features required to build the relay binary.
Licensed under either of:
at your option.