Skip to content

Repository files navigation

Lazy Engineer’s PSU Remote

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)

Features

  • 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

Requirements and Usage

  • Python 3.7+ (Maybe an older version would work)
  • Dependencies:
    pip install pyserial ttkbootstrap
  • usage:
    python main.py agilent364xa

Project Structure 🏗️

  • 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

Power Supply Plugin API Specification

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]: ...

Future Improvements

1. Multi-Communication Interface

To support LAN (Ethernet), GPIB via PyVISA, USB, and Serial in a unified way, the API provides a consistent interface for all connection types.

2. Plugins

  • Add DPS-4005PFC support (no promises on timeline)
  • Your PSU model here (Plugin service: You ship it, I keep it, we both win)

3. Millcellenous

  • Panic button for when the magic smoke appears
  • Make an exe version

Lizenz

MIT License – feel free to use, modify & share! © Al_Niz – 2025

About

The app supports plugins for different power supplies, starting with the Agilent 364xA series.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages