My Agilent E3643A lives Miles away on a shelf, just out of reach with a rebellious knob that jumps randomly when turned. I’m electrical engineer not fitness enthusiast. Adjusting voltages or turning the output On/Off shouldn’t require getting up.
This is a simple yet flexible Python-Tkinter GUI for controlling programmable lab power supplies via serial interfaces. Built to save your knees and your patience. Modular and plugin-ready
I created this program to:
- Control my lab power supply without standing up (because standing is cardio)
- Patiently awaiting the Agilent knob's epiphany
- Save myself from unnecessary shelf-climbing workouts
- Bonus: My cheap DPS-4005PFC will get support... eventually (if I don't procrastinate harder)
- Plugin System: Modular plugin system for different PSU models
- Modern GUI: Built with tkinter and ttkbootstrap for a dark-themed interface
- Real-time Monitoring: Live voltage/current monitoring, so I don't have to squint at the PSU display
- Safe Operation: Should automatically turning off output when closing the application
- Error Handling: Automatic safety shutdown because I might forget
- Python 3.7+ (Maybe an older version would work)
- Dependencies:
pip install pyserial ttkbootstrap
- usage:
python main.py agilent364xa
-
main.py 🧠 The Brain
Dynamically loads plugins and launches the GUI -
main_gui.py 🖥️ The Face
Contains all GUI elements where the magic (laziness) happens -
agilent364xa.py 🔌 Agilent E3643A Plugin
Talks to your moody Agilent PSU (with its rebellious encoder knob) -
run_gui_agilent364xa.bat 🚀 One-Click Launcher
No typing needed just double-click to run python main.py agilent364xa
All power supply plugins (see e.g. agilent364xa.py) must implement the following "interface":
class PowerSupply: # Mandatory class name, do not change
def __init__(self, port: str): ...
def connect(self): ...
def disconnect(self): ...
def is_connected(self) -> bool: ...
def set_voltage(self, voltage: float): ...
def set_current(self, current: float): ...
def get_voltage(self) -> float: ...
def get_current(self) -> float: ...
def enable_output(self): ...
def disable_output(self): ...
def toggle_output(self) -> str: ... # Returns "ON" or "OFF"
def check_errors(self) -> list[str]: ...To support LAN (Ethernet), GPIB via PyVISA, USB, and Serial in a unified way, the API provides a consistent interface for all connection types.
- Add DPS-4005PFC support (no promises on timeline)
- Your PSU model here (Plugin service: You ship it, I keep it, we both win)
- Panic button for when the magic smoke appears
- Make an exe version
MIT License – feel free to use, modify & share! © Al_Niz – 2025