If you like this, a small donation is appreciated:
RustyMeter is a GUI application written in Rust powered by the awesome egui framework and builds on the work of @TheHWCave to turn your OWON XDM or Victor multimeter — and now also a Kiprim DC / Owon SPE power supply — into a PC-based powerhouse with neat graphing, recording or using it on stream. On top it is now also AI native with an optional MCP server you can turn on to have your favorite AI assist you in your hardware projects.
Meters which have been confirmed working already:
- Owon XDM1041/XDM1241
- Owon XDM1051/XDM1251
- Owon XDM2041
- Owon XDM3041
- Owon XDM3051
- Victor 86 series
Power supplies:
- Kiprim DC620S (Owon SPE SCPI dialect; other SPE / Kiprim DC models should work)
Looking for testers for further Owon SPE/Kiprim PSUs
OWON XDM1041 — live graph and histogram
Kiprim DC620S — live V/I/P, setpoints, output and macros
On OWON SCPI meters and SPE/Kiprim PSUs you can store sequences of commands: play them on connect after the settings bootstrap, or click them as buttons on the main window. Victor read-only connections have no macros.
- Menu → SCPI macros opens the editor. Add, duplicate, delete, and reorder entries. If several macros are set to run on connect, they run in list order.
- Record macro (next to Start Recording) captures the SCPI you send from the UI (mode, range, rate, beeper, thresholds). Click again to stop; a new macro is created from that capture.
- Insert current setup appends the live
CONF/RATE(and beeper or threshold when relevant) into the body. Run now sends the selected macro to the meter immediately. - Editor — name; which meters it applies to (all SCPI, MEAS-era Owon, XDM 6000, this model, or an IDN substring); run on connect after bootstrap; show as a button on the main window; and the SCPI body. One command per line (
;also splits).#or//start a comment. Queries (…?) are ignored. - Main-window buttons — macros marked “show as button” that match the connected meter appear under the mode grid. Short names take one cell; longer names snap to two cells. The row wraps after four columns.
Each window keeps its own settings. The settings you already had are the Default profile.
The profile combo sits on the connection row, next to the serial port. It loads another profile only while the instrument is disconnected, and it greys out while a connection is open. Save as… writes the current settings under a new name and does not send them to the meter or the supply. Manage… deletes a profile that no window has open. Default stays, because a new window copies it.
Menu → New window, or launching RustyMeter again, opens another window. It cannot take a profile that is already open. When Default is in use, the new window starts from those settings, stays disconnected, and asks you to pick a profile or save a new one. --profile NAME or RUSTY_METER_PROFILE opens a named profile directly.
RustyMeter can serve the open window to an MCP client. The agent reads the same session the graph is drawing, and control commands go through the same buttons and sliders, so a person watching the window sees the change. Each profile keeps its own agent port.
- Menu → Agent. Turn on Listen for an agent on 127.0.0.1. The default port is
9741. - Allow agent control is separate and defaults off. Leave it off for read-only access. Turn it on before an agent may change mode, range, rate, a PSU setpoint, the output, or run a macro.
- Register the
rusty-meter-mcpbinary with the client. It speaks MCP on stdin/stdout and forwards each tool call to the open app.RUSTY_METER_AGENTor--endpoint host:portselects the socket when it is not127.0.0.1:9741.
Tools: get_session, get_reading, get_trace, get_history, get_recording, set_mode, set_range, set_rate, set_psu_voltage, set_psu_current, set_psu_limits, set_output, run_macro. get_trace matches the graph and clears on a mode change. get_history keeps samples across that change. Victor connections stay read-only. The listener is loopback only.
Eventually, as this is all SCPI based (except the Victor driver), it could also be extended to other meters that have SCPI interfaces. Maybe some stuff even works out of the box.
NOTE: This is work in progress and I have more features for this in mind. What works right now is connecting to an OWON XDM or Victor meter, switching modes and ranges as well as sampling rates, driving a Kiprim DC / Owon SPE PSU (setpoints, output, live V/I/P), SCPI macros on Owon meters and those PSUs, graphing for a configurable amount of last samples, and recording samples to CSV, XLSX and JSON.
TODO:
- math modes
- code refactoring for easier integration of other meters
- make serial parameters changeable
You can clone this repository and just run cargo build --release, provided you have rust installed (use rustup, it's easy).
The Releases section has automatically built releases for Mac ARM64 and x86_64, Windows 11 x86_64 and Linux x86_64.
For Windows, if you do not have it from another application, you might need to install the ch340 serial driver. (Owon has it in their application installer package, it can also be found directly on the WCH manufacturer webpage)
The pre-built binaries might not run on Windows 10 if the installation is not up to date. In this case you might need to compile from source.
Mac and Linux ship the driver per default. On Linux, you might need to configure udev-rules or make sure you are in the proper serial user group to access serial devices. (google for your distribution what the proper group is)
Mac might require you to explicitly trust the application/binary in the system settings after first launch. Gatekeeper requires a signed binary and I have no way of obtaining this signature for such an open source project.
Technically, a multimeter is not an oscilloscope. So even though you get a nice time-graph of your measurements, keep in mind the meter measures values much more accurately, but also wayyyyyyy slower compared to an oscilloscope, so the bandwidth is very, VERY small. So if you need to pick up any type of logic or analog signals that are not at least semi-static: Use a logic analyzer or proper scope.



