Raspberry Pi Modbus GUI Installation &
Usage Guide
1. Prerequisites
- Raspberry Pi with Ethernet or USB-Ethernet
- Ethernet cable to Liebert IS-Unity card
- Raspberry Pi OS installed
- Python 3.9+ (default in Raspberry Pi OS)
- Monitor/keyboard or SSH access
- Internet connection for setup
2. Network Configuration
Configure Pi’s Ethernet interface to communicate with IS-Unity card at IP [Link].
Edit [Link]:
sudo nano /etc/[Link]
Add at the bottom:
interface eth0
static ip_address=[Link]/16
static routers=[Link]
static domain_name_servers=[Link]
Save and reboot with:
sudo reboot
Test connection:
ping [Link]
3. Install Required Python Libraries
Update and install:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-tk
pip3 install pymodbus
4. Create the Modbus GUI Script
1. Create folder and enter:
mkdir ~/modbus_gui
cd ~/modbus_gui
2. Create Python file:
nano modbus_gui.py
3. Paste the following code:
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
from [Link] import ModbusTcpClient
IP = "[Link]"
PORT = 502
UNIT_ID = 1
client = ModbusTcpClient(IP, port=PORT)
def read_registers():
reg_type = type_var.get()
try:
start = int(start_entry.get())
end = int(end_entry.get())
except ValueError:
[Link]("Error", "Invalid start/end register")
return
count = end - start + 1
[Link](*tree.get_children())
try:
if reg_type == "Input":
rr = client.read_input_registers(start, count, unit=UNIT_ID)
if [Link](): raise Exception(rr)
for i, val in enumerate([Link]):
[Link]("", "end", values=(f"R{start+i}", val, "Read-Only"))
elif reg_type == "Holding":
rr = client.read_holding_registers(start, count, unit=UNIT_ID)
if [Link](): raise Exception(rr)
for i, val in enumerate([Link]):
[Link]("", "end", values=(f"R{start+i}", val, "Editable"))
elif reg_type == "Coils":
rr = client.read_coils(start, count, unit=UNIT_ID)
if [Link](): raise Exception(rr)
for i, val in enumerate([Link]):
[Link]("", "end", values=(f"C{start+i}", int(val), "Editable"))
except Exception as e:
[Link]("Read Error", str(e))
def write_selected():
selected = [Link]()
if not selected:
return
reg_type = type_var.get()
for sel in selected:
reg, val, mode = [Link](sel, "values")
addr = int(reg[1:])
new_val = [Link]("Write Value", f"Enter new value for {reg}:")
if new_val is None:
continue
try:
if reg_type == "Holding":
client.write_register(addr, new_val, unit=UNIT_ID)
elif reg_type == "Coils":
client.write_coil(addr, bool(new_val), unit=UNIT_ID)
[Link](sel, values=(reg, new_val, mode))
except Exception as e:
[Link]("Write Error", str(e))
root = [Link]()
[Link]("Modbus GUI - Select Range")
[Link](root, text="Start").grid(row=0, column=0)
start_entry = [Link](root); start_entry.grid(row=0, column=1)
[Link](root, text="End").grid(row=0, column=2)
end_entry = [Link](root); end_entry.grid(row=0, column=3)
type_var = [Link](value="Input")
[Link](root, textvariable=type_var, values=["Input","Holding","Coils"]).grid(row=0,
column=4)
[Link](root, text="Read", command=read_registers).grid(row=0, column=5)
[Link](root, text="Write Selected", command=write_selected).grid(row=0, column=6)
tree = [Link](root, columns=("Register", "Value", "Mode"), show="headings")
[Link]("Register", text="Register")
[Link]("Value", text="Value")
[Link]("Mode", text="Mode")
[Link](row=1, column=0, columnspan=7, sticky="nsew")
[Link]()
5. Run the Application
To run the GUI:
python3 ~/modbus_gui/modbus_gui.py
6. Auto-Start at Boot (Optional)
Create a systemd service:
sudo nano /etc/systemd/system/modbus_gui.service
Add:
[Unit]
Description=Modbus GUI
After=[Link]
[Service]
ExecStart=/usr/bin/python3 /home/pi/modbus_gui/modbus_gui.py
WorkingDirectory=/home/pi/modbus_gui
Restart=always
User=pi
[Install]
WantedBy=[Link]
Enable with:
sudo systemctl enable modbus_gui.service
sudo systemctl start modbus_gui.service